当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 3 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [问题]在ubuntu下如何编译一个简单的驱动程序
帖子发表于 : 2008-08-16 15:55 

注册: 2008-08-16 15:49
帖子: 4
送出感谢: 0 次
接收感谢: 0 次
我是一个初学者,我的简单驱动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

不知道为什么就是不行,请高手指点一点一下。


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-08-16 18:01 
头像

注册: 2007-09-29 3:09
帖子: 5773
送出感谢: 0 次
接收感谢: 3
报什么错...


_________________
HUNT Unfortunately No Talent...


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-08-17 9:01 

注册: 2008-08-16 15:49
帖子: 4
送出感谢: 0 次
接收感谢: 0 次
摘录地方:http://www.cnitblog.com/stonestar/archive/2006/10/04/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。这个内核程序目前只是打印了两行字,后续我将会扩充这个程序,完成一些有用的功能。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 3 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译