红联Linux门户
Linux帮助

开发linux设备驱动程序并不是想象的那么难

发布时间:2008-05-03 15:45:54来源:红联作者:oniprbl
  最近看了好多内核编程和驱动开发的教程,也参考了一些开发板上的例子。总结下来并不是想象的高不可及。开发驱动程序需要对 内核有一定的了解,并不是非要解读的多么透彻。

  以下所指的驱动程序都是针对具体设备,并做成模块动态加载方式工作的。驱动程序框架是分层的,有些驱动并不是针对具体设备的如ext2文件系统的驱动,tcp/ip协议的驱动等等,这些可以称之为软驱动,工作于其他具体设备驱动程序之上。由于我们做的是嵌入式开发,仅仅编写最低层的设备驱动就可以了。

  设备驱动程序通常分为字符设备和块设备,这是泛指分类。区别就是有缓冲区的就是块设备,无缓冲区的就是字符设备。但是在linux源码的drivers目录下,不仅仅有block和char目录,还有其他的各种设备,那是因为有些开发人员为了方便并没有根据这种分类而是采用了更为直观的功能分类。比如sound目录,大家一看就知道里面存放的是各种音频驱动了。

  既然是设备驱动,我们先看看设备在linux中如何描述。在/dev目录下存放有系统支持的所有设备。设备又可以成为设备节点,如果往系统中添加新设备,必须在/dev下创建相应的节点。一个设备驱动程序往往可以驱动若干设备,设备通过主设备号和次设备号区分。同一主设备号的所有设备使用一个驱动程序。次设备号为驱动程序提供了如何区分不同设备的入口。有些情况下还可以根据次设备号的高低4位区分设备的工作类型。举个例子以hda0-hda4和hdb0-hdb4的关系,hda代表第一块硬盘,hdb代表第二块硬盘,由于大家都是硬盘因此此用同一驱动程序,所以had和hdb的主设备号一致。Hda后面的序号分别代表了该硬盘上的分区信息,为了有效的区分这些分区,次设备的设定做了分类,该字节的高四位代表不同的硬盘的,而低4位代表分区索引。

  了解了设备的描述,我们再看看软件的环境。开发linux下驱动程序与你所使用的发行版本无关,不管你用redhat或mandrake等,都无所谓。真正影响你的是你当前所用的内核的版本。如果你打算在目标板上用2.4.x的内核,而你的主机上的linux用的却是2.6.x的系统,你的开发将是件麻烦的事。问题出在什么地方,你慢慢往下看就明白了。因此我们建议主机和目标系统采用同样的内核版本。

  开发驱动过程中,由于采用的是内核引用,在程序编译时是不需要链接到库文件的。因此lib路径对我们就没什么用了。但是由于需要引用内核提供的各种数据结构和接口,必须设置好相应版本的include路径,通常在/usr/include。在/usr/include下有好多头文件,真正我们需要的只有/usr/include/linux目录和/usr/include/asm目录。

  驱动程序设计中有两个函数和三个数据结构最重要。Init_module和cleanup_module这两个函数。File_operations,inode,file这三个数据结构,在linux/fs.h中定义。至于其他的象内存操作,i/o操作,定时器,中断,DMA等待都是提升部分了。

  作者:eda_yll
文章评论

共有 24 条评论

  1. felixchenjia 于 2014-12-31 17:11:46发表:

    学习了

  2. cc20911 于 2014-12-10 12:33:38发表:

  3. nicholasyang 于 2014-12-08 20:34:41发表:

    怎样向内核中添加设备驱动??

  4. liuruifly 于 2011-04-26 00:27:16发表:

    凑曾分的吧

  5. gdx9125 于 2011-04-24 09:58:16发表:

    顶楼主

  6. smilerll 于 2011-04-23 22:58:28发表:

    谢谢楼主 和跟贴的人 对我的学习有很大的帮助

  7. yyxl 于 2010-12-08 15:40:42发表:

    其实难度还是很大的,你可以尝试一下!编码还是很关键的

  8. 乡阳居士 于 2010-12-05 13:52:15发表:

    期待后续更详尽的分析。

  9. xihu_wy 于 2010-11-16 09:04:05发表:

    学习中

  10. nerissa 于 2010-01-08 11:35:08发表:

    学习中

  11. liuhui0522 于 2009-11-04 17:40:22发表:

    同意10楼观点

  12. chao700007 于 2009-09-27 01:35:15发表:

    我这两天刚开始学习linux,学长要求编写linux驱动。希望楼主多多指教!!!

  13. js001sdx 于 2009-09-25 17:06:14发表:

    12# wenzq

    很好的文章。
    没有后文吗?

  14. wenzq 于 2009-09-25 14:31:22发表:

    我觉得如何能入门,有这样的机会锻炼,加上自己努力肯定可以做下去。当初我们写j2ee不也是这样的。

  15. dongch123 于 2009-09-23 14:17:43发表:

    学习中....

  16. shenhao0129 于 2009-09-22 22:05:52发表:

    但是基本框架是一定的,并不是说你掌握了基本框架之后,就能对那些细节或者技巧部分掌握的很好,但是大体方向应该是对的

  17. shenhao0129 于 2009-09-22 22:04:55发表:

    其实难度还是很大的,你可以尝试一下!

  18. kgduu 于 2009-09-22 18:12:51发表:

    学习中

  19. cernllyy 于 2009-09-22 18:08:19发表:

    谢谢啦。。学习了。。。

  20. ReeChou 于 2009-08-17 22:23:10发表:

    只能说 学习中。。。

  21. yi0734 于 2009-08-16 23:11:54发表:

    很好,谢谢啦

  22. bingcaihuang 于 2009-08-13 14:41:12发表:

    很好,很有用{:2_91:}

  23. js001sdx 于 2009-08-13 14:22:47发表:

    太好了,还有后续文章没有啊?

  24. linuxidea 于 2008-05-03 22:25:31发表: