您的位置:首页 > 其它

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

2013-04-05 20:58 183 查看
在把自己的内核升级到了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.



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



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

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

欢迎各位大侠指点指点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: