一、背景
最近学习linux内核的东西,尝试去编写一个简单的内核模块。内核模块对于编写的格式要求是十分苛刻的。所以在编写、运行的过程中碰到了许多“坑“,就在此以作记录。
二、编写的简单的内核模块程序
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>
static int __init lkp_init(void)
{
printk("<1>Hello,World!from the kernel space...\n");
return 0;
}
static void __exit lkp_cleanup(void)
{
printk("<1>Goodbye,World!leaving kernel space...\n");
}
module_init(lkp_init);
module_exit(lkp_cleanup);
MODULE_LICENSE("GPL");
三、编写的Makefile文件
obj-m += test.o
CURRENT_PATH:=$(shell pwd)
LINUX_KERNEL:=$(shell uname -r)
LINUX_KERNEL_PATH := /usr/src/kernels/$(LINUX_KERNEL)
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
四、碰到的问题
1、test.c中比较容易犯错的地方
首先是这个init与exit前面不是一个下划线,而是两个下划线。
而且要注意print后跟的是k,不可以习惯性的打成f了。
2、Makefile中比较容易犯错的地方
这里共有四处是要特别注意的,比较容易犯错的地方。而且如果没有注意到的同学往往自己检查起来也很难查到出错的原因。
首先,obj与-m中间没有空格。
其次,右上角的框框里是你的模块程序的名字后加.o。比如我这里模块程序的名字叫test.c,于是我这里是test.o
接下来,两个make的前面是一个TAB键,绝对不可以使用其他比如空格之类的来在形式上进行替代。
最后,$符号前面与M=之间没有空格,必须紧密相连。
五、总结
我这里只就讲了一些初次接触内核模块编程遇到的小问题,总之,内核模块的编程不同于一般的C语言或其他的语言编程,它能更加苛刻一些。
至于如何插入模块,如何删除模块这里也就不赘述了。