设备是块设备还是字符设备纯粹由硬件决定?

设备是块设备还是字符设备纯粹由硬件决定?

https://unix.stackexchange.com/a/472920/674

“字符设备”和“块设备”是抽象概念,通常在 Unix 风格的系统中用于对各种设备进行分类。

设备是由硬件(设备或设备控制器)、设备驱动程序、文件系统、操作系统内核 I/O 子系统和/或其他内容确定的块设备还是字符设备?

我认为它们是纯硬件(设备或设备控制器)的概念,独立于设备驱动程序、文件系统和操作系统内核 I/O 子系统。

块/字符设备和随机/顺序访问之间有什么影响吗?

唯一真正可见的区别是块设备使用缓冲区高速缓存而字符设备不使用。 (某些块设备驱动程序可能会提供基于每个文件绕过缓冲区高速缓存的选项)。

缓冲区高速缓存是由设备驱动程序、文件系统还是硬件(设备或设备控制器)提供的块设备使用的?如果由硬件决定,那么是否意味着设备是块设备还是字符设备完全由硬件(设备或设备控制器)决定?

谢谢。

答案1

不,这是由操作系统决定的。

FreeBSD 架构手册日期为 2018 年 9 月 23 日 11:38:04。

9.4 块设备(已经消失)

其他 UNIX® 系统可能支持第二种类型的磁盘设备,称为块设备。块设备是内核为其提供缓存的磁盘设备,作为磁盘 I/O 基础设施现代化的一部分,FreeBSD 放弃了对缓存磁盘设备的支持。

FreeBSD 仍然有“原始”设备,它们是允许读写磁盘块的字符设备。

不要被名称混淆。块设备提供缓冲 - 允许您以字节为单位进行读写。原始设备是一种字符设备 - 但它们要求您以块为单位进行读写。块大小取决于特定的磁盘硬件。

“字符设备”最初的命名可能是电传打字机终端,一次实际操作一个字符。块设备是与缓冲区高速缓存read()交互的特定情况write() ,而不是直接与设备驱动程序交互。字符设备成为一般情况,用于所有其他设备文件。该接口非常灵活,因为除了特定于设备的read()和 之外write(),它还可以支持 的任意命令ioctl()

https://en.wikipedia.org/wiki/Device_file#Block_devices

大多数系统都会创建块设备和字符设备来表示硬盘等硬件。 FreeBSD 和 Linux 显然不这样做;前者删除了对块设备的支持,[6]而后者仅创建块设备。在 Linux 中,要获取磁盘的字符设备,必须使用“原始”驱动程序,尽管通过使用 Linux 特定标志打开块设备可以获得与打开字符设备相同的效果O_DIRECT

阻止特殊文件或者块设备提供对硬件设备的缓冲访问,并提供对其细节的一些抽象。[5]与字符设备不同,块设备始终允许程序员读取或写入任何大小(包括单个字符/字节)和任何对齐方式的块。缺点是,因为块设备是缓冲的,所以程序员不知道写入的数据从内核缓冲区传递到实际设备需要多长时间,或者实际上两个单独的写入将以什么顺序到达物理设备。此外,如果同一硬件同时暴露字符设备和块设备,则存在数据损坏的风险,因为使用字符设备的客户端不知道块设备缓冲区中所做的更改。

相关内容