来自 http://haifux.org/lectures/86-sil/kernel-modules-drivers/node10.html
字符 ('c') 设备是驱动程序通过发送和接收单个字符(字节、八位字节)与之通信的设备。
块 ('b') 设备是驱动程序通过发送整个数据块与之通信的设备。
字符设备示例:串行端口、并行端口、声卡。
块设备的示例:硬盘、USB 摄像头、Disk-On-Key。
“串行端口,并行端口”是指通过电线进行串行通信和并行通信吗?
“串行端口”或“并行端口”是否仅适用于字符设备,而不适用于块设备?
谢谢。
虽然现代计算机上通常有几种互连,例如 USB、SATA 和 PCI/e,它们在技术上是串行的(即使在控制块式设备时也是如此),但您引用的文本更多地是在并行和串行的上下文中,因为它最早用于 20 世纪的计算。
它们指的是用于将计算机与外围设备或有时与其他计算机互连的方法。
虽然有很多变化,但最常见的“串行端口”是一次发送和/或接收一个字符的 I/O 设备,通常使用固定波特率的异步协议。通常通过 RS232 电缆。串行端口和 RS232 端口这两个术语有时可以互换使用,尽管因为 RS-232 实际上是一种电气标准而用词不当。一个常见的应用是将用户终端连接到计算机或调制解调器,用户可以拨入并连接远程终端。可以追溯到机电时代,例如 110 波特 ASR-33 电传打字机,字符串 'tty' 的来源经常出现在 unix 命令和设备文件名中。
串行端口相当慢,因此对于需要更高字符速率的用途,可以使用未串行化的并行端口。这有时被称为打印机制造商,他们将其作为“Centronix”端口流行起来。
并不是说没有使用串行连接的打印机。
但是正如您引用的那样,串行端口和并行端口是指这两种外围连接方案。
因此,即使块式设备可能在技术上通过串行数据方法在某个低级别连接,这不是作者所指的,
“字符设备”和“块设备”是抽象的,通常在 Unix 风格的系统中用于对各种设备进行分类。Unix 风格的设备节点 (
/dev/<something>
) 通常分为字符设备或块设备。基本上,字符设备一次可以有意义地处理数据,甚至是一个字节,但块设备可以处理特定大小的块(通常为 512、1024 或 4096 字节)。如果您向块设备提供不完整的块,您可能必须用零或其他合适的填充填充它以完成该块,否则块设备可能无法完成其操作。
在 Unix 风格的系统中,磁盘通常表示为块设备。但是,在传统的 Unix 系统中,单个磁盘可能表示为两个设备:一个用于常规文件系统访问的块设备,另一个用于“原始访问”和其他特殊操作的设备:原始访问设备通常是字符设备。
在现代 Linux 中,可以通过使用标志打开常规块设备来实现原始访问,但是如果从另一个 Unix 风格系统移植的应用程序特别需要专用的原始设备,则可以使用命令
O_DIRECT
根据需要设置一个。raw
另一方面,串行和并行端口通常是指物理连接技术。
在 PC 硬件中,串口或COM 口通常指的是RS232 端口(通常由美国国家半导体 8250 兼容的 UART 芯片驱动)。由于它不需要固定的块大小,它通常被归类为 Unix 系统中的字符设备。正如串行端口的名称所暗示的那样,该端口以串行方式传输数据,一次一位。此端口的最现代规范称为 EIA/TIA-232。
同样在 PC 硬件中,并行端口、打印机端口、LPT 端口或Centronics 端口都指一种端口类型,其最现代的实现被标准化为 IEEE 1284。它在 Unix 风格的系统中也表示为字符设备,因为它需要没有固定的块大小。顾名思义,它并行传输数据:它有 8 条数据线,一个字节中的每一位。
与串行端口不同,最古老形式的并行端口基本上是单向的:计算机可以一次发送一个字节的数据,但另一端的设备只有几条固定含义的状态线可以用来与计算机通信。(早期版本的 Linux 内核将这些状态行的无效状态组合报告为半幽默的
lp<n> on fire
错误消息。)双向通信模式被实现为后来的增强功能。在引入 USB 之前,并行端口可能是典型 PC 上最快的通用外部连接器。如果需要具有更快数据传输速度的外部设备,通常意味着向系统添加专用接口卡或带有外部连接器的 SCSI 适配器卡。例如,专业的平板图像扫描仪可能需要 SCSI 连接。