Appearance
题目
处理外部中断时,应该由操作系统保存的是( )。
错因
A
凭直觉觉得"要保存现场,PC 当然算现场的一部分"——确实算,但 PC 是中断隐指令保存的,不是 OS 保存。CPU 一识别中断信号,硬件层面就立刻把 PC 压栈、PSW 切到内核态,等 OS 中断处理程序拿到执行权时 PC 早已保存好。题问"OS 保存",PC 不属于 OS 干的活。
C
把 TLB 当作进程上下文来保存。但 TLB 是硬件缓存——里面的内容随时可能被硬件刷新(比如别的进程上来用),就算 OS 想保存也不可控;而且不需要保存:进程切换回来后,新的访存会按需重新填充 TLB。中断处理通常只是 invalidate 受影响的 TLB 项,不存"保存 TLB 内容"这件事。
D
Cache 也是硬件透明的——CPU 读写内存时硬件自动管理 Cache 行的填充和写回,OS 看不到 Cache 里有什么、也没有 API 让它"保存 Cache 内容"。中断处理保存的是软件可见的状态(寄存器),不是硬件不可见的层级。
总解析
中断响应时"硬件做什么、OS 做什么"的边界:
| 步骤 | 内容 | 谁做 |
|---|---|---|
| ① 中断响应 | 保存 PC + PSW、切到内核态 | 硬件(中断隐指令) |
| ② 跳转入口 | 按中断号查中断向量表 | 硬件 |
| ③ 进入处理程序 | 保存通用寄存器(R0~Rn)、保存中断屏蔽字 | OS |
| ④ 提供服务 | 读设备状态、搬数据、唤醒进程等 | OS |
| ⑤ 恢复返回 | 恢复屏蔽字、恢复通用寄存器、IRET | OS + 硬件 |
判定原则:中断隐指令自动保存的是"切换控制流必需的最小集"(PC + PSW),其他业务相关的寄存器要 OS 进入处理程序后自己保存——因为 ISR 自己也要用通用寄存器。
逐项核对:
- A PC:硬件保存(中断隐指令) → 不归 OS
- B 通用寄存器:ISR 一上来就要 push 一遍,否则它跑业务逻辑会破坏被中断进程的现场 → OS 保存 ✓
- C TLB:硬件缓存,OS 不"保存"TLB 内容
- D Cache:同上,硬件透明
最终答案是 B。