ubuntu12.04 编译第一个hello world模块!

在把自己的内核升级到了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_init相当于常见程序中的main()函数,是程序的入口,会调用hello_init()函数;

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.*

关于Makefile文件的写法,特别要强调一点:


命令行以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.

ubuntu12.04 编译第一个hello world模块!_第1张图片

当我将模块移除后,输入dmesg命令,也出现了问题,如图:

ubuntu12.04 编译第一个hello world模块!_第2张图片

可以看见他先进入了hello_init,后执行的hello_exit函数。移除模块,不应该是只执行hello_exit函数吗?

查了一下这条报错ICMPv6 RA: ndisc_router_discovery() failed to add default route.中文网站上基本上没什么内容,国外网站上好像也有人将这个错误作为BUG反映到ubuntu的官方网站上,也不知到这因为版本问题出现的Bug还是因为因为我还有什么地方没注意,产生的问题。


欢迎各位大侠指点指点。

你可能感兴趣的:(ubuntu12.04 编译第一个hello world模块!)