设备文件系统

设备文件在类Unix系统中是一个设备驱动程序的界面，并如常规文件一樣出現在文件系统中。

在微软的MS-DOS、OS-2和Windows等操作系统中也有专门的设备文件。它们允许应用程序使用设备驱动程序，通过标准输入输出系统调用与驱动程序交互，从而简化了许多任务，也带来了与设备特性、功能无关的用户级I/O。

设备文件通常为周边设备提供简单的接口，如打印机。它也可访问这些设备的特定资源，如硬盘分区。它还可以访问没有连接到任何真实设备的系统资源，如数据接受器和随机数生成器。

在类Unix操作系统中包含两类设备节点，分别为字符文件与块文件。它们的区别是操作系统和硬件如何向它们读写数据。它们合称为设备特定文件，与之对应的是命名管道，它既不连接到任何设备，也不是一个文件。

MS-DOS的设备文件借鉴了Unix的特殊文件的概念。MS-DOS的早期版本并不支持文件目录层次，设备文件的文件名被设定为保留字以区分普通文件，新文件或新目录不能够使用这些设备文件的文件名。

在支持chroot进程独立的Unix系统（例如Solaris Containers）中，每个chroot环境中常规情况下都需要一个独立的/dev,它们的挂载点在主机的文件系统中各种地方显示。通过限制设备节点只能放入/dev内的chroot实例中，chroot环境可以强制实行硬件隔离（比Unix的文件系统权限还要严格的一种访问控制，可以禁止特定应用程序访问或命名硬件）。

MS-DOS通过开放设备文件的形式保证了设备包含性，应用程序尝试访问正在被使用的设备时会无法访问设备节点。Unix与Linux在并发控制上采取了多种设备驱动程序的原理。

 实现 
本质上讲，设备节点对应于操作系统分配的资源。Unix通过存放于节点结构中的主设备号和从设备号来识别这些资源。在各种操作系统和系统平台上，这些数都是被唯一分配的。通常，主数用于指定驱动程序，而次数用于指定驱动程序控制的某一特定设备（驱动程序可能控制多个设备），在这种情况下，系统可能把次数作为参数传给驱动程序。

计算机就像对待普通文件那样，用标准系统调用访问设备节点。根据硬件的接口类型和操作系统处理输入输出的方式，设备文件可以分成两类。

 设备 
 字符设备 
64px|right
字符设备是指每次与系统传输1个字符的设备。这些设备节点通常为传真、虚拟终端和串口调制解调器之类设备提供流通信服务，它通常不支持随机存取数据。

字符设备在实现时，大多不使用缓存器。系统直接从设备读取／写入每一个字符。

 块设备 
64px|right
块设备是指与系统间用块的方式移动数据的设备。这些设备节点通常代表可寻址设备，如硬盘、CD-ROM和内存区域。

块设备通常支持随机存取和寻址，并使用缓存器。操作系统为输入输出分配了缓存以存储一块数据。当程序向设备发送了读取或者写入数据的请求时，系统把数据中的每一个字符存储在适当的缓存中。当缓存被填满时，会采取适当的操作（把数据传走），而后系统清空缓存。

 伪设备 
在类Unix操作系统中，设备节点并不一定要对应物理设备。没有这种对应关系的设备是伪设备。操作系统运用了它们提供的多种功能。部份經常使用到的偽設備包括：

/dev/null接受并丟棄所有輸入；即不產生任何輸出。
/dev/full永遠在被填滿狀態的設備。
/dev/loopLoop設備
/dev/zero產生連續的NUL字元的串流(數值為0)。
/dev/random產生一個虛假隨機的任意長度字元串流。(Blocking)
/dev/urandom產生一個虛假隨機的任意長度字元串流。(Non-Blocking)

 创建节点 
节点是由mknod系统调用创建的。在命令行中，有同名的程序来创建节点。rename和unlink系统调用可以用于移动和删除节点，相应的命令是mv和rm。在使用cp命令时加上-R或-a参数，可以创建一个与原设备节点具有同样属性的节点。

 命名约定 
在基于Linux的系统中，设备节点一般在/dev下，通常使用如下的前缀：
 fb：frame缓冲
 fd：软盘
 hd：IDE硬盘或光驱
 lp：打印机
 par：并口
 pt：伪终端
 s：SCSI设备
 scd：SCSI音频光驱
 sd：SCSI硬盘
 sg：SCSI通用设备
 sr：SCSI数据光驱
 st：SCSI磁带
 tty：终端
 ttyS：串口

大部分设备的前缀名后面跟随一个数字，它唯一指定某一设备。硬盘驱动器的前缀名后面跟随一个字母和一个数字，字母用于指明设备，而数字用于指明分区。因此，/dev/sda3指定了硬盘上的一个分区，/dev/pts/14指定了一个网络终端会话。

一些Linux发行版用SCSI层来定义非IDE硬盘的硬盘设备，例如SATA硬盘、USB磁盘等，因此虽然一块硬盘可能并不是SCSI硬盘，但仍可以通过sd设备访问它。

参考资料

S
S
Category:类Unix系统