我通常了解整个主要/次要设备编号对于给定设备的工作原理(如果我离这里很远,请纠正我),以及主要设备编号本质上与一类设备相关(是块设备)或字符设备/特殊字符),而次要编号与该设备下的特定类型设备相关。根据这个数字,内核能够确定需要使用什么设备驱动程序来与该设备交互。在文件系统级别,设备号存储在 inode stat 结构中,因此当您以用户身份统计文件时,它将以 2 字节值的形式返回设备 ID,其中高字节和低字节分别代表主设备和低设备。分别为次要数字。 stat 结构有 2 个成员用于以这种形式指定设备 ID - st_dev 和 st_rdev,其中 st_dev 与相应文件所在的设备相关(对于存储设备上的普通文件,st_dev 将是主要/次要文件所在分区的设备)。
但是,如果文件是非设备挂载,或者特殊字符,或者其他什么,st_dev 中的主设备号将设置为 0,次设备号将设置为某物相反,st_rdev 可能会也可能不会填充设备类型(取决于相应的文件系统是否实现这一点)。所以我的问题是,什么在此实例中填充次设备号,它如何知道要使用什么值/为什么要使用它所使用的值?
例如
stat /etc/passwd
=> 设备:801h,未设置“设备类型”——预计主编号 8 与 SCSI 设备相关,次编号 1 与该文件的第一个分区 (sda1) 相关
stat /dev/sda1
=> 设备:6h,设备类型:8,1 -- 这里设备 (st_dev) 的主设备号为 0(这是预期的),次设备号为 6 - 为什么是 6?
stat /dev/null
-- 再次强调 6 的次要版本
stat /proc/version
-- 4 的次要版本
我缺少什么?
我意识到我在这里引用了结构,这个问题可能更好地放在堆栈溢出中,但我觉得这更像是一个低级 Linux 问题,而不是明确的开发问题 - 不过很高兴重新定位它。
答案1
在我的系统上,/proc
是6h
,并且/dev
是5h
。
快速测试:
# for x in a b c d e f g h i j; do mkdir $x; mount -t tmpfs tmpfs $x; done
# stat */.
给了中间缺失的数字(它被使用33h
了)。似乎只是动态分配,并在安装时使用第一个空闲号码。3dh
35h
/run/user/1000/gvfs
请注意,这些数字会被重用,因此至少在这种情况下,您无法可靠地使用它st_dev
来检测某个路径上的文件系统是否发生了更改。