《Linux内核修炼之道》之 高效学习Linux驱动开发

发表于:2011-7-29 10:13

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:fudan_abc(CSDNblog)    来源:51Testing软件测试网采编

#
Linux
分享:

  下面仍然是之前5月份一次presentation的部分内容及讲义,不过当时的题目叫“驱动开发的方法论”,或许对大家有用吧。至于这几次讲座的视频貌似网上都能找到。

************************************************************************

  前一篇我们谈到了如何高效学习Linux内核,现在我们开始另外一个话题,就是如何高效学习 linux 驱动开发。至于为什么会选择这样一个 topic ,主要是基于这样两个原因:

  第一个原因是:目前几乎所有的驱动开发方面的参考书,内容结构都是先介绍介绍什么是 linux 驱动,它分为哪些种类,然后是各种类型设备的驱动程序的内容细节。大都是只注重各种驱动本身的细节,而没有站在一个全局整体的角度讲解一下驱动开发的方法。这样导致的后果就是,大多数的驱动开发者虽然可以正确的编写驱动程序,但往往都是只知其一不知其二,知其然而不知其所以然。

  第二个原因是:目前很多驱动开发者,即使是已经有多年经验的开发者,在开发驱动的时候也就是填充填充 driver 的结构体,对于比较成熟的平台,就是网上找个类似的驱动修改一下,即使写十个百个千个驱动,也就是对某些硬件比较熟,遇到全新的芯片全新的平台就束手无策。应该说这样对驱动的理解是很有限的。这也是目前 linux 驱动开发领域的现状。

  我们首先认识一下 Linux 驱动的基本面,我们认识一个新事物的的第一件事就是了解它的一些基本信息,就像我们人与人之间互相认识首先也是通过个人的基本信息一样。

  Linux 驱动在本质上就是一种软件程序,上层软件可以在不用了解硬件特性的情况下,通过驱动提供的接口,和计算机硬件进行通信。

  系统调用是内核和应用程序之间的接口,而驱动程序是内核和硬件之间的接口,也就是内核和硬件之间的桥梁。它为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。

  Linux 驱动程序是内核的一部分,管理着系统中的设备控制器和相应的设备。它主要完成这么几个功能:对设备初始化和释放;传送数据到硬件和从硬件读取数据;检测和处理设备出现的错误。

  一般来说,一个驱动可以管理一种类型的设备。例如不同的 U 盘都属于 mass storage 设备,我们不需要为每一个 U 盘编写驱动,而只需要一个驱动就可以管理所有这些 mass storage 设备。

  为方便我们加入各种驱动来支持不同的硬件,内核抽象出了很多层次结构,这些层次结构是 Linux 设备驱动的上层。它们抽象出各种的驱动接口,驱动只需要填写相应的回调函数,就能很容易把新的驱动添加到内核。

  一般来说, Linux 驱动可以分为三类,就是块设备驱动,字符设备驱动和网络设备驱动。块设备的读写都有缓存来支持,并且块设备必须能够随机存取。块设备驱动主要用于磁盘驱动器。

  而字符设备的 I/O 操作没有通过缓存。字符设备操作以字节为基础,但不是说一次只能执行一个字节操作。例如对于字符设备我们可以通过 mmap 一次进行大量数据交换。字符设备实现比较简单和灵活。

31/3123>
精选软件测试好文,快来阅读吧~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号