3.11. 编译自定义的内核模块
您可以根据硬件和软件级别的各种配置的要求构建一个采样内核模块。
先决条件
kernel-devel
、gcc
和elfutils-libelf-devel
软件包已安装。dnf install kernel-devel-$(uname -r) gcc elfutils-libelf-devel
# dnf install kernel-devel-$(uname -r) gcc elfutils-libelf-devel
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 您有 root 权限。
-
您创建了
/root/testmodule/
目录,在此编译自定义的内核模块。
步骤
创建包含以下内容的
/root/testmodule/test.c
文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow test.c
文件是一个源文件,其向内核模块提供主要功能。出于组织需要,该文件已创建在专用的/root/testmodule/
目录中。在模块编译后,/root/testmodule/
目录将包含多个文件。test.c
文件包含来自系统库的文件:-
示例代码中的
printk()
函数需要linux/kernel.h
头文件。 -
linux/module.h
文件包含函数声明和用 C 编程语言编写的在多个源文件之间共享的宏定义。
-
示例代码中的
-
按照
init_module ()
和cleanup_module ()
函数启动和结束内核日志记录函数printk ()
,后者会打印文本。 使用以下内容创建
/root/testmodule/Makefile
文件。obj-m := test.o
obj-m := test.o
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Makefile 包含编译器的说明,以生成名为
test.o
的对象文件。obj-m
指令指定生成的test.ko
文件将编译为可加载的内核模块。或者,obj-y
指令可指示将test.ko
作为内置内核模块构建。编译内核模块。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编译器将它们链接成最终内核模块(
test.ko
)之前,会为每个源文件(test.c)
创建一个对象文件(test.c
)来作为中间步骤。成功编译后,
/root/testmodule/
包含与编译的自定义内核模块相关的其他文件。已编译的模块本身由test.ko
文件表示。
验证
可选:检查
/root/testmodule/
目录的内容:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将内核模块复制到
/lib/modules/$(uname -r)/
目录中:cp /root/testmodule/test.ko /lib/modules/$(uname -r)/
# cp /root/testmodule/test.ko /lib/modules/$(uname -r)/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更新模块依赖项列表:
depmod -a
# depmod -a
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 载入内核模块:
modprobe -v test
# modprobe -v test insmod /lib/modules/5.14.0-1.el9.x86_64/test.ko
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证内核模块是否成功载入:
lsmod | grep test
# lsmod | grep test test 16384 0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从内核环缓冲中读取最新的消息:
dmesg
# dmesg [74422.545004] Hello World This is a test
Copy to Clipboard Copied! Toggle word wrap Toggle overflow