在 Linux 内核中新增模块代码
目录
一个最简单的内核模块 #
编写一个最简单的内核模块 hellomod,源码 hellomod.c 如下:
#include <linux/init.h>
#include <linux/module.h>
static int __init hellomod_init(void)
{
	printk("hellomod init\n");
	return 0;
}
static void __exit hellomod_exit(void)
{
	printk("hellomod exit\n");
}
module_init(hellomod_init);
module_exit(hellomod_exit);
MODULE_LICENSE("GPL");
Makefile 文件如下:
KERDIR=/lib/modules/$(shell uname -r)/build
PWD=$(shell pwd)
obj-m:=hellomod.o
default:
	make -C ${KERDIR} M=${PWD} modules
clean:
	make -C ${KERDIR} M=${PWD} clean
直接运行 make 即可将其编译为 hellomod.ko 。下面以该模块为例介绍添加到内核的步骤。
添加到内核 #
将一个模块源码添加到内核需要如下三个步骤:
1.将源码文件复制的相应的目录中 #
我们将 hellomod.c 复制到内核源码的 driver/char/ 目录下。
2.修改 Makefile 文件 #
在 driver/char/Makefile 文件中添加新的模块:
obj-$(CONFIG_HELLOMOD) += hellomod.o
其中 CONFIG_HELLOMOD 变量是在配置内核是确定的,通常可以取三个值:y 、n 、m 。其中 CONFIG_ 是固定的, HELLOMOD 是自定义的,但必须与 Kconfig 文件中的设置一致。
3.修改 Kconfig 文件 #
drivers/char/Kconfig 文件的基本结构如下:
menu "Characters devices"
config ...
...
source "drivers/char/ipmi/Kconfig"
...
endmenu
menu 和 endmenu 之间定义了一个 Characters devices 菜单。config 字段定义了一个模块选项,source 导入了一个外部的 Kconfig 。
在 menu 和 endmenu 之间添加:
config HELLOMOD
	tristate "hellomod"
	default m
	help
		just a module
HELLOMOD 与 Makefile 中定义的变量是一致的。tristate 设置的是显示在配置界面的条目,default 设置的是该配置的默认值。help 显示的是帮助内容。
如上修改之后,运行 make menuconfig ,就可以在 Device Drivers -> Character devices 中看到 <M>hellomod 。退出保存后可以在 .config 文件中看到 CONFIG_HELLOMOD=m 。
新增一个模块目录 #
如果要为 hellomod 新建一个单独的目录,可以按如下步骤完成:
1.新建目录并添加源文件 #
在 drivers/char/ 目录下新建 hellomod 目录,并将 hellomod.c 复制到该目录下。
2.添加 Makefile #
在 drivers/char/hellomod/ 目录下新建 Makefile 文件,内容如下:
obj-$(CONFIG_HELLOMOD) += hellomod.o
3.添加 Kconfig #
在 drivers/char/hellomod/ 目录下新建 Kconfig 文件,内容如下:
menu "hello module"
	config HELLOMOD
		tristate "hellomod"
		default m
		help
			just a module
endmenu
然后在上层目录 drivers/chars 的 Kconfig 文件中添加:
source drivers/char/hellomod/Kconfig