中断都有哪些类型?

键盘、鼠标、插个 U 盘、网卡来包、断电……这些到底算哪类中断?它们其实能按「来源」「能不能屏蔽」两套维度同时归类。下面有可点击的"设备→类型"对照,点一下就清楚。

先建立一个核心认知

同一个中断事件,可以同时在两个维度上定位:

  • 维度一 · 从哪来(来源):CPU 外部的设备?CPU 自己执行指令出的错?还是程序主动陷进来的?→ 决定它是外部硬件中断 / 内部异常 / 软件陷阱
  • 维度二 · 能不能关掉(可屏蔽性):能不能用 CLI/STI 或 IF 标志暂时屏蔽?→ 决定它是可屏蔽中断(INTR)还是不可屏蔽中断(NMI)
所以"键盘按键"既可以说它是外部硬件中断(来源维度),也可以说它是可屏蔽中断(可屏蔽维度)。两个说法都对,说的是不同侧面。下面会反复用这两套词。

维度一按"来源"分三大类

这是最常用的分法:外部硬件中断、内部异常、软件陷阱。

① 外部硬件中断

  • 来自 CPU 外部的设备,异步(跟当前指令无关)。
  • 通过 IRQ 中断线MSI 消息触发。
  • 例:键盘、鼠标、网卡、磁盘完成、时钟、插外设。
  • 大多可屏蔽,少数紧急的走 NMI。

② 内部异常 Exception

  • CPU 执行指令时自己出的事,同步
  • 本质是"指令级中断"。
  • 例:除零、缺页、非法指令、断点。
  • 再分 故障/陷阱/终止(见下)。

③ 软件陷阱 Trap

  • 程序主动int n / syscall 陷入内核。
  • 同步,由自己发起。
  • 例:系统调用、断点调试。
  • 内核借此把"用户态→内核态"的切换标准化。
任意时刻的"打断" 外部硬件中断 异步 · 来自设备 键盘/鼠标/网卡/磁盘/ 时钟/插外设/声卡/显卡 内部异常 同步 · 指令执行出错 除零/缺页/非法指令/ 运算溢出/断点 软件陷阱 同步 · 程序主动陷入 系统调用 syscall / int 0x80 / 调试断点 注:三类共用同一套"向量号→处理程序(IDT)"机制,所以常被统称"中断系统"。

图:一次"打断"按来源归到三大桶。注意键盘鼠标等"设备类"几乎都在左桶,掉电等紧急的会跳到右下的 NMI 分支(见维度二)。

维度二按"能不能屏蔽"分两类

这套维度叠加在来源之上:绝大多数外部中断可屏蔽;只有极少数致命错误不可屏蔽。

可屏蔽中断 INTR

  • 受 CPU 的 IF 标志位控制,CLI 关、STI 开。
  • 内核在临界区会临时关中断保护共享数据。
  • 包含:键盘、鼠标、网卡、磁盘、时钟等几乎所有日常设备
  • 走 CPU 的 INTR 引脚

不可屏蔽中断 NMI

  • 关不掉,无视 IF 标志,必须立即处理。
  • 走独立的 NMI 引脚
  • 典型:电源掉电、内存奇偶/ECC 校验错、看门狗超时等致命硬件错误。
  • 处理不好直接宕机/数据损坏,所以优先级最高。
CPU IF 标志 INTR 引脚 NMI 引脚 键盘/鼠标/网卡… 掉电/ECC错误… 可被 CLI/STI 屏蔽 永远不屏蔽

图:可屏蔽走 INTR(受 IF 管),不可屏蔽走 NMI(独立、关不掉)。同一个"键盘"只走 INTR 这一路。

细分内部异常还分故障/陷阱/终止

异常这一桶还能按"出错后能否继续、何时被发现"再切三刀,这决定了内核怎么处理。

故障 Fault

  • 指令执行前/中被发现,可恢复
  • 返回地址=出错指令,重试即可。
  • 例:缺页异常(调页后重跑)、除零。

陷阱 Trap

  • 指令执行后触发,有意的。
  • 返回地址=下一条指令。
  • 例:系统调用、断点 int3

终止 Abort

  • 致命,无法精确定位到指令。
  • 通常只能终止进程/恐慌。
  • 例:硬件故障、严重的系统表错误。

交互点设备,看它到底算哪类

下面这些就是你问的"键盘、鼠标、插外设……"。点任意一个,右侧给出它在两套维度上的定位。

👈 点上面的设备看看

每个设备会标明:来源分类(外部硬件/内部异常/软件陷阱)、可屏蔽性(INTR/NMI)、触发方式与 IRQ、以及一句话说明。

总表常见场景一览对照

场景来源分类可屏蔽性触发方式 / IRQ 或向量一句话
键盘按键外部硬件中断可屏蔽 INTRIRQ1(USB 键则经 xHCI)键盘控制器发扫描码,拉中断
鼠标移动/点击外部硬件中断可屏蔽 INTRIRQ12(PS/2) 或 xHCI同上,PS/2 走专用线
插入 U 盘/USB 外设外部硬件中断可屏蔽 INTRxHCI 端口状态变化中断控制器察觉插拔,中断 OS 去枚举
PCIe/雷雳热插拔外部硬件中断可屏蔽 INTRPCIe 热插拔中断插槽状态变化触发
网卡收到数据包外部硬件中断可屏蔽 INTRMSI-X 向量收包完成,DMA 后发中断叫醒 CPU
磁盘读写完成外部硬件中断可屏蔽 INTRIRQ14/15 或 NVMe MSI-XDMA 把数据搬完,发"完成"中断
时钟滴答外部硬件中断可屏蔽 INTRIRQ0 / Local APIC 定时器周期性中断,驱动进程调度
声卡 buffer 就绪外部硬件中断可屏蔽 INTR声卡 IRQ播放/录制的缓冲边界通知
显卡渲染完成外部硬件中断可屏蔽 INTRGPU MSI-XGPU 算完/VSync 通知
电源掉电不可屏蔽中断NMI(或 SMI)NMI 引脚致命,必须立即存盘/停机
内存 ECC/奇偶校验错不可屏蔽中断NMINMI 引脚内存数据损坏,紧急报警
看门狗超时不可屏蔽中断NMINMI 引脚系统卡死,强制复位
除零内部异常—(同步)向量 0(#DE)指令执行出错,故障类
缺页内部异常—(同步)向量 14(#PF)访问未映射页,故障类,可恢复
非法指令内部异常—(同步)向量 6(#UD)指令解码失败,故障/终止
系统调用软件陷阱—(同步/主动)syscall / int 0x80程序主动陷入内核,陷阱类
Ctrl+C(终端)外部硬件中断→信号可屏蔽 INTR键盘中断 → SIGINT硬件是键盘中断;结果以"信号"送达进程

避坑几个最容易混的点

Ctrl+C 到底算不算中断?

两个层面:硬件层它是一次普通的键盘中断(可屏蔽、外部硬件);但对进程而言,终端驱动识别到 Ctrl+C 后,会向前台进程发 SIGINT 信号。所以"中断"在前半段,"信号"在后半段——别把两者混为一谈。

"插外设"触发的是什么?

现代通用情况:USB 设备插入 → USB 主机控制器察觉端口状态变化 → 发外部硬件中断(可屏蔽)给 CPU → OS 枚举设备、加载驱动。注意:真正的"检测"在控制器里,CPU 是被中断叫去处理的;老式 PS/2 设备则只在开机自检时识别,运行中插拔并不产生中断。

MSI / MSI-X 还是"中断"吗?

是。逻辑上仍是外部硬件中断、可屏蔽,只是传递方式从"拉专用 IRQ 线"变成"设备往特定内存地址写一条消息",APIC 收到后转成带向量号的中断。网卡、显卡、NVMe 几乎都用 MSI-X,能支持成百上千个独立向量。

DMA 完成 = 中断?

DMA(直接内存访问)本身不是中断,它是"设备不麻烦 CPU、自己把数据搬进内存"的机制;但搬之后,设备会发一个外部硬件中断通知 CPU"好了,来处理吧"。所以常见搭配是:DMA 搬运 + 中断通知。

一句话总结分类:设备异步叫你 = 外部硬件中断(日常皆可屏蔽,掉电/ECC 走 NMI);指令执行出错 = 内部异常(缺页/除零可恢复,硬件故障终止);程序主动陷入 = 软件陷阱(系统调用)。三者都经"向量号→IDT→处理程序",所以统称中断系统。