Appearance
题目
用户程序发出磁盘 I/O 请求后,系统的正确处理流程是( )。
错因
B
把中断处理放在驱动之前——但中断是 I/O 完成后硬件主动发的信号,不可能在驱动启动 I/O 之前就先发中断。顺序倒置。
C
让用户程序绕过 syscall 直接调驱动——不可能,用户态访问不到内核态的驱动代码,必须经过 syscall 切到内核才能调用驱动。把驱动放第二位违反了用户态/内核态的边界。
D
同 C 的错(用户程序直接调驱动),还把中断放在 syscall 之前——逻辑混乱,无法成立。
总解析
I/O 请求处理的标准流程(自顶向下处理 → 自底向上响应):
1. 用户程序 ← 调用 read(fd, ...)
↓ trap
2. 系统调用处理程序 ← 切到内核态、参数校验、分发到具体设备
↓
3. 设备驱动程序 ← 把通用请求翻译成磁盘控制器命令、启动 I/O
↓ 等待
(硬件传输数据)
↑ 完成
4. 中断处理程序 ← 响应磁盘"传输完毕"中断、唤醒等数据的进程
↑ 驱动收尾
↑ 数据返回用户进程关键约束:
| 约束 | 说明 |
|---|---|
| 用户 → syscall | 用户态不能直接进内核,必须经 trap |
| syscall → 驱动 | 驱动是内核代码,syscall 在内核态调用驱动接口 |
| 驱动 → 中断 | 驱动启动 I/O 后等待,硬件完成后发中断 → 中断处理 |
中断处理在最后——它是"硬件完成后才回到 OS"的那一步,不可能放在前面。任何把中断放在驱动之前的流程都不成立。
逐项核对:
- A 用户 → syscall → 驱动 → 中断:✓ 正确顺序
- B:中断放在驱动前 ✗
- C:用户绕过 syscall 直接调驱动 ✗
- D:同 C + 中断在 syscall 前 ✗
最终答案是 A。