Appearance
题目
下列操作中,鼠标中断处理程序完成的是( )。
错因
A
把"中断处理"和"上层语义解析"搞混了。判断"这是单击 / 双击 / 拖拽"涉及对鼠标动作序列的语义解读,应由更高层的设备无关 I/O 软件或图形子系统完成(如 X Server、Wayland 合成器)。中断处理程序的设计目标是尽快返回——不能在中断上下文里做语义分析,否则会阻塞后续中断。
B
把中断处理和系统调用做的事弄混了。鼠标数据从内核缓冲区复制到用户进程缓冲区,是用户进程通过 read 系统调用主动发起的——上下文已切到该进程的内核态,再将数据 copy_to_user 到该进程缓冲区。中断处理程序根本不知道哪个用户进程在等这条数据,它的工作止于"把数据放进内核缓冲区"。
C
把"硬件做的事"误算到了软件头上。数据从鼠标这个外设到设备的数据寄存器,是设备控制器自己完成的硬件动作(鼠标检测到位置变化 / 按键 → 控制器把数据放进自己的输入寄存器并触发中断请求)。中断处理程序是 CPU 看到中断信号后才开始跑的软件,它不可能"亲手"把数据从外设搬到寄存器——那一步中断尚未发生。
总解析
判定思路:把"鼠标按了一下"到"应用程序拿到事件"这个全链路按层次拆开,看每一层各做什么——中断处理程序只负责其中一段。
完整数据流(从下到上):
| 阶段 | 谁做 | 做什么 |
|---|---|---|
| ① 物理层 | 鼠标硬件 + 设备控制器 | 检测按键/移动;把数据放入控制器的数据寄存器;向 CPU 发中断信号 |
| ② 中断处理 | 中断处理程序(OS 内核) | 从数据寄存器读取数据 → 写入内核缓冲区;ack 中断 |
| ③ 设备无关层 | OS I/O 软件 | 把字节级数据组装成"事件"(移动/单击/双击)、放入对应进程等待队列 |
| ④ 用户层 | 应用程序通过 read() 系统调用 | 触发 copy_to_user,把内核缓冲区的数据复制到应用缓冲区 |
中断处理程序的关键设计原则是**"快进快出"**——只做必须立即做的最小工作(搬数据离开寄存器、确认中断),其余复杂处理(语义解析、唤醒进程、与用户交互)都交给上层。
逐项核对:
| 选项 | 描述 | 实际由谁做 |
|---|---|---|
| A | 解析鼠标输入指令含义(是单击还是双击) | 上层设备无关 I/O 软件或图形系统 |
| B | 数据同步到用户缓冲区 | 用户进程发起的 read() 系统调用(copy_to_user) |
| C | 数据从输入设备到数据寄存器 | 设备控制器(硬件) |
| D | 数据从数据寄存器到内核缓冲区 | 中断处理程序 ✓ |
速记:中断处理 = 把数据从硬件寄存器抢救到内核缓冲区,前后两端都不归它管:之前是硬件、之后是用户的事。
最终答案是 D。