helloworld驱动怎么写

 我来答
匿名用户
2016-12-25
展开全部
ubuntu下我的第一个Hello World驱动今天是一个值得纪念的日子,我也不知道我花了多长时间才编译成功!在编写这个驱动的过程中,真的体会到驱动编程不是那么简单的~,现在有点小小的激动,真的,很不容易啊~我把整个过程在重复一遍吧! 在编写这个驱动的过程中参考了网上的很多文档,最终的结果是弄的我头都晕了,每个人写的都不一样,其实我现在还有一些概念不是很清楚。1:到底丫的什么是内核源码树?2:为什么要编译内核源码树?1:内核源码树我现在的理解就是整个linux内核源代码,它是编译驱动的前提。ubuntu系统默认情况下是没有的,内核源码树是要自己下载的。2:驱动最终以*.ko的形式生成,insmod的本质就是将ko文件与运行的内核进行链接的过程。类似于编译helloworld的链接过程。链接必然需要先进行编译,以便确定所需的外部符号(EXPORT_SYMBOLS)是否存在,因为有些符号(函数或全局变量)在内核中。在驱动中如果使用到这些符号,必须预留一个位置,insmod时进一步确定这些符号的具体位置(符号绑定)。如果内核都没有编译过,怎么知道这些符号有没有编入内核中Hello World驱动实现全过程1:首先要查看自己系统是使用的内核版本xiongyao@xiongyao-Lenovo:~$ uname -r3.2.0-34-generic-pae //我用的是ubuntu12.04版本的,比较高如果系统自动安装了源码。在/usr/src目录下面会有对应的使用的版本,我那个版本没有,我是自己下载的xiongyao@xiongyao-Lenovo:/usr/src$ lslinux-headers-3.2.0-34 linux-source-3.2.0(我下载的)linux-headers-3.2.0-34-generic-pae如果没有源码,查看一下可以下载的源码包(不要使用超级用户使用此命令,他会提示没有这个命令)#apt-cache search linux-sourcexiongyao@xiongyao-Lenovo:/usr/src$ apt-cache search linux-sourcelinux-source - linux kernel source with Ubuntu patcheslinux-source-3.2.0 - linux kernel source for version 3.2.0 with Ubuntu patches2:然后下载linux-source-3.2.0#sudo apt-get install linux-source-3.2.0下载完成之后,会在/usr/src下,文件名为linux-source-3.2.0.tar.bz2这个压缩包,解压之后就可以得到整个源代码# sudo tar jxvf linux-source-3.2.0.tar.bz2解压之后会生成一个新的目录/usr/src/linux-source-3.2.0,现在所有的源代码都在里面3:现在开始配置内核,有三种选择选择方式1:make oldconfig 2:make menuconfig 3:make xconfig我选择的是最快的配置原版的配置方法#sudo make oldconfig (如果配置的过程中出现问题,原因是因为你没有下载配置环境的那个依赖的库文件,可以自己下载)配置完成之后就要开始对内核进行编译了4:编译内核 #sudo make这个过程很漫长,建议去做做别别的事情吧~,我大概花了一个多小时,吃完晚饭回来就ok了#sudo make zImage编译内核的结果最终出现了几个错误,但最终对那个Hello World 没有造成影响执行结束之后,会在当前目录下面生成一个新的文件:vmlinux5:然后就是编译模块了#sudo make modules6:安装模块#sudo make modules_install执行结束之后,会在/lib/modules下生成一个新的目录/lib/modules/3.2.31/在随后的编译模块文件时,需要用到这个路径下的build目录。到这一不,内核就编译完成了 好了,下了很长时间的Hello World 程序现在终于可以派上用场了我的Hello World在/hoem/xiongyao/下面//hello.c#include<linux/init.h> //初始换函数#include<linux/kernel.h> //内核头文件#include<linux/module.h> //模块的头文件MODULE_LICENSE(Xiongyao BSD/GPL);static int hello_init(void){ printk(KERN_ALTERHello, world/n); //模块运行在内核态,不能使用用户态C库函数中的printf函数,而要使用printk函数//打印调试信息return 0;}static int hello_exit(void){printk(KERN_ALTERGoodbye,Hello world/n);}module_init(hello_init);module_exit(hello_exit);Makefile 文件obj-m:=hello.o //生成目标文件KERNELDIR:=/lib/modules/3.2.31/buildPWD :=$(shell pwd)modules:(这里要用一个tab键)$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesmodules(这里用一个tab键) $(MAKE) -C $(KERNELDIR)M=$(PWD) modules_install最好关键的一步到了,所有准备就绪,进入makefile的那个目录xiongyao@xiongyao-Lenovo:~$ sudo makemake -C /lib/modules/3.2.31/build M=/home/xiongyaomake[1]: 正在进入目录 `/usr/src/linux-source-3.2.0/linux-source-3.2.0' LD /home/xiongyao/built-in.o CC [M] /home/xiongyao/hello.o Building modules, stage 2. MODPOST 1 modules CC /home/xiongyao/hello.mod.o LD [M] /home/xiongyao/hello.komake[1]:正在离开目录 `/usr/src/linux-source-3.2.0/linux-source-3.2.0'上面证明已经成功了然后加载模块#sudo insmod ./hello.ko本应该会在终端显示hello,world 但是终端什么也没有显示(以后在去解决)查看加载模块#sudo lsmod 里面已经生成了hellohello 2560 0^_^,已经加载上了 删除模块#sudo rmmod hello那么程序的输出到底在哪里呢?在网上看到,如果不出现在终端,则会下进syslog中#cat /var/log/syslog grep world#Hello,world#Goodbye,linux world
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式