浅谈linux驱动之-驱动的使用

来源:互联网 发布:bl网络电视剧 编辑:程序博客网 时间:2024/05/17 22:47

本文愚见,错误之处还望诸位海涵,并提出宝贵意见。

首先什么是驱动?

当时我老师问我的实话,我说是使能硬件的手段,后来群里的朋友各抒己见,大概如下:承上启下,上:操作系统 下:硬件;操作系统和硬件对话的工具...等等类似的说法。后来我问南大的一个教授,他说这个得分硬件驱动和软件驱动,我顿时hold不住了。搞学术的就是严谨啊。反正我对驱动的理解差不多就是用来让硬件工作的东西。大家能意会到就行,我们不那么严格。

以前裸机的时候,比如做一个LED的实验,我们都是直接操作寄存器的,比如我们有程序A和B,两个程序里面都有点灯的一个过程,其实呢,这时候,两个程序里面是有一段程序是重复的,也就是说,裸机里直接驱动硬件,有个问题就是软件复用性的问题。

我们这里谈到linux系统,其实linux不同于以往的vxworks,ucos等,linux驱动程序有自己的一套模板,我们并不能随意的更改或者发挥天马行空的想象来做程序猿,一旦离开了linux本身的一套模板,我们写出来的东西估计在里面就用不了了,当然,如果比起实时性,linux肯定是比不上vxworks了,所以呢,各种千秋吧。各种场合的不同的需求,比如我以前有客户做医疗上的五分类分析仪,那个对实时性要求特高,所以我们当时是百般劝说,客户也不是很愿意上系统,老担心出问题。

linux驱动分三类:

字符设备驱动:按字节来访问设备,字符驱动负责驱动字符设备,这样的驱动通常实现open,close,read,write系统调用。

块设备驱动:在unix下,块设备只能按照512字节或者1024,1536,2048等(以此类推)来访问,但在linux系统下,可以随意字节访问,也就是说,字符驱动和块设备驱动在linux系统下的差别仅仅在于驱动和内核接口的不同。

网络接口设备:任何网络事物都是通过一个网络接口来实行,这里有两个接口,大家平常见的也应该比较多,eth0,物理接口;lo(回环网络,就是自发自收的意思,这是一个软件接口)。

那我们有了驱动程序,得用来起来,那怎么用呢?

我们这里有两种方式:驱动模块的安装;直接编译进内核。

如果是选择驱动模块的安装的话,这里有个好处,减小内核的大小,需要用的时候,加载进内核,不需要用的时候,remove。

这里我详细讲下如何编译进内核

我这里用hello的程序做演示,把hello编译进内核。

代码如下

那这个hello.c程序写好了放在哪里呢,既然是驱动,那肯定是drivers里面咯,那drivers里面在我们怎么选择呢?那就按照实际情况啊,块设备的话就是放在block里面,字符设备就是放在char里面,我这里hello.c认为是字符设备,就放在了char里面,如图

那接下来我们需要修改kconfig,给内核加入hello

这里完全是依葫芦画瓢了。接下来我们在linux2.6.28下make menuconfig

大家看,hello已经被内核添加在配置里面了,选中之后,,退出保存

我们可以在隐藏文件.config里面看一下,是否选上了

果然OK了。接下来我们要修改makefile了,毕竟最后要编译出内核,所有的规则都是由makefile决定的。注意你的代码放在哪里就修改哪里的makefile

这里我要提一下,如果我们需要编译内核的,obj后面跟的就是Y,如果编译模块后面跟的及时M,如果没有就是N。

都修改好了之后,我们开始编译内核

这下估计需要编译不少时间啊。电脑属于小霸王了,跟了我4年的笔记本...伤不起啊...

这里就不给大家截图看结果了...我困了不行了...睡觉去了...

 有个小修改,那个hello.c程序,那个printf可能得改成printk,因为内核里面调试我记得好像都是用的printk。用printf可能出问题

感谢群里兄弟冷雨的指正,我一开始用的是用户空间的C程序,坑爹啊...后来换了。我也正好把结果截图

 

如图,hello的驱动已经编译进内核。

好了...吃点东西睡觉去了...饿了...