设备驱动程序简介

什么是设备驱动程序

设备驱动程序,同为程序,与其他程序有何不同呢?简单点的说设备器驱动程序即满足某个标准化的、定义良好的内部编程接口 ,以此将用户的操作,通过这个内部编程接口 映射到实际硬件设备上的特有操作


设备驱动程序的作用

一种角度的解释

从一种角度上讲,设备驱动程序的作用在于提供机制,而非提供策略。
所谓机制,可以理解为“需要提供什么功能”。而所谓策略,可以理解为“如何使用这些功能”。
在驱动程序中的体现有如下几点:

  • 同时支持同步与异步操作。
  • 驱动程序能够被多次打开、充分利用硬件特性。
  • 不具备用来“简化任务”的或提供与策略相关的软件层等。

这种机制与策略分离的思想,在Unix中十分常见。详情参见《Unix编程艺术》中的Unix哲学基础(分离原则)。

另一种角度的解释

驱动程序可以看做是应用程序与实际设备之前的一个软件层。驱动程序的存在使得驱动程序的编写者可以选择如何展示设备特性。也就是说即使对于相同的硬件,不同的驱动程序也可能提供不同的功能。
而能否提供各种不同功能,可能是针对现实中的各种不同因素所做的妥协(平衡)。
总的来说,驱动程序的设计主要综合考虑以下三个方面:
1. 能提供给用户尽可能多的选择。
2. 编写驱动程序索要花费的时间。
3. 尽量保持程序的简单性。


内核功能划分

内核主要可以分为以下几个部分:

  • 进程管理
  • 内存管理
  • 文件系统
  • 设备控制
  • 网络功能

设备驱动程序简介


可装载模块

可在运行时添加到内核中的代码成为“模块”。每个模块是由目标代码组成的(也就是并没有进行链接,在装载的时候才进行动态链接)。上图中涵盖了几个最重要的模块(黑色方框所示),但这并不是所有的模块类,因为有越来越多的功能被模块化。


设备和模块的分类

LInux将设备分成三种基本类型,每个模块通常对应与一种类型。上图中最下面一排黑色方框从左到右分别为:块设备、字符设备、网络设备。
简单来说

  • 字符设备是面向流的,最小访问单位是字节,只能顺序按字节访问,通过设备节点访问;
  • 块设备是面向块的,最小访问单位是512字节或2的更高次幂,块设备可随机访问,并且可容纳文件系统,而块设备虽然也可通过设备节点访问,但一般是通过文件系统来访问数据的。
  • 网络设备没有设备节点是因为,网络设备是面向报文的,很难实现相关read、write等文件读写函数。所以驱动的实现也与字符设备和块设备不同。

上面提到了文件系统,并且在上图中我们看到了在块设备上面的文件系统也是模块。
文件系统决定了如何在块设备上组织数据,来表示目录和文件形成的树结构。与前面所述的设备驱动程序相反,文件系统是典型的软件驱动程序,它将底层的数据结构映射到高层的数据结构