本文最后更新于 26 天前,其中的信息可能已经有所发展或是发生改变。
概述
linux提供了一种称为模块(Module)的机制,模块具有如下的特点
- 模块自身不被编译到内核映像中,从而不影响内核映像的大小
- 一旦模块被加载,模块和内核中的其他部分的功能完全一样
管理方式
- 显示当前装入的内核模块:
lsmod
- 显示模块信息:
modinfo module_name
- 显示所有模块的配置信息:
modprobe -c | less
- 显示某个模块的配置信息:
modprobe -c | grep module_name
- 显示一个装入模块使用的选项,可以使用
sysfsutils包中的systool(1)
systool -v -m module_name
- 显示模块的依赖关系:
modprobe --show-depends module_name
创建一个自己的内核模块
linux提供了一种外部模块构建方式,可以使外部模块与linux源码独立存放在不同的路径下
首先需要下载并编译一套linux代码,接着就可以创建自己的内核模块。这个独立模块的目录结构也非常的简单,重点在于Makefile的编写
demo
├── Makefile
└── demo.c
demo.c内容
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
#include <linux/init.h> /* Needed for the macros */
static int __init demo_init(void)
{
printk(KERN_INFO "Hello, world 2\n");
return 0;
}
static void __exit demo_exit(void)
{
printk(KERN_INFO "Goodbye, world 2\n");
}
module_init(demo_init);
module_exit(demo_exit);
Makefile内容
obj-m += demo.o
KERNELBUILD += /home/pi/code/linux-5.4#这里的路径是一套已经编译完成的linux源码
all:
make -C ${KERNELBUILD} M=${shell pwd} modules
clean:
make -C ${KERNELBUILD} M=${shell pwd} clean
编译方式
这个独立模块的编译和清理方式和普通的模块并没有什么区别,只需要在自己的模块代码根目录下执行make all或者make clean就可以实现编译或清理
编译产物
在执行make all命令之后可以目录下多出了很多编译产物,其中就包括内核ko模块
demo
├── Makefile
├── Module.symvers
├── demo.c
├── demo.ko
├── demo.mod
├── demo.mod.c
├── demo.mod.o
├── demo.o
└── modules.order