Linux kernel module 内核模块
Linux内核模块是一种可以根据需要动态加载和卸载的代码,可以在不重启系统的情况下扩展内核功能。
这里演示一个最简单的内核模块的开发过程。
开发环境
内核模块开发需要内核头文件和Makefile等特定的依赖。Centos下为了解决依赖需要安装kernel-devel包,需要与内核版本一致,比如内核版本3.10.0-862.el7.x86_64,那么需要安装kernel-devel-3.10.0-862.el7.x86_64。
kernel-devel安装/usr/src/kernels/目录下。但系统在/lib/modules/3.10.0-862.el7.x86_64/source和/lib/modules/3.10.0-862.el7.x86_64/build两个位置有软链到合适版本的kernel-devel安装位置。因此需要指定路径时,我会使用/lib/modules/3.10.0-862.el7.x86_64/build。
代码样例
| 1 | 
 | 
module_init宏指定的函数在模块插入内核时运行。
module_exit宏指定的函数在模块被移出内核时运行。
| 1 | obj-m := hello.o | 
编译一下
| 1 | [huyu@centos1804 kernel-hello]$ make | 
编译完成后可以看到hello.ko
工具包
内核模块的加载、卸载等操作需要一系列命令工具支持,在centos7.5下属于kmod包。
- insmod 
 将模块插入到内核。- 1 
 2
 3- [huyu@centos1804 kernel-hello]$ sudo insmod hello.ko 
 [huyu@centos1804 kernel-hello]$ sudo tail -n 1 /var/log/messages
 Jul 9 12:45:17 centos1804 kernel: Hello world!
- lsmod 
 显示已经加载的内核模块。- 1 
 2
 3- [huyu@centos1804 kernel-hello]$ lsmod 
 Module Size Used by
 hello 12425 0
- rmmod 
 将模块移出内核。- 1 
 2
 3
 4- [huyu@centos1804 kernel-hello]$ sudo rmmod hello 
 [huyu@centos1804 kernel-hello]$ sudo tail -n 2 /var/log/messages
 Jul 9 12:45:17 centos1804 kernel: Hello world!
 Jul 9 12:47:37 centos1804 kernel: Goodbye world.
- modinfo 
 显示模块信息。- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11- [huyu@centos1804 kernel-hello]$ modinfo hello.ko 
 filename: /home/huyu/workspace/kernel-hello/hello.ko
 version: 0.1
 description: hello world
 author: <hyuuhit@gmail.com>
 license: GPL
 retpoline: Y
 rhelversion: 7.5
 srcversion: E48DBB5483D6F8CDDBCF041
 depends:
 vermagic: 3.10.0-862.el7.x86_64 SMP mod_unload modversions
- modprobe 
 可以完成其他命令工具的功能,更灵活。其他命令一般是modprobe的封装。
- depmod
 用于生成模块依赖相关的文件。我没有使用过。