程序媛&程序猿云计算技术我用 Linux

Linux内核模块的加载和卸载实验

2017-03-24  本文已影响252人  SophieSg

linux提供了module机制,能够动态的加载内核模块。本实验在centOS7下执行。

hello kernel代码

hello.c

#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>

static int __init hello_init(void)
{
        printk("<1>Hello Kernel!\n"); /*立即输出信息*/
        return 0;
}

static void __exit hello_cleanup(void)
{
        printk("<1>See you,Kernel!\n");
}

module_init(hello_init);        /*进入内核的时候,调用hello_init        */
module_exit(hello_cleanup);     /*离开内核的时候,调用hello_cleanup     */
MODULE_LICENSE("GPL");          /*协议*/

Makefile

obj-m += hello.o                         #由此目标文件生成模块 
CURRENT_PATH := $(shell pwd)             #当前所在的路径
LINUX_KERNEL := $(shell uname -r)        #内核的版本号

#内核代码所在的路径    
LINUX_KERNEL_PATH := /usr/src/kernels/$(LINUX_KERNEL)

#编译
all:
  make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules   

#清除编译生成的文件
clean:
  make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean

执行make

[root@controller hello]# make
make -C /usr/src/kernels/3.10.0-514.10.2.el7.x86_64         M=/usr/src/kernels/3.10.0-514.10.2.el7.x86_64/hello              modules   
make[1]: Entering directory `/usr/src/kernels/3.10.0-514.10.2.el7.x86_64'
  CC [M]  /usr/src/kernels/3.10.0-514.10.2.el7.x86_64/hello/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /usr/src/kernels/3.10.0-514.10.2.el7.x86_64/hello/hello.mod.o
  LD [M]  /usr/src/kernels/3.10.0-514.10.2.el7.x86_64/hello/hello.ko
make[1]: Leaving directory `/usr/src/kernels/3.10.0-514.10.2.el7.x86_64'

执行insmod加载内核模块

sudo insmod hello.ko

lsmod 可以查看到自己的模块

lsmod | grep hello

dmesg可以看到打印的log

[root@controller hello]# dmesg | tail -1
[88012.521835] <1>Hello Kernel!

执行rmmod卸载内核模块

sudo rmmod hello.ko

dmesg可以看到打印的log

[root@controller hello]# dmesg | tail -1
[88108.264491] <1>See you,Kernel!
上一篇下一篇

猜你喜欢

热点阅读