Appearance
异常和中断机制
2026 大纲 五(五)异常和中断机制:基本概念、分类、检测与响应——只到硬件负责的那一半。
这一节的分歧都来自一个问题:这件事能不能等
异常和中断的所有区别——什么时候检测、能不能屏蔽、处理完回哪里——都从同一个问题分叉出来:这件事是不是当前这条指令自己捅出来的。
🔴 来源不同,检测时机就不同。异常由当前指令自身引发、不处理就没法继续,所以必须在指令执行过程中检测,可能打断指令执行到一半;中断与当前指令无关、可以等,所以在指令执行结束后检测,因此总落在指令边界上。
同一个问题也决定了处理完之后回哪里。异常按"触发它的那条指令算不算已经完成"分成三类:
🔴 故障(fault)是"条件不具备"——缺页把页调进来之后原指令就能成功,所以重新执行原指令;自陷(trap)是"主动请求"——内核已经帮它做完了,所以接着执行下一条;终止(abort)是"无法收拾"——机器状态已不可信,重来或继续都没有意义。
这条判据还能直接回答一个高频判断:
🔴 Cache 缺失不需要异常处理,缺页需要。 判据是能不能由硬件独自解决:Cache 缺失由硬件自动调入 Cache 行、对软件完全透明;缺页要操作系统去调页面、改页表,所以必须以异常的形式陷入内核(属故障,处理完重新执行原指令)。
本篇后面几节就是把这条主线铺开:响应条件、中断隐指令、向量表、屏蔽字、流水线里的精确中断。
交互可视化
一、分类
中断是 CPU 对内外部事件的响应机制:暂停当前程序转去执行中断服务程序(ISR),处理完毕后返回。广义的"中断"按事件来源分两大类:
| 类型 | 又称 | 来源 | 举例 |
|---|---|---|---|
| 内中断(异常) | Exception | CPU 内部 | 除零、溢出、缺页、系统调用 |
| 外中断(中断) | Interrupt | CPU 外部 | I/O 完成、时钟、电源异常 |
异常按处理完之后返回哪里分三类:
| 类型 | 触发时机 | 处理后返回 | 举例 |
|---|---|---|---|
| 故障(Fault) | 指令执行过程中检测到 | 重新执行触发指令 | 缺页、非法操作码 |
| 自陷(Trap) | 指令执行后(主动触发) | 执行下一条指令 | 系统调用、断点指令 |
| 终止(Abort) | 严重错误 | 不返回,终止进程 | 硬件故障、双重错误 |
外中断按能否屏蔽分两类:
| 类型 | 特点 | 举例 |
|---|---|---|
| 可屏蔽中断(INTR) | 可通过中断允许标志 IF 屏蔽 | I/O 设备完成 |
| 不可屏蔽中断(NMI) | 不能被屏蔽,优先级最高 | 电源故障、硬件错误 |
二、检测与响应
响应一个可屏蔽中断必须同时满足三个条件,缺一不可:
| # | 条件(卡的是哪一环) | 由什么表示 |
|---|---|---|
| 1 | 中断源确实提出了请求(有没有事) | 该中断源的中断请求触发器为 1 |
| 2 | CPU 处于开中断状态(准不准打断) | 允许中断触发器 EINT(x86 中的 IF) |
| 3 | 一条指令执行完毕(打断安不安全) | 每条指令执行阶段结束前 CPU 发出中断查询信号 |
第 3 条是中断只能在指令边界响应的来源:指令执行到一半时中间结果散落在 MDR、暂存器里,无法准确保存现场。
这三条也正好定出异常与 NMI 的位置:
🔴 可屏蔽中断三条全要满足;异常绕开第 2、3 条(不受开 / 关中断控制,也不能等到指令结束);NMI 只绕开第 2 条,仍然在指令边界响应。归纳成两句话:"能不能等"决定检测时机,"要不要给程序留否决权"决定能不能屏蔽。
🔴 由此推出一条常被问反的:关中断之后 NMI 照样能进来。 关中断(IF
)只屏蔽可屏蔽中断。NMI 报告的是掉电这类不处理就来不及的事件,给程序留出屏蔽它的能力反而危险。
响应动作由中断隐指令完成,它做三件事:
| # | 动作 | 为什么必须在这里做 |
|---|---|---|
| 1 | 关中断 | 防止保存断点的过程本身被新中断打断 |
| 2 | 保存断点(PC、PSW) | 断点不保存就回不去;只能由硬件做,软件还没拿到控制权 |
| 3 | 形成中断服务程序入口地址并送 PC | 交出控制权 |
"通常由硬件"和"必须由硬件"是两个不同的问题:
| 工作 | 谁做 |
|---|---|
| 保存断点 | 只能硬件——软件此刻还没接管 |
| 关中断 | 硬件(隐指令),但 ISR 里也能用关中断指令,不是只能硬件 |
| 中断判优 | 硬件或软件:硬件排队器/菊花链可判优,软件查询法逐个轮询中断源同样可判优 |
| 保存通用寄存器、开中断 | 软件(ISR 保护现场、用开中断指令) |
这张表里有两条最容易答错:
🔴 中断隐指令不包含"保存通用寄存器"。 它是纯硬件行为,指令系统里并没有这么一条指令;保存通用寄存器是 ISR 里的"保护现场",由软件做。另外关中断必须排在第一位——保存断点期间若又响应中断,新断点会覆盖或错位,原程序再也回不去了。
🔴 "必须由硬件完成"的只有"保存断点"这一件。中断判优不属于"必须由硬件"——非向量中断就是用软件轮询各中断源来确定中断源与优先次序的。只要存在软件方案,就不能叫"必须由硬件"。

(袁春风《计算机组成与系统结构》第 3 版,见文末教材出处)
图给的是控制流怎么走:用户进程执行到第
三、中断服务程序:软件阶段
| 步骤 | 单级中断 | 多级中断(允许嵌套) |
|---|---|---|
| 1 | 保护现场 | 保护现场 |
| 2 | — | 开中断(这样更高优先级中断才能打进来) |
| 3 | 中断事件处理 | 中断事件处理 |
| 4 | — | 关中断(准备恢复现场,不能被打断) |
| 5 | 恢复现场 | 恢复现场 |
| 6 | 开中断 | 开中断 |
| 7 | 中断返回(IRET) | 中断返回(IRET) |
🔴 单级中断只在最后开一次中断。 它全程不允许被打断,所以中间那两次开 / 关中断都不需要:保护现场 → 事件处理 → 恢复现场 → 开中断(还原中断允许状态)→ 中断返回。⚠️ "保存断点"与"关中断"不在这个序列里——它们属于中断隐指令,ISR 开始之前硬件已经做完了。这一条被问到时,答案里多写"保存断点"就错了。
IRET 从栈中恢复 PC 和 PSW(含 IF 位)。ISR 运行在内核态,它要用的一批指令普通用户程序不许执行,即特权指令:
| 指令 | 是否特权 | 理由 |
|---|---|---|
| I/O 指令(IN / OUT) | 是 | 直接操作设备端口,乱用会破坏其他进程的设备状态 |
| 开中断 / 关中断指令 | 是 | 用户程序若能关中断,就能永久霸占 CPU |
| 中断返回指令(IRET) | 是 | 它会恢复 PSW,包括特权级字段——若用户可用,就能把自己提到内核态 |
| 停机、修改页表基址、加载 PSW | 是 | 同理 |
| 系统调用指令(陷入指令) | 否 | 它恰恰是给用户程序准备的入口 |
最后一行的逻辑是反的:正因为要保护内核,才必须留一扇由硬件把守的门,而这扇门本身对所有人开放。
在 ISR 执行中若发生更高处理优先级的中断,CPU 可暂停当前 ISR 转去处理它,即中断嵌套:
主程序 → 中断 A(低)→ 中断 B(高)→ 返回 A 继续 → 返回主程序四、中断向量与入口地址的形成
中断向量是 ISR 的入口地址;中断向量表以中断类型号为索引存放各中断向量,通常放在内存低地址区:
| 方式 | 做法 | 速度 |
|---|---|---|
| 向量中断 | 由中断类型号直接查表 | 快 |
| 非向量中断 | 由软件轮询各设备确定中断源,再转相应处理程序 | 慢 |
🔴 中断向量
向量地址,两者差一层间接。中断向量是 ISR 的入口地址,也就是表项的内容;向量地址是存放它的那个表项的地址。CPU 拿向量地址去访存,取出来的内容才是入口地址。这两个词只差一个字,考的就是这层间接。
🔴 另有一处方向容易搞反:EOI(中断结束命令)的方向是 CPU → 中断控制器,由 ISR 告诉控制器"这个中断处理完了,可以放行同级或更低级的中断"。不是外设 → CPU——外设只负责发中断请求,处理有没有结束只有 CPU 自己知道。
五、两种优先级与中断屏蔽字
| 由什么决定 | 能否改变 | 含义 | |
|---|---|---|---|
| 响应优先级 | 硬件排队器 | 不可改变 | 同时来了先响应谁 |
| 处理优先级 | 中断屏蔽字 | 可由软件调整 | 谁能打断谁 |
两者可以不一致:一个中断被优先响应,不代表处理过程中不会被别人打断。屏蔽字中每个中断源占一位,1 屏蔽、0 允许。
🔴 屏蔽字只与处理优先级有关,响应优先级完全不参与构造。 规则是:在第
级的中断服务程序里,屏蔽掉"处理优先级不高于自己"的所有中断,包括它自己——不屏蔽自己的话,同级中断会不断打断自己、无限嵌套下去。
⚠️ 位序要单独摆一遍。
最左边是 ,这个顺序与优先级顺序无关;算出"要屏蔽哪几级"之后,必须按下标把 1 填回对应的位上,不能按优先级顺序连着写。
顺带说清总体次序与嵌套条件。优先级的总体次序是内部异常
屏蔽字的三步构造法与一道完整演算(想核对"排序—定位—按位序回填"每一步时展开)
- 把处理优先级顺序从高到低排成一行
- 找到本级在这行里的位置
- 本级及其右边(处理优先级更低的)全部置 1,左边全部置 0;再按
的位序填进去
演算。 五级中断
第 1 步,处理优先级从高到低排开:
| 位 | |||||
|---|---|---|---|---|---|
| 对应 | |||||
| 取值 | 0 | 1 | 0 | 1 | 0 |
全程没有用到响应优先级——它只决定"同时来了先响应谁"。第 3 步的回填是最容易错的一步:算出"要屏蔽
六、流水线中的精确中断
流水线里同一时刻有多条指令处于不同阶段,可能同时产生异常,且发生顺序未必等于程序顺序。
🔴 精确中断必须等到 WB 段才处理。 只有到了 WB 段,才能确定这条指令前面的所有指令都已完成(流水线按序推进);若在 EX 段一发现溢出就立刻处理,它前面可能还有指令停在 MEM 段没做完。这与超标量的"无序执行、按序提交"是同一个思路。
精确中断的两条要求、实现方式与各段可能产生的异常(想弄清"标记而不立即处理"具体怎么做时展开)
精确中断要求两条:① 异常指令之前的所有指令都已完成(结果已写回);② 异常指令及其之后的指令都没有修改机器状态。
实现方式是异常发生后只标记不立即处理,等它到达 WB 段再统一处理——之前的指令正常完成,之后的全部冲刷。
各段可能产生的异常:IF 取指地址未对齐、取指缺页;ID 非法操作码;EX 算术溢出、地址计算错误;MEM 数据地址未对齐、数据缺页;WB 一般不产生异常。
中断方式的 CPU 占比公式(属大纲六(三)I/O 方式,想顺带核对 u 取什么值时展开)
响应与处理一次中断要花掉若干个时钟周期,设备越快、中断越频繁,CPU 被占用的比例越高:
其中
考点速记
- 异常在指令执行过程中检测、中断在指令结束后检测;三种异常的返回方式取决于触发它的指令算不算已完成(故障重执行、自陷执行下一条、终止不返回)。响应可屏蔽中断要同时满足有请求、开中断、一条指令执行完毕,异常绕开后两条、NMI 绕开"开中断"这条。
- 中断隐指令由硬件自动做三件事:关中断 → 保存断点 → 形成入口地址送 PC,不含保存通用寄存器;两阶段划分是检测与响应由硬件、具体处理由软件,而只能由硬件完成的只有"保存断点"——中断判优软硬件都能做。
- 响应优先级由硬件排队器定且不可改,处理优先级由屏蔽字定且可调;屏蔽字屏蔽"处理优先级不高于本级"的所有中断(含自己),再按
位序回填。精确中断等到 WB 段才处理,因为只有此时才能确定前面的指令全部完成。
这一节在真题里被考过的形式(下方「真题练习」逐题对应):
- 问哪些工作"必须由硬件完成":只有保存断点。关中断硬件做但 ISR 也能做,中断判优软硬件都能做(非向量中断就是软件轮询),保存通用寄存器是软件的事。
- 问中断隐指令包含哪些动作:关中断、保存断点、形成入口地址送 PC 三件。⚠️ 把"保存通用寄存器"算进去就错了,那是 ISR 的保护现场。
- 问单级中断的服务程序执行顺序:保护现场 → 事件处理 → 恢复现场 → 开中断 → 中断返回。⚠️ 保存断点与关中断不在这个序列里,它们在 ISR 开始前就由硬件做完了。
- 给响应优先级与处理优先级,求某级中断服务程序中的屏蔽字:三步——按处理优先级从高到低排开、找到本级位置、本级及右边全置 1,最后按下标回填到
。响应优先级不参与。 - 挑关于异常与中断的错误叙述:常设的错点有"关中断后 NMI 也不能响应"(错,NMI 不可屏蔽)、"中断向量就是向量地址"(错,差一层间接)、"EOI 由外设发给 CPU"(错,方向是 CPU → 中断控制器)、"缺页处理完执行下一条指令"(错,故障要重执行原指令)。
- 问哪个事件不需要异常处理 / 不在 MMU 地址转换过程中检测:Cache 缺失——它由硬件自动解决、对软件透明。缺页、越权、TLB 缺失都要。
- 问数据通路是否包含异常检测电路:包含。溢出、地址越界这些信号就是从运算与访存路径上引出来的。
易错:把"保存通用寄存器"算进中断隐指令。
易错:答"中断判优必须由硬件"。软件轮询同样能判优。
易错:单级中断的服务程序里多写了"保存断点"或"关中断"。
易错:构造屏蔽字时用了响应优先级,或算完不按下标回填。
易错:认为关中断能挡住 NMI。IF 只管可屏蔽中断。
教材出处
- 异常和中断的处理过程(图 5.30)、"检测与响应由硬件、具体处理由软件"的两阶段划分:袁春风《计算机组成与系统结构》第 3 版 §5.4.1 CPU 对异常和中断的处理,印刷页 p158
相关知识
程序查询方式与程序中断方式|I/O 方式对比|指令执行过程|流水线性能分析与多发射技术