Linux
设备驱动
操作系统的目的之一就是将系统硬件设备细节从用户视线中隐藏起来。例
如虚拟文件系统对各种类型已安装的文件系统提供了统一的视图而屏蔽了具体
底层细节。本章将描叙
Linux
核心对系统中物理设备的管理?/p>
CPU
并不是系统中唯一的智能设备,每个物理设备都拥有自己的控制器?/p>
键盘、鼠标和串行口由一个高?/p>
I/O
芯片统一管理?/p>
IDE
控制器控?/p>
IDE
硬盘
?/p>
SCSI
控制器控?/p>
SCSI
硬盘等等。每个硬件控制器都有各自的控制和状态寄
存器
(CSR)
并且各不相同。例?/p>
Adaptec 2940 SCSI
控制器的
CSR
?/p>
NCR 810
SCSI
控制器完全不一样。这?/p>
CSR
被用来启动和停止,初始化设备及对设备?/p>
行诊断。在
Linux
中管理硬件设备控制器的代码并没有放置在每个应用程序中
而是由内核统一管理。这些处理和管理硬件控制器的软件就是设备驱动?/p>
Linux
核心设备驱动是一组运行在特权级上的内存驻留底层硬件处理共享库。正是它
们负责管理各个设备?/p>
设备驱动的一个基本特征是设备处理的抽象概念。所有硬件设备都被看?/p>
普通文件;可以通过和操纵普通文件相同的标准系统调用来打开、关闭、读?/p>
和写入设备。系统中每个设备都用一种特殊的设备相关文件来表?/p>
(device
special file)
,例如系统中第一?/p>
IDE
硬盘被表示成
/dev/hda
。块
(
磁盘
)
设备
和字符设备的设备相关文件可以通过
mknod
命令来创建,并使用主从设备号?/p>
描叙此设备。网络设备也用设备相关文件来表示,但
Linux
寻找和初始化网络
设备时才建立这种文件。由同一个设备驱动控制的所有设备具有相同的主设?/p>
号。从设备号则被用来区分具有相同主设备号且由相同设备驱动控制的不同?/p>
备。例如主
IDE
硬盘的每个分区的从设备号都不相同。如
/dev/hda2
表示?/p>
IDE
硬盘的主设备号为
3
而从设备号为
2
?/p>
Linux
通过使用主从设备号将包含在系?/p>
调用中的
(
如将一个文件系?/p>
mount
到一个块设备
)
设备相关文件映射到设备的
设备驱动以及大量系统表格中,如字符设备表?/p>
chrdevs
?/p>
Linux
支持三类硬件设备:字符、块及网络设备。字符设备指那些无需?/p>
冲直接读写的设备,如系统的串口设?/p>
/dev/cua0
?/p>
/dev/cua1
。块设备则仅?/p>
以块为单位读写,典型的块大小?/p>
512
?/p>
1024
字节。块设备的存取是通过