为什么 /dev 和 /proc/devices 在 Linux 中有完全不同的输出

为什么 /dev 和 /proc/devices 在 Linux 中有完全不同的输出

据我所知:

  • 一个驱动程序可以与一个或多个“设备”相关。

  • /dev 文件下的文件代表这些设备。驱动程序有主设备号,每个设备也有次设备号,因此 (major, minor) 可识别一个设备。

  • /proc/devices 还列出了设备。

如果我所知道的是真的那么:

为什么 /dev 和 /proc/devices 的输出完全不同?dev 中有设备名称、主编号和次编号。而 /proc/devices 中有主编号和设备名称,但没有次编号。为什么即使主编号相同,这两个列表也会显示完全不同的输出?

例如,查看 ls -l /dev 中的此行

crw------- 1 root root     10, 235 Sep 19 21:40 autofs

它是字符设备,主号为 10,次号为 235。设备名称是 autofs。

现在我检查 /proc/devices 中具有相同主设备号的条目:

10 misc

如您所见,设备名称完全不同,并且没有次要编号(如何仅通过主编号来识别设备?)。

似乎有些术语混淆了但我无法解决这个问题。

答案1

内核模块(如果你愿意的话,也可以叫它“驱动程序”)可以在内核中注册块设备或字符设备(在传统的 unix 意义上,“设备”这个词有很多含义),使用类似例程register_blkdev以及用于标识设备的字符串。可以使用任何字符串,这些字符串会显示在文件中/proc/devices(这只是该内核表的文本表示)。

另一方面,在现代 Linux 系统中,文件的/dev创建udev遵循一系列复杂的规则。这些文件应该代表用户空间通过读取、写入和 ioctl 与内核交互的方式,这是因为它们是具有主设备号和次设备号的“特殊”文件,因此对这些文件的访问会被转换为内核调用(粗略地说)。

这两者及其结构完全无关。唯一的联系是,每当访问此类文件时,都会查找此类特殊文件的主设备号,并用它来查找注册它的模块。注册它的字符串完全无关紧要。文件出现的名称也完全无关紧要,只要用户知道名称即可。没有什么可以阻止你调用你的磁盘而/dev/this-disk不是/dev/that-disk/dev/sda/dev/sdb如果你觉得这样做的冲动,并改变规则udev

当然人们喜欢让事情变得简单,这就是为什么用于注册设备的字符串通常与它们在 中显示的默认名称相同或至少相似的原因/dev。但这是唯一的联系。

相关内容