Appearance
题目
用户程序发出磁盘 I/O 请求后,系统的处理流程是:用户程序→系统调用处理程序→设备驱动程序→中断处理程序。其中,计算数据所在磁盘的柱面号、磁头号、扇区号的程序是( )。
错因
A
用户程序看到的是逻辑视图——open、read、write 操作的是文件名 + 字节偏移,根本不知道磁盘有几个柱面、磁头、扇区。把"柱面/磁头/扇区"这种物理参数当成用户程序能算的,是把抽象层级搞反了:用户层之上是 OS 屏蔽硬件细节、不是用户去管硬件。
B
系统调用处理程序处于用户态和内核态交界——它的工作是接收参数、做合法性检查(fd 是否有效、buf 指针是否在用户空间)、再把请求转发给下层。它不关心具体硬件参数,那是更下层(设备驱动)的事。
D
中断处理程序在数据传输完成之后才执行——它做的是善后工作(清状态、唤醒等待进程、更新缓冲区指针)。它不计算"数据在哪",因为数据已经传完了;这一步在驱动启动 I/O 之前就要算好,不可能放到事后。
总解析
I/O 软件分层:
用户程序 ← 给文件名 + 字节偏移
↓
系统调用处理 ← 切到内核态、参数校验、分发
↓
设备无关 I/O 层 ← 缓冲管理、通用错误处理
↓
设备驱动程序 ← 把"逻辑参数"翻译成"物理参数",启动具体硬件
↓
硬件 → 中断处理 ← 传完后回调每层只管自己抽象级别上的事:
| 层 | 职责 | 是否计算物理参数? |
|---|---|---|
| 用户程序 | 给文件名 + 偏移 | ✗ |
| 系统调用处理 | 切态 + 参数校验 + 分发 | ✗ |
| 设备驱动程序 | 把逻辑请求翻译成具体硬件参数(柱面/磁头/扇区),构造控制器命令 | ✓ |
| 中断处理 | 传输完毕的善后 | ✗(事情已经做完) |
关键判定:柱面/磁头/扇区是磁盘特定的物理参数——只有"知道目标设备是磁盘"的层才会算它。这一层就是设备驱动:它和具体硬件型号绑定,写驱动的人才能根据磁盘几何(柱面数、扇区数)把"第 N 块"翻译成"哪个柱面、哪个磁头、哪个扇区"。
更上层(用户、系统调用处理)不知道是不是磁盘,不能算磁盘特定参数;更下层(中断)已经在硬件之后,没机会算。
最终答案是 C。