一、安装linux内核头文件
yum install kernel-devel.x86_64
安装完成后头文件被放置在目录(因系统不同而不同):/usr/src/kernels/3.10.0-1062.4.3.el7.x86_64
二、编写模块代码
在任一目录下新建文件hello_module.c,内容如下:
#include <linux/init.h>
#include <linux/module.h>
static int __init hello_init(void)
{
printk("---------my %s---------\n", __FUNCTION__);
return 0;
}
static void __exit hello_exit(void)
{
printk("---------my %s---------\n", __FUNCTION__);
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
三、编写Makefile
在和hello_module.c同级目录下创建Makefile文件,内容如下:
KERNEL_DIR=/usr/src/kernels/3.10.0-1062.4.3.el7.x86_64
CUR_DIR=$(shell pwd)
obj-m = hello_module.o
build:
make -C $(KERNEL_DIR) M=$(CUR_DIR) modules
clean:
make -C $(KERNEL_DIR) M=$(CUR_DIR) clean
load:
insmod hello_module.ko
unload:
rmmod hello_module.ko
其中KERNEL_DIR变量指向内核头文件目录。
四、编译
运行make编译:
[work@vm kernel]$ make
make -C /usr/src/kernels/3.10.0-1062.4.3.el7.x86_64 M=/home/work/test/kernel modules
make[1]: 进入目录“/usr/src/kernels/3.10.0-1062.4.3.el7.x86_64”
CC [M] /home/work/test/kernel/hello_module.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/work/test/kernel/hello_module.mod.o
LD [M] /home/work/test/kernel/hello_module.ko
make[1]: 离开目录“/usr/src/kernels/3.10.0-1062.4.3.el7.x86_64”
编译后当前目录内文件包含:
[work@vm kernel]$ ll
总用量 220
-rw-rw-r--. 1 work work 320 11月 20 20:45 hello_module.c
-rw-rw-r--. 1 work work 102144 11月 20 20:53 hello_module.ko
-rw-rw-r--. 1 work work 856 11月 20 20:53 hello_module.mod.c
-rw-rw-r--. 1 work work 58768 11月 20 20:53 hello_module.mod.o
-rw-rw-r--. 1 work work 44944 11月 20 20:53 hello_module.o
-rw-rw-r--. 1 work work 275 11月 20 20:43 Makefile
-rw-rw-r--. 1 work work 46 11月 20 20:53 modules.order
-rw-rw-r--. 1 work work 0 11月 20 20:53 Module.symvers
查看模块信息:
[work@vm kernel]$ modinfo hello_module.ko
filename: /home/work/test/kernel/hello_module.ko
license: GPL
retpoline: Y
rhelversion: 7.7
srcversion: D105845B0514D2D8892F4A0
depends:
vermagic: 3.10.0-1062.4.3.el7.x86_64 SMP mod_unload modversions
五、加载和卸载
运行sudo make load加载:
[work@vm kernel]$ sudo make load
insmod hello_module.ko
运行sudo make unload卸载:
[work@vm kernel]$ sudo make unload
rmmod hello_module.ko
查看系统日志文件:/var/log/messages
[root@vm work]# tail -f /var/log/messages
Nov 20 20:55:31 vm kernel: ---------my hello_init---------
Nov 20 20:56:07 vm kernel: ---------my hello_exit---------