Loading

什么是设备文件?

类Unix操作系统都是基于文件概念的,文件是由字节序列而构成的信息载体。根据这一点,可以把I/O设备当作设备文件这种所谓的特殊文件来处理。

设备文件与系统的某个设备相对应。在内核中,每种设备类型都有与之相对应的设备驱动程序,用来处理设备的所有IO请求。设备驱动程序属内核代码单元,可执行一系列操作,通常与相关硬件的输入/输出动作相对应。由设备驱动程序提供的API是固定的,包含的操作对应于系统调用open()、close()、read()、write()、mmap()以及 ioctl()。每个设备驱动程序所提供的接口一致,这隐藏了每个设备在操作方面的差异,从而满足了IO操作的通用性。即,与磁盘上的普通文件进行交互所用的同一系统调用可直接用于I/O设备。例如,用同一write()系统调用既可以向普通文件中写入数据,也可以通过向/dev/lp0设备文件中写入数据从而把数据发往打印机。

某些设备是实际存在的,比如鼠标、磁盘和磁带设备。而另一些设备则是虚拟的,亦即并不存在相应硬件,但内核会(通过设备驱动程序)提供一种抽象设备,其所携带的API与真实设备一般无异。

根据设备驱动程序的基本特性,设备文件可以分为两种:块和字符:

  • 块设备每次处理一块数据。块的大小取决于设备类型,但通常为512字节的倍数。块设备的数据可以被随机访问,而且从人类用户的观点看,传送任何数据块所需的时间都是较少且大致相同的。块设备的典型例子是硬盘、软盘、CD-ROM驱动器及DVD播放器。
  • 字符型设备基于每个字符来处理数据,数据或者不可以被随机访问(考虑声卡这样的例子),或者可以被随机访问,但是访问随机数据所需的时间很大程度上依赖于数据在设备内的位置(考虑磁带驱动器这样的例子)。终端和键盘都属于字符型设备。

网卡是这种模式的一种明显的例外,因为网卡是不直接与设备文件相对应的硬件设备。自从Unix操作系统早期版本以来,设备文件就一直在使用。设备文件是存放在文件系统中的实际文件。然而,它的索引节点并不包含指向磁盘上数据块(文件的数据)的指针,因为它们是空的。相反,索引节点必须包含硬件设备的一个标识符,它对应字符或块设备文件。

传统上,设备标识符由设备文件的类型(字符或块)和一对参数组成。第一个参数称为主设备号(major number),它标识了设备的类型。通常,具有相同主设备号和类型的所有设备文件共享相同的文件操作集合,因为它们是由同一个设备驱动程序处理的。第二个参数称为次设备号(minor number),它标识了主设备号相同的设备组中的一个特定设备。例如,由相同的磁盘控制器管理的一组磁盘具有相同的主设备号和不同的次设备号。

与其他类型的文件一样,设备文件总会出现在文件系统中,通常位于/dev目录下。超级用户可使用mknod命令创建设备文件,mknod()系统调用亦可完成相同任务,用来创建设备文件。其参数有设备文件名、设备类型、主设备号及次设备号。设备文件通常包含在/dev目录中。下表显示了一些设备文件的属性。注意字符设备和块设备有独立的编号,因此,块设备(3,0)不同于字符设备(3,0)。

设备文件通常与硬件设备(如硬盘/dev/hda),或硬件设备的某一物理或逻辑分区(如磁盘分区/dev/hda2)相对应。但在某些情况下设备文件不会和任何实际的硬件对应,而是表示一个虚拟的逻辑设备。例如,/dev/null就是一个和“黑洞”对应的设备文件,所有写入这个文件的数据都被简单地丢弃,因此,该文件看起来总为空。

就内核所关心的内容而言,设备文件名是无关紧要的。如果你建立了一个名为/tmp/disk的设备文件,类型为“块”,主设备号是3,次设备号是0,那么这个设备文件就和表中的/dev/hda等价。另一方面,对某些应用程序来说,设备文件名可能就很有意义。例如,通信程序可能假设第一个串口和/dev/ttyS0设备文件对应。但是,通常可以把大部分应用程序设定为随意地与指定的设备文件进行交互。

posted @ 2022-07-09 22:06  ThankCAT  阅读(841)  评论(0编辑  收藏  举报