示例程序
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. 执行命令:
4. 安装模块:
如果安装失败,查看内核配置是否开启了CONFIG_MODULE_SIG配置,如果开启了需要对内核模块进行签名后才可以安装
5. 检查:
1 2
| lsmod | grep hello dmesg | grep hello
|
6. 卸载模块:
可能出现的问题
如果出现如下问题:
很有可能是make没有识别到obj-m
,如果是linux内核自带的模块,Makefile文件一般是obj-$(配置名)
,如果没有检测到配置名,那这个模块就会被忽略掉不编译,所以如果想让他识别到只能重新配置内核配置并编译,或者直接硬编码,修改Makefile为obj-m
即可