最简单的内核模块加载与卸载
时间:2010-12-05 来源:ohmytime
#include <linux/module.h> |
简要说明一下:
有两个很关键的函数:module_init(hello_init); module_exit(hello_exit); 他们必须要有的。
2、编写Makefile
ifneq ($(KERNELRELEASE),) |
简要说明:
- obj-m :=hello.o 是说明要根据hello.c生成 hello.o内核模块,一般你的c文件是什么名字这就照着来
- KDIR:= /lib/modules/2.6.18-194.el5/build 这里是内核的目录。你可以输入 uname -r 查看一下你的内核是什么,要对应起来的,要不然你无法在你的Linux上加载和卸载你要编译的模块。
- make -C $(KDIR) M=$(PWD) modules 这句是在当前目录编译,不用管它。
- insmod hello.ko 这句是可选的,意思是你输入 make install 的时候,会加载你的hello.ko内核模块,当然,你也可以在make后,手动做这件事。
- rmmod hello 这句参考上条解释。
在工程目录下输入
#make |
4、注意问题:
注意源代码里的这句话:
printk(KERN_EMERG "hello exit!\n") |
[root@localhost 4-1-4]# cat /proc/sys/kernel/printk |
我的电脑是RHEL5,显示的是 6 4 1 7。 简单来说就是printk的每条信息都是带有优先级的,数字越大,优先级越低。现在是数字小于6的都可以在x-term下打印。例如:
printk("<5>hello world ! \n"); |
- 这两个信息都可以在我的终端打印出来,也就是5 和 0 都小于6 。注意<5>一定要在双引号“ ”里面。
- 还有就是,在我的emacs下面运行终端,printk无法信息,优先级为<0>也不管用,不知道为什么,但是切换到linux自带的终端就行了。有知道的朋友麻烦告诉我一下。
- 解决的办法是你可以查看log信息
cat /var/log/messages | grep 关键词(比如你加载的内核模块的名字) |
应该就可以看到printk的信息了。