装置文件系统
装置文件在类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在并发控制上采取了多种装置驱动程式的原理。[1]
实现
编辑本质上讲,装置节点对应于操作系统分配的资源。Unix通过存放于节点结构中的主装置号和从装置号来识别这些资源。在各种操作系统和系统平台上,这些数都是被唯一分配的。通常,主数用于指定驱动程式,而次数用于指定驱动程式控制的某一特定装置(驱动程式可能控制多个装置),在这种情况下,系统可能把次数作为参数传给驱动程式。
电脑就像对待普通文件那样,用标准系统调用访问装置节点。根据硬件的接口类型和操作系统处理输入输出的方式,装置文件可以分成两类。
装置
编辑字符装置
编辑字符装置是指每次与系统传输1个字符的装置。这些装置节点通常为传真、虚拟终端和串口调制解调器之类装置提供流通信服务,它通常不支持随机存取数据。
字符装置在实现时,大多不使用缓存器。系统直接从装置读取/写入每一个字符。
块装置
编辑块装置是指与系统间用块的方式移动数据的装置。这些装置节点通常代表可寻址装置,如硬盘、CD-ROM和内存区域。
块装置通常支持随机存取和寻址,并使用缓存器。操作系统为输入输出分配了缓存以存储一块数据。当程序向装置发送了读取或者写入数据的请求时,系统把数据中的每一个字符存储在适当的缓存中。当缓存被填满时,会采取适当的操作(把数据传走),而后系统清空缓存。
伪装置
编辑在类Unix操作系统中,装置节点并不一定要对应物理装置。没有这种对应关系的装置是伪装置。操作系统运用了它们提供的多种功能。部分经常使用到的伪装置包括:
/dev/null
- 接受并丢弃所有输入;即不产生任何输出。
/dev/full
- 永远在被填满状态的装置。
/dev/loop
- Loop装置
/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
装置访问它。
参考资料
编辑- ^ (英文)Corbet, Jonathan; Kroah-Hartman, Greg; Rubini, Alessandro. Linux Device Drivers, 3rd Edition. O'Reilly. 2005 [2018-04-30]. (原始内容存档于2017-09-22).
The next step beyond a single-open device is to let a single user open a device in multiple processes but allow only one user to have the device open at a time.