该/proc/devices
文件按主要修订号和名称列出设备。在我的系统上它显示(部分):
Block devices:
259 blkext
7 loop
8 sd
9 md
11 sr
65 sd
66 sd
67 sd
68 sd
69 sd
70 sd
71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
253 device-mapper
254 mdp
这些“sd”设备是什么?第一个(版本号 8)可能是,/dev/sda
但其余的没有出现/dev
- 没有具有这些主要版本号的设备。
我做查看设备列表:
crw-rw---- 1 root tty 7, 128 Jul 29 14:15 vcsa
crw-rw---- 1 root tty 7, 129 Jul 29 14:15 vcsa1
crw-rw---- 1 root tty 7, 130 Jul 29 14:15 vcsa2
crw-rw---- 1 root tty 7, 131 Jul 29 14:15 vcsa3
crw-rw---- 1 root tty 7, 132 Jul 29 14:15 vcsa4
crw-rw---- 1 root tty 7, 133 Jul 29 14:15 vcsa5
crw-rw---- 1 root tty 7, 134 Jul 29 14:15 vcsa6
哪里的次要的数字可能匹配 - /proc 会显示次要的修订号,以及为什么称为sd
.不管怎样,我没有看到任何设备没有。135
。
有人可以向我解释一下吗?
答案1
第一个磁盘/dev/sda
是8:0
(major:minor),但主编号 8 也包含接下来的 15 个磁盘 (Documentation/devices.txt
在内核源代码中):
8 block SCSI disk devices (0-15)
0 = /dev/sda First SCSI disk whole disk
16 = /dev/sdb Second SCSI disk whole disk
32 = /dev/sdc Third SCSI disk whole disk
...
240 = /dev/sdp Sixteenth SCSI disk whole disk
Partitions are handled in the same way as for IDE
disks (see major number 3) except that the limit on
partitions is 15.
其余的用于您的其余驱动器(主编号 66-71 和 128-134 相似,并且所有分区方案都相同):
65 block SCSI disk devices (16-31)
0 = /dev/sdq 17th SCSI disk whole disk
16 = /dev/sdr 18th SCSI disk whole disk
...
135 block SCSI disk devices (240-255)
0 = /dev/sdig 241st SCSI disk whole disk
...
240 = /dev/sdiv 256th SCSI disk whole disk
好吧,您可能没有那么多磁盘,并且系统仅生成您实际拥有的设备所需的节点,因此除了 .txtsda
及其分区之外,您看不到任何内容/dev
。
至于vcsa
朋友们,他们与虚拟控制台有关:
7 char Virtual console capture devices
0 = /dev/vcs Current vc text contents
1 = /dev/vcs1 tty1 text contents
...
128 = /dev/vcsa Current vc text/attribute contents
129 = /dev/vcsa1 tty1 text/attribute contents
...
另请注意,这/dev/vcs*
是字符设备,而不是块设备。输出中的第一个字母ls
表明它是哪个。
答案2
只是块sd
设备最多可以有 16 * 1048576 个(当 dev_t 为 16 位时,块设备只有 16 * 256 个)。
代码有:
for (i = 0; i < SD_MAJORS; i++) {
if (register_blkdev(sd_major(i), "sd") != 0)
continue;
majors++;
blk_register_region(sd_major(i), SD_MINORS, NULL,
sd_default_probe, NULL, NULL);
}
注册这 16 个主要号码。
和:
/*
* More than enough for everybody ;) The huge number of majors
* is a leftover from 16bit dev_t days, we don't really need that
* much numberspace.
*/
#define SD_MAJORS 16
在哪里:
/*
* Device no to disk mapping:
*
* major disc2 disc p1
* |............|.............|....|....| <- dev_t
* 31 20 19 8 7 4 3 0
*
* Inside a major, we have 16k disks, however mapped non-
* contiguously. The first 16 disks are for major0, the next
* ones with major1, ... Disk 256 is for major0 again, disk 272
* for major1, ...
* As we stay compatible with our numbering scheme, we can reuse
* the well-know SCSI majors 8, 65--71, 136--143.
*/
static int sd_major(int major_idx)
{
switch (major_idx) {
case 0:
return SCSI_DISK0_MAJOR;
case 1 ... 7:
return SCSI_DISK1_MAJOR + major_idx - 1;
case 8 ... 15:
return SCSI_DISK8_MAJOR + major_idx - 8;
default:
BUG();
return 0; /* shut up gcc */
}
}
其中显示了专业和辅修专业是如何分配的。