在把自己的内核升级到了3.4.38之后,接下来的一个工作就是编译第一个模块喽!在网上也看到不少的类似的帖子,但是自己跟着做的时候,还是出现了很多问题,觉得有必要记录下来,望和我一样的初学者多多留意,不要和我犯同样的错误。话不多说,直接开始吧!
配置:ubuntu 12.04内核为3.4.38。
第一步 选择一个文件路径下创建两个文件。
/yourpath/hello.c
/yourpath/Makefile
我的hello.c文件如下:
#include<linux/init.h> #include<linux/module.h> #include<linux/kernel.h> MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("MDAXIA"); static int __init hello_init(void) { printk(KERN_ALERT "Hello world!\n"); return 0; } static void __exit hello_exit(void) { printk(KERN_ALERT "Goodbye,cruel world!"); } module_init(hello_init); module_exit(hello_exit);
module_exit是程序的出口,会调用hello_exit()函数。
module_init和module_exit函数都是一个内核程序中所必须的。
废话有点多了,大家都应该知道的。o(∩∩)o...哈哈
Makefile文件如下:
obj-m :=hello.o KDIR?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) all: $(MAKE) -C $(KDIR) M=$(PWD) clean: rm -rf *.o *.ko .depend *.mod.o *.mod.c Module.* modules.*
命令行以tab键开始,否则是不能识别的,而且会出现以下两个问题:
1 Makefile:9: *** missing separator. Stop.
2 make: Nothing to be done for `all'.
其中,若clean下面一行没加tab键,出现第一个问题,all下面一行没加tab键,会出现第二个问题。大家不要像我一样,犯这么傻傻的问题哦!!
第二步
进入yourpath:
1 输入命令 sudo make。若不是第一次编译,make之前,请输入sudo make clean命令,清除以前编译产生的一系列文件。
在make 命令执行完后,可以看见在yourpath目录下,多出了hello.ko之类的一些文件;
2 输入命令
sudo insmod ./hello.ko
3 键入dmesg命令,可以看到hello world打印出来的信息;
4 键入sudo rmmod ./hello命令删除hello模块后,再键入dmesg命令,可以看见打印出来的Goodbye,cruel world!
【后记】在我将模块成功插入后,输入dmesg命令后,出现了很多条这样的提示:
ICMPv6 RA: ndisc_router_discovery() failed to add default route.
当我将模块移除后,输入dmesg命令,也出现了问题,如图:
可以看见他先进入了hello_init,后执行的hello_exit函数。移除模块,不应该是只执行hello_exit函数吗?
查了一下这条报错ICMPv6 RA: ndisc_router_discovery() failed to add default route.中文网站上基本上没什么内容,国外网站上好像也有人将这个错误作为BUG反映到ubuntu的官方网站上,也不知到这因为版本问题出现的Bug还是因为因为我还有什么地方没注意,产生的问题。
欢迎各位大侠指点指点。