Appearance
异常和中断处理
大纲定位
五(五)异常和中断机制
要求:掌握异常与中断的基本概念、分类,以及检测与响应的过程。注意本条只到"检测与响应"为止,中断的具体 I/O 处理流程归到大纲六(三)。
考情分析
异常和中断处理在408中以选择题为主,常考"属于哪类中断""中断响应时保存什么""中断屏蔽的作用"。与操作系统章节高度关联,理解硬件机制有助于理解OS的进程调度和设备管理。
基本概念
中断(Interrupt):CPU 对系统内外部事件的响应机制,暂停当前程序,转而执行中断服务程序(ISR),处理完毕后返回原程序继续执行。
广义上,"中断"分为两类:
| 类型 | 又称 | 来源 | 举例 |
|---|---|---|---|
| 内中断(异常) | Exception / Trap | CPU 内部 | 除零、溢出、缺页、系统调用 |
| 外中断(中断) | Interrupt | CPU 外部 | I/O完成、时钟、电源异常 |
异常(内中断)的分类
| 类型 | 触发方式 | 处理后返回 | 举例 |
|---|---|---|---|
| 故障(Fault) | 指令执行过程中检测到 | 重新执行触发指令 | 缺页错误、非法操作码 |
| 自陷(Trap) | 指令执行后 | 执行下一条指令 | 系统调用(int指令)、断点 |
| 终止(Abort) | 严重错误 | 不返回,终止进程 | 硬件故障、双重错误 |
外中断的分类
| 类型 | 特点 | 举例 |
|---|---|---|
| 可屏蔽中断(INTR) | 可通过中断允许标志 IF 屏蔽 | I/O 设备完成 |
| 不可屏蔽中断(NMI) | 不能被屏蔽,优先级最高 | 电源故障、硬件错误 |
中断响应过程:中断隐指令
中断响应由硬件自动完成(在每条指令执行结束后检测)。这一串硬件动作有个专门名字:
中断隐指令
中断隐指令指 CPU 响应中断时由硬件自动执行的一系列操作。它叫"指令",但指令系统里并没有这条指令,程序员也写不出它——它是硬件行为,只是借用了"指令"这个说法。
它完成三件事,一件不多一件不少:
| # | 动作 | 为什么必须在这里做 |
|---|---|---|
| 1 | 关中断 | 防止保存断点的过程本身被新中断打断 |
| 2 | 保存断点(PC、PSW) | 断点不保存就回不去;这一步必须由硬件做,因为软件还没拿到控制权 |
| 3 | 形成中断服务程序入口地址并送 PC | 交出控制权 |
不包括保存通用寄存器——那是 ISR 里的"保护现场",由软件完成。这是最常被混进来的一项。
这三件事被反复以三种问法考:「中断隐指令完成哪些操作」「中断响应阶段 CPU 做了什么」「哪些工作必须由硬件完成」。答案是同一串。
哪些工作"必须"由硬件完成
问"必须由硬件完成"时,要比中断隐指令的三条更严一层:
| 工作 | 谁做 | 说明 |
|---|---|---|
| 保存断点 | 只能硬件 | 软件此刻还没接管,无从下手 |
| 关中断 | 硬件(隐指令),但 ISR 里也能用关中断指令 | 不是只能硬件 |
| 中断判优 | 硬件或软件 | 硬件排队器/菊花链可以判优;软件查询法(非向量中断,逐个轮询中断源)同样可以判优。所以它不是"必须由硬件" |
| 保存通用寄存器 | 软件(ISR 保护现场) | |
| 开中断 | 软件(ISR 里用开中断指令) |
判优那一栏是这类题的分水岭:很多人记住"响应优先级由硬件排队器决定"就选了它。"通常由硬件"和"必须由硬件"是两回事——只要存在软件实现方案,就不能叫"必须"。
中断服务程序的执行
中断服务程序(ISR)由软件完成。注意单级中断(不允许嵌套)和多级中断(允许嵌套)的步骤不一样:
| 步骤 | 单级中断 | 多级中断(允许嵌套) |
|---|---|---|
| 1 | 保护现场 | 保护现场 |
| 2 | — | 开中断(这样更高优先级中断才能打进来) |
| 3 | 中断事件处理 | 中断事件处理 |
| 4 | — | 关中断(准备恢复现场,不能被打断) |
| 5 | 恢复现场 | 恢复现场 |
| 6 | 开中断 | 开中断 |
| 7 | 中断返回(IRET) | 中断返回(IRET) |
单级中断的顺序为什么是这样
单级中断全程不允许被打断,所以中间那两次开/关中断都不需要。"开中断"只出现在最后、紧挨着中断返回之前——目的是把中断允许状态还原,让后续程序还能响应中断。
所以单级中断 ISR 内的顺序是:
保存断点和关中断不在这个序列里——它们属于中断隐指令,在 ISR 开始之前就由硬件做完了。题目把七个动作打乱让你排序时,第一步要做的是先把这两个划掉。
IRET 指令从栈中恢复 PC 和 PSW(含 IF 位),返回被中断程序。
中断结束信号(EOI)是谁发给谁的
方向别搞反
EOI(中断结束命令)是 CPU / 中断服务程序发给中断控制器的,告诉它"这个中断我处理完了,可以放行同级或更低级的中断了"。
方向是 CPU
外设只会通过中断控制器向 CPU 发中断请求信号,它没有"通知 CPU 处理结束"这回事——处理结束与否只有 CPU 自己知道。所以"外部设备通过中断控制器向 CPU 发中断结束信号"是错误说法。
特权指令
驱动程序和中断服务程序运行在内核态,它们要用的一批指令普通用户程序不许执行,这类指令叫特权指令。
| 指令 | 是否特权 | 理由 |
|---|---|---|
| I/O 指令(IN / OUT) | 是 | 直接操作设备端口,用户程序乱用会破坏其他进程的设备状态 |
| 开中断 / 关中断指令 | 是 | 用户程序若能关中断,就能永久霸占 CPU |
| 中断返回指令(IRET) | 是 | 它会恢复 PSW,包括特权级字段——若用户可用,就能把自己提到内核态 |
| 停机指令、修改页表基址、加载 PSW | 是 | 同理 |
| 系统调用指令(陷入指令 / trap) | 否 | 它恰恰是给用户程序准备的入口:用户态执行它,由硬件把控制权交给内核 |
系统调用指令为什么必须是非特权的
如果连"请求进入内核"这个动作都要特权,用户程序就永远进不了内核态了——那整个系统调用机制根本无法启动。
所以逻辑是反的:正因为要保护内核,才必须留一扇由硬件把守的门,而这扇门本身对所有人开放。 陷入指令就是这扇门。

(袁春风《计算机组成与系统结构》第 3 版,见文末教材出处)
这张图给的是控制流怎么走:用户进程执行到第
教材在这里定了一条很重要的分界:整个中断处理分两大阶段——① 检测和响应,由硬件完成;② 具体的处理过程,由软件完成。大纲五(五)只要求到"检测与响应",也就是硬件那一半。
图右下角那三个返回选项正是常考点,对应异常的三种类型:
| 返回方式 | 对应类型 | 例子 |
|---|---|---|
| 返回到当前指令重新执行 | 故障(fault) | 缺页、除数为 0 之外的可恢复错误 |
| 返回到下一条指令 | 陷阱(trap,自陷) | 系统调用、断点指令 |
| 不返回,终止进程 | 终止(abort) | 硬件故障等不可恢复错误 |
中断向量表
中断向量:中断服务程序的入口地址。
中断向量表:以中断类型号为索引,存储各中断向量的表格,通常放在内存低地址区(如 x86 实模式下的 0x0000)。
中断类型号 → 查中断向量表 → 中断服务程序入口地址 → 跳转执行确定中断服务程序入口地址的方法:
- 向量中断:由中断类型号直接查表,速度快
- 非向量中断:由软件轮询各设备确定中断源,再转相应处理程序,速度慢
中断优先级
当多个中断同时发生时,按优先级顺序响应:
一般优先级顺序(由高到低):
内部异常优先级最高,因为它直接由当前执行的指令引发,必须立即处理(如缺页故障不处理,指令就无法继续)。注意分层表述:内部异常与外中断比较时内部异常在前;在外中断内部,NMI 优先级高于可屏蔽中断。
可屏蔽中断内部的优先级可通过中断屏蔽字调整。
中断嵌套
在执行中断服务程序过程中,若发生更高优先级的中断,CPU 可暂停当前 ISR 转去处理更高优先级的中断,这称为中断嵌套。
条件:当前 ISR 中已开中断(IF=1),且新中断的优先级更高。
主程序 → 中断A(低优先级) → 中断B(高优先级) → 返回A继续 → 返回主程序每次嵌套都需要额外的栈空间保存断点,嵌套深度受栈大小限制。
中断屏蔽字
中断屏蔽字用于控制可屏蔽中断之间的优先级关系。每个中断源对应屏蔽字中的一位:
- 该位为 1 表示屏蔽对应中断(不响应)
- 该位为 0 表示允许对应中断
通过设置不同的中断屏蔽字,可以实现:
- 同级中断互相屏蔽
- 高优先级中断可以打断低优先级中断
- 调整中断处理的实际优先顺序
注意区分:响应优先级由硬件排队器决定,不可改变;处理优先级由屏蔽字决定,可通过软件调整。
怎么把屏蔽字写出来
一条规则就够
在第
写成判据:
为什么要屏蔽自己:否则同级中断会不断打断自己,无限嵌套。
三步走:
- 把题目给的处理优先级顺序抄下来,从高到低排成一行。
- 找到本级在这行里的位置。
- 本级及其右边(处理优先级更低的)全部置 1,左边全部置 0;再按
的位序填进去。
第 3 步的位序最容易错
屏蔽字写成
算完"哪几级要屏蔽"之后,一定要按下标重新摆位,别顺手把优先级顺序当成位顺序抄下去。
例:五级中断
解:
第 1 步,处理优先级从高到低:
第 2 步,
第 3 步,屏蔽
| 位 | |||||
|---|---|---|---|---|---|
| 屏蔽 | |||||
| 取值 | 0 | 1 | 0 | 1 | 0 |
屏蔽字 =
注意响应优先级那一行在本题里完全没用上——它只决定"同时来了先响应谁",不参与屏蔽字的构造。题目给它就是为了干扰。
中断方式下 CPU 占用率的计算
中断章节唯一的计算题型,三步:
每秒中断多少次
由数据缓冲寄存器的宽度决定:32 位缓冲寄存器一次搬 4 字节, 。默认按 1 字节算是最常见的错。 每秒花掉的时钟周期
中断次数 每次中断开销(周期数) 占比
例:CPU 主频 1GHz,设备接口的数据缓冲寄存器为 32 位,设备数据传输率 50KB/s,每次中断开销(响应 + 处理)1000 个时钟周期。求 CPU 用于该设备 I/O 的时间占比。
解:缓冲寄存器 32 位
若漏看"32 位"直接按
算,会得到 5%——正好是另一个选项。题面给出缓冲寄存器/端口宽度,就是在给 。
三种 I/O 方式的占用率横向对比(含程序查询、DMA)见 I/O 方式对比。
流水线中的精确中断
流水线使异常处理变得复杂:同一时刻有多条指令处于不同阶段,可能同时产生异常。
精确中断要求:
- 异常指令之前的所有指令都已完成(结果已写回)
- 异常指令及其之后的指令都没有修改机器状态
实现方式:异常发生后,标记但不立即处理,等到该指令到达 WB 阶段时再统一处理。之前的指令正常完成,之后的指令全部冲刷。
各流水线阶段可能产生的异常:
| 阶段 | 可能的异常 |
|---|---|
| IF | 取指地址未对齐、取指缺页 |
| ID | 非法操作码 |
| EX | 算术溢出、地址计算错误 |
| MEM | 数据地址未对齐、数据缺页 |
| WB | 一般不产生异常 |
交互可视化
例题
例1:以下事件分别属于哪种异常类型?(a) 执行除法指令时除数为0 (b) 程序执行 syscall 指令 (c) 访存时发现页面不在内存中 (d) 检测到总线奇偶校验错误
解:(a) 除零——故障(Fault),处理后可重新执行该除法指令(实际中通常终止进程)。(b) syscall——自陷(Trap),是程序主动触发的,处理后返回下一条指令。(c) 缺页——故障(Fault),OS调入页面后重新执行引起缺页的指令。(d) 总线校验错——终止(Abort),不可恢复的硬件错误。
例2:某系统中断向量表从地址 0x0000 开始,每个表项占 4 字节。中断类型号为 14 的中断服务程序入口地址存放在什么位置?
解:地址 =
即中断向量表中地址 0x0038~0x003B 处存放的 4 字节就是 14 号中断服务程序的入口地址。CPU 读取该地址的内容送入 PC,即可跳转到对应的中断服务程序。
例3:在五段式流水线中,IF阶段的指令
解:按程序顺序,
易混淆知识点
1. 异常和中断有什么区别?
异常(内中断)由 CPU 内部事件引起(执行指令过程中产生),如除零、缺页、非法指令,与当前指令直接相关。中断(外中断)由 CPU 外部设备引起(I/O 完成、定时器),与当前指令无关。异常在指令执行过程中被检测,中断在指令执行结束后被检测。
2. 缺页属于中断还是异常?
缺页属于异常(内中断)中的故障(Fault)。它在 MEM 阶段发现页面不在主存中时产生,与当前正在执行的访存指令直接相关。处理完缺页后,CPU 重新执行引起缺页的那条指令。
3. Cache 缺失需要异常处理吗?
不需要。Cache 缺失由硬件自动处理(从主存调入 Cache 行),对软件完全透明,不涉及操作系统内核。而缺页需要操作系统介入(调页面、更新页表),是一种异常。
4. 自陷(Trap)是"自愿"的中断吗?
是的。自陷是程序通过执行特定指令(如 syscall、INT n)主动触发的,CPU 据此进入内核态。因此自陷的发生时机是确定的(程序员写了 syscall 就一定触发),与随机发生的外部中断不同。
考点清单
- 异常(内中断)在指令执行过程中检测,中断(外中断)在指令结束后检测
- 故障(Fault):返回后重新执行触发指令(缺页就是这样)
- 自陷(Trap):返回后执行下一条指令(系统调用 syscall)
- 终止(Abort):不可恢复的硬件故障,不返回
- 中断隐指令(硬件自动完成)三件事:关中断、保存断点、形成入口地址送 PC——不含保存通用寄存器
- 保护/恢复现场是软件(ISR)行为;关中断发生在保存断点之前
- "必须由硬件完成"的只有保存断点;中断判优硬件软件都能做,不算"必须"
- 单级中断 ISR 顺序:保护现场 → 处理 → 恢复现场 → 开中断 → 中断返回
- EOI 是 CPU 发给中断控制器的,不是外设发给 CPU
- 系统调用(陷入)指令不是特权指令;I/O 指令、开/关中断、中断返回指令都是
- 屏蔽字:屏蔽处理优先级不高于本级的所有中断(含自己),再按
的位序填 - 中断方式 CPU 占比
, 由数据缓冲寄存器宽度决定 - NMI(不可屏蔽中断)不受 IF 标志控制,在外中断中优先级最高
- 中断向量表以中断类型号为索引,存放 ISR 入口地址
- Cache 缺失由硬件处理,缺页由操作系统处理(触发异常)
真题练习
相关真题(21题)
教材出处
- 异常和中断的处理过程(图 5.30)、"检测与响应由硬件、具体处理由软件"的两阶段划分:袁春风《计算机组成与系统结构》第 3 版 §5.4 带异常处理的处理器设计 · 5.4.1 CPU 对异常和中断的处理,印刷页 p158