[问题]在ubuntu下如何编译一个简单的驱动程序

内核编译和嵌入式产品的设计与开发
回复
王谋先
帖子: 4
注册时间: 2008-08-16 15:49

[问题]在ubuntu下如何编译一个简单的驱动程序

#1

帖子 王谋先 » 2008-08-16 15:55

我是一个初学者,我的简单驱动hell.c如下:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");

static int __init hello_init(void)
{
printk("Hello module init\n");
return 0;
}

static void __exit hello_exit(void)
{
printk("Hello module exit\n");
}


module_init(hello_init);
module_exit(hello_exit);


我的编译命令如下:
gcc -D__KERNEL__ -DMODULE -DLINUX -I /usr/src/linux-headers-2.6.22-14/include -c hello.c -o hello

不知道为什么就是不行,请高手指点一点一下。
头像
HuntXu
帖子: 5776
注册时间: 2007-09-29 3:09

#2

帖子 HuntXu » 2008-08-16 18:01

报什么错...
HUNT Unfortunately No Talent...
王谋先
帖子: 4
注册时间: 2008-08-16 15:49

#3

帖子 王谋先 » 2008-08-17 9:01

摘录地方:http://www.cnitblog.com/stonestar/archi ... 17634.aspx



准备工作做好了,我们开始写第一个内核程序(假定开发环境是ubuntu linux2.6,以前一直在linux2.4下开发linux驱动,转到2.6下才发现很多东东都变了)。我们Hello world内核程序有两个文件组成,一个Makefile,另一个是test.c。
test.c内容如下:
1 #include <linux/init.h>
2 #include <linux/kernel.h>
3 #include <linux/module.h>
4
5 static int __init eth_init(void)
6 {
7 printk("init module\n");
8 return 0;
9 }
10 static void __exit eth_exit(void)
11 {
12 printk("exit modules\n");
13 }
14
15 module_init(eth_init);
16 module_exit(eth_exit);
Makefile内容如下:
PWD = $(shell pwd)
KERNEL_SRC = /usr/src/linux-source-2.6.15/
obj-m := test.o
module-objs := test.o
all:
$(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules
clean:
rm *.ko
rm *.o
注意千万不能从我这篇blog中通过复制粘贴Makefile内容去创建Makefile文件!!!我要下载源码test.tgz.zip,原文件名是test.tgz,请去掉后面的zip后解压。
在编译源码之前需要修改一下Makefile中的KERNEL_SRC,使其指向你的linux内核源码。修改完成后,在test.c和Makefile所在的目录下运行make,如果看到类似输出
make -C /usr/src/linux-source-2.6.15/ M=/home/vmeth modules
make[1]: Entering directory `/usr/src/linux-source-2.6.15'
CC [M] /home/vmeth/test.o
Building modules, stage 2.
MODPOST
CC /home/vmeth/test.mod.o
LD [M] /home/vmeth/test.ko
make[1]: Leaving directory `/usr/src/linux-source-2.6.15'
OK,一个内核程序编译出来了,目录下多了一个test.ko。出现/usr/bin/ld: crt1.o: No such file: No such file or directory.这个错误怎么办?这个问题的原因是usr/lib/目录下缺少crt1.o。解决方法:安装libc6-dev。另外在编译这个程序之前最好先把内核编译一下(在内核源码所在的目录下执行make menuconfig,什么都不要修改退出,退出时会提示你是否要保存配置,选择保存,然后执行make,整个make过程需要很长时间,----我在make menuconfig时,好像提示缺少ncurses库,安装上libncurses就OK了)。

下一步就是运行这个程序了,在root用户下执行insmod ./test.ko。没有错误提示的话,这个程序就被执行了,运行一下dmesg,最后一行是不是可以看到init module字样。执行rmmod test;再运行dmesg,最后一行又出现了exit modules。这个内核程序目前只是打印了两行字,后续我将会扩充这个程序,完成一些有用的功能。
回复