Appearance
题目
程序员利用系统调用打开 I/O 设备时,通常使用的设备标识是( )。
错因
B
物理设备名是硬件特定的标识——比如"第二块磁盘的第三个分区"这种带具体硬件信息的名字。让程序员直接用物理设备名等于让程序绑死在某台机器上,违反"设备无关性"的设计目标。OS 的 I/O 抽象就是让程序员不用关心物理细节。
C
主设备号(major number)是驱动程序的标识——OS 内核用它把请求分发给对应的设备驱动。这是内核内部使用的编号,不是用户看到的;程序员的 syscall 不会传主设备号。
D
从设备号(minor number)是同一类设备里的具体实例编号(比如同一块磁盘的不同分区)——也是内核内部使用。程序员用的是更高一层的逻辑名,syscall 不要求程序员管这个数字。
总解析
设备无关性(device independence):用户程序使用设备时不依赖具体硬件——通过逻辑设备名访问,OS 在运行时把逻辑设备名映射到物理设备。
逻辑设备名 vs 物理设备名:
| 项 | 例子 | 谁用 |
|---|---|---|
| 逻辑设备名 | /dev/printer、/dev/cdrom、stdin / stdout、con: | 程序员 |
| 物理设备名 | "EpsonL3151" 在 USB1 上、"WD Caviar 500GB" 在 SATA0 | OS 内部 |
| 主 + 从设备号 | (major=8, minor=0) 表示第一块 SCSI 硬盘 | OS 内核驱动表 |
OS 把逻辑名翻译成物理设备:
程序:open("/dev/cdrom")
↓
OS 查"逻辑名 → 物理设备"映射表
↓
找到具体物理设备 + 主从设备号 + 驱动入口
↓
调用对应驱动,启动 I/O好处:
| 维度 | 收益 |
|---|---|
| 移植性 | 同一程序在不同硬件配置上都能跑(逻辑名不变) |
| 灵活性 | 同一程序可以重定向到不同设备(如 stdout 重定向到文件) |
| 简化编程 | 程序员不用学硬件细节 |
速记:程序员只跟逻辑名打交道——open("文件名" 或 "/dev/X"),OS 内部翻译成物理设备 + 设备号。这正是 Unix"一切皆文件"哲学的体现:所有 I/O 都通过统一的 open/read/write 接口操作逻辑名,物理细节藏在内核。
最终答案是 A。