{T}

中断和中断向量

以"Java/JS 等语言如何捕获键盘输入"为例,梳理从硬件按键到应用层事件的完整中断链路,引出中断、中断识别码与中断向量的设计。

响应键盘的链路设计

  • 目标:在应用中实现按键响应,类似 Switch-Case——不同按键触发不同程序(回车换行、方向键移动光标)。
  • 按键抽象:键盘一般不超过 100 键,可用 1 字节描述:最高位表示按下/释放,低 7 位(0~127)表示具体按键,按时间顺序记录即可无歧义。
  • 处理位置:按键解析是通用逻辑,由操作系统统一完成更合理,例如将回车封装为字符串 Enter,组合键(如 Ctrl+C)需结合时间因素判断,也由 OS 统一处理。
  • 响应模型:应用以消息模型响应按键——在 OS 注册回调函数,仅当按键真实发生时才执行,避免轮询扫描的开销。
  • 高优先级:按键(如 Ctrl+CEsc)应随时中断当前程序,需从硬件层面支持中断。

硬件到 CPU 的通知

按键发生时,键盘芯片将"第几行第几列的开关"转换为电信号(按键码),主板接收后写入自身寄存器并通知 CPU。CPU 通过总线收到通知,中断正在执行的程序,改变 PC 指针跳转到固定位置。

![主板通知 CPU](/os-images/16-中断和中断向量:Javaj 等语言为什么可以捕获到键盘输入__CgqCHl-ZTb2AThFmAACeKCyumpw628.png)

![改变 PC 指针](/os-images/16-中断和中断向量:Javaj 等语言为什么可以捕获到键盘输入__CgqCHl-ZTcaAUGEwAAB9llc1vwo219.png)

CPU 只知道中断后跳转到固定位置(如将 PC 设为 0,从内存地址 0 读取下一条指令)。操作系统需提前向该位置写入指令(如 Jump),将 PC 指向自己的按键处理程序。

中断的设计

整体分三层:硬件(键盘芯片/主板)、操作系统、程序语言(对接 OS API)。

![三层设计](/os-images/16-中断和中断向量:Javaj 等语言为什么可以捕获到键盘输入__Ciqc1F-ZTdKAJxaRAABvzPwzEgU406.png)

  • 中断(interrupt):CPU 中断当前程序、跳转 PC 处理事件的行为。系统调用、设备就绪、异常等都通过中断实现。
  • 中断识别码:区分中断类型,如按键可取编号 16。
  • 中断向量(Interrupt Vector):某类型中断发生时 PC 应跳转的地址。例如 32 位机器上,编号 16 的中断跳转到内存地址 16 × 4
  • 中断向量表:存放所有中断向量的内存空间。若有 256 个中断(编号 0~255),需 1K 内存(每个向量 4 字节)。

![中断向量表](/os-images/16-中断和中断向量:Javaj 等语言为什么可以捕获到键盘输入__Ciqc1F-ZTd6AeCy8AACahXIwrgA950.png)

CPU 收到中断后,根据类型查中断向量表得到跳转地址;操作系统必须提前修改中断向量,写入 Jump 指令,将 PC 再次跳转到自己的处理程序。

操作系统接管按键后的处理:

  • 将按键放入队列(应对过快按键,分时处理);
  • 计算组合键(利用按下/释放的时间关系);
  • 将按键抽象为消息(事件对象);
  • 提供监听 API 给应用,并分发消息给监听者。

拥有虚拟机的语言(Java/Node.js)只需对接 OS 提供的键盘事件 API 即可。

中断的类型

  • 按触发方
    • 同步中断:由 CPU 指令主动触发。如系统调用触发的陷阱(Trap)、检测到错误触发的错误(Fault,响应后重执触发处,如缺页中断)、程序异常。
    • 异步中断:响应外部设备的通知触发,如键盘、鼠标。
  • 按是否可屏蔽:CPU 设有中断屏蔽位,置 1 后暂停响应多数中断。键盘/鼠标、Trap/Fault 等可被屏蔽;CPU 故障导致的掉电等不可屏蔽中断仍会触发。

小结

中断是硬件通知 CPU 暂停当前程序、跳转固定位置执行处理程序的机制。中断识别码对应中断向量,所有向量构成中断向量表;操作系统预先写入跳转指令接管处理。按键经键盘芯片→主板→CPU 中断→OS 解析为消息→应用 API 这条链路,最终被高级语言捕获。