linux内核模块编译

示例程序

1. 编写c语言程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("THE_FLY");
MODULE_DESCRIPTION("Hello World Kernel Module");

static int __init hello_init(void)
{
printk(KERN_INFO "Hello, World!\n");
return 0;
}

static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye, World!\n");
}

module_init(hello_init);
module_exit(hello_exit);

2. 编写Makefile文件:

1
2
3
4
5
6
7
8
9
ifneq ($(KERNELRELEASE),)
obj-m :=hello.o
else
KDIR :=/lib/modules/$(shell uname -r)/build
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order
endif

3. 执行命令:

1
make

4. 安装模块:

1
insmod hello.ko

如果安装失败,查看内核配置是否开启了CONFIG_MODULE_SIG配置,如果开启了需要对内核模块进行签名后才可以安装

5. 检查:

1
2
lsmod | grep hello
dmesg | grep hello

6. 卸载模块:

1
rmmod hello

可能出现的问题

如果出现如下问题:

很有可能是make没有识别到obj-m,如果是linux内核自带的模块,Makefile文件一般是obj-$(配置名),如果没有检测到配置名,那这个模块就会被忽略掉不编译,所以如果想让他识别到只能重新配置内核配置并编译,或者直接硬编码,修改Makefile为obj-m即可


linux内核模块编译
http://example.com/2025/05/22/linux内核模块编译/
作者
凌云行者
发布于
2025年5月22日
许可协议