键盘、鼠标、插个 U 盘、网卡来包、断电……这些到底算哪类中断?它们其实能按「来源」和「能不能屏蔽」两套维度同时归类。下面有可点击的"设备→类型"对照,点一下就清楚。
同一个中断事件,可以同时在两个维度上定位:
这是最常用的分法:外部硬件中断、内部异常、软件陷阱。
图:一次"打断"按来源归到三大桶。注意键盘鼠标等"设备类"几乎都在左桶,掉电等紧急的会跳到右下的 NMI 分支(见维度二)。
这套维度叠加在来源之上:绝大多数外部中断可屏蔽;只有极少数致命错误不可屏蔽。
图:可屏蔽走 INTR(受 IF 管),不可屏蔽走 NMI(独立、关不掉)。同一个"键盘"只走 INTR 这一路。
异常这一桶还能按"出错后能否继续、何时被发现"再切三刀,这决定了内核怎么处理。
下面这些就是你问的"键盘、鼠标、插外设……"。点任意一个,右侧给出它在两套维度上的定位。
每个设备会标明:来源分类(外部硬件/内部异常/软件陷阱)、可屏蔽性(INTR/NMI)、触发方式与 IRQ、以及一句话说明。
| 场景 | 来源分类 | 可屏蔽性 | 触发方式 / IRQ 或向量 | 一句话 |
|---|---|---|---|---|
| 键盘按键 | 外部硬件中断 | 可屏蔽 INTR | IRQ1(USB 键则经 xHCI) | 键盘控制器发扫描码,拉中断 |
| 鼠标移动/点击 | 外部硬件中断 | 可屏蔽 INTR | IRQ12(PS/2) 或 xHCI | 同上,PS/2 走专用线 |
| 插入 U 盘/USB 外设 | 外部硬件中断 | 可屏蔽 INTR | xHCI 端口状态变化中断 | 控制器察觉插拔,中断 OS 去枚举 |
| PCIe/雷雳热插拔 | 外部硬件中断 | 可屏蔽 INTR | PCIe 热插拔中断 | 插槽状态变化触发 |
| 网卡收到数据包 | 外部硬件中断 | 可屏蔽 INTR | MSI-X 向量 | 收包完成,DMA 后发中断叫醒 CPU |
| 磁盘读写完成 | 外部硬件中断 | 可屏蔽 INTR | IRQ14/15 或 NVMe MSI-X | DMA 把数据搬完,发"完成"中断 |
| 时钟滴答 | 外部硬件中断 | 可屏蔽 INTR | IRQ0 / Local APIC 定时器 | 周期性中断,驱动进程调度 |
| 声卡 buffer 就绪 | 外部硬件中断 | 可屏蔽 INTR | 声卡 IRQ | 播放/录制的缓冲边界通知 |
| 显卡渲染完成 | 外部硬件中断 | 可屏蔽 INTR | GPU MSI-X | GPU 算完/VSync 通知 |
| 电源掉电 | 不可屏蔽中断 | NMI(或 SMI) | NMI 引脚 | 致命,必须立即存盘/停机 |
| 内存 ECC/奇偶校验错 | 不可屏蔽中断 | NMI | NMI 引脚 | 内存数据损坏,紧急报警 |
| 看门狗超时 | 不可屏蔽中断 | NMI | NMI 引脚 | 系统卡死,强制复位 |
| 除零 | 内部异常 | —(同步) | 向量 0(#DE) | 指令执行出错,故障类 |
| 缺页 | 内部异常 | —(同步) | 向量 14(#PF) | 访问未映射页,故障类,可恢复 |
| 非法指令 | 内部异常 | —(同步) | 向量 6(#UD) | 指令解码失败,故障/终止 |
| 系统调用 | 软件陷阱 | —(同步/主动) | syscall / int 0x80 | 程序主动陷入内核,陷阱类 |
| Ctrl+C(终端) | 外部硬件中断→信号 | 可屏蔽 INTR | 键盘中断 → SIGINT | 硬件是键盘中断;结果以"信号"送达进程 |
两个层面:硬件层它是一次普通的键盘中断(可屏蔽、外部硬件);但对进程而言,终端驱动识别到 Ctrl+C 后,会向前台进程发 SIGINT 信号。所以"中断"在前半段,"信号"在后半段——别把两者混为一谈。
现代通用情况:USB 设备插入 → USB 主机控制器察觉端口状态变化 → 发外部硬件中断(可屏蔽)给 CPU → OS 枚举设备、加载驱动。注意:真正的"检测"在控制器里,CPU 是被中断叫去处理的;老式 PS/2 设备则只在开机自检时识别,运行中插拔并不产生中断。
是。逻辑上仍是外部硬件中断、可屏蔽,只是传递方式从"拉专用 IRQ 线"变成"设备往特定内存地址写一条消息",APIC 收到后转成带向量号的中断。网卡、显卡、NVMe 几乎都用 MSI-X,能支持成百上千个独立向量。
DMA(直接内存访问)本身不是中断,它是"设备不麻烦 CPU、自己把数据搬进内存"的机制;但搬完之后,设备会发一个外部硬件中断通知 CPU"好了,来处理吧"。所以常见搭配是:DMA 搬运 + 中断通知。