Skip to content

异常和中断处理

考情分析

异常和中断处理在408中以选择题为主,常考"属于哪类中断""中断响应时保存什么""中断屏蔽的作用"。与操作系统章节高度关联,理解硬件机制有助于理解OS的进程调度和设备管理。

基本概念

中断(Interrupt):CPU 对系统内外部事件的响应机制,暂停当前程序,转而执行中断服务程序(ISR),处理完毕后返回原程序继续执行。

广义上,"中断"分为两类:

类型又称来源举例
内中断(异常)Exception / TrapCPU 内部除零、溢出、缺页、系统调用
外中断(中断)InterruptCPU 外部I/O完成、时钟、电源异常

异常(内中断)的分类

类型触发方式处理后返回举例
故障(Fault)指令执行过程中检测到重新执行触发指令缺页错误、非法操作码
自陷(Trap)指令执行执行下一条指令系统调用(int指令)、断点
终止(Abort)严重错误不返回,终止进程硬件故障、双重错误

外中断的分类

类型特点举例
可屏蔽中断(INTR)可通过中断允许标志 IF 屏蔽I/O 设备完成
不可屏蔽中断(NMI)不能被屏蔽,优先级最高电源故障、硬件错误

中断响应过程

中断响应由硬件自动完成(在每条指令执行结束后检测):

  1. 关中断:清除中断允许标志(IF=0),防止响应过程被打断
  2. 保存断点:将当前 PC(指向被中断指令的下一条)压入栈,保存程序状态(PSW)
  3. 识别中断:找到中断服务程序的入口地址
  4. 跳转:将中断服务程序入口地址送入 PC

中断服务程序的执行

中断服务程序(ISR)由软件完成:

  1. 保护现场:将可能用到的寄存器值压栈(或保存到中断服务区)
  2. 开中断(可选):若允许中断嵌套,重新开启中断
  3. 处理中断:执行实际的中断处理逻辑
  4. 关中断:关闭中断,准备恢复现场
  5. 恢复现场:从栈中弹出寄存器值
  6. 开中断 + 中断返回:执行 IRET 指令,从栈中恢复 PC 和 PSW,返回被中断程序

中断向量表

中断向量:中断服务程序的入口地址。

中断向量表:以中断类型号为索引,存储各中断向量的表格,通常放在内存低地址区(如 x86 实模式下的 0x0000)。

中断类型号 → 查中断向量表 → 中断服务程序入口地址 → 跳转执行

确定中断服务程序入口地址的方法:

  1. 向量中断:由中断类型号直接查表,速度快
  2. 非向量中断:由软件轮询各设备确定中断源,再转相应处理程序,速度慢

中断优先级

当多个中断同时发生时,按优先级顺序响应:

一般优先级顺序(由高到低):

内部异常(故障/自陷/终止)>不可屏蔽中断>可屏蔽中断

内部异常优先级最高,因为它直接由当前执行的指令引发,必须立即处理(如缺页故障不处理,指令就无法继续)。

可屏蔽中断内部的优先级可通过中断屏蔽字调整。

中断嵌套

在执行中断服务程序过程中,若发生更高优先级的中断,CPU 可暂停当前 ISR 转去处理更高优先级的中断,这称为中断嵌套

条件:当前 ISR 中已开中断(IF=1),且新中断的优先级更高。

主程序 → 中断A(低优先级) → 中断B(高优先级) → 返回A继续 → 返回主程序

每次嵌套都需要额外的栈空间保存断点,嵌套深度受栈大小限制。

中断屏蔽字

中断屏蔽字用于控制可屏蔽中断之间的优先级关系。每个中断源对应屏蔽字中的一位:

  • 该位为 1 表示屏蔽对应中断(不响应)
  • 该位为 0 表示允许对应中断

通过设置不同的中断屏蔽字,可以实现:

  • 同级中断互相屏蔽
  • 高优先级中断可以打断低优先级中断
  • 调整中断处理的实际优先顺序

注意区分:响应优先级由硬件排队器决定,不可改变;处理优先级由屏蔽字决定,可通过软件调整。

流水线中的精确中断

流水线使异常处理变得复杂:同一时刻有多条指令处于不同阶段,可能同时产生异常。

精确中断要求:

  1. 异常指令之前的所有指令都已完成(结果已写回)
  2. 异常指令及其之后的指令都没有修改机器状态

实现方式:异常发生后,标记但不立即处理,等到该指令到达 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 的中断服务程序入口地址存放在什么位置?

解:地址 = 0x0000+14×4=0x0038

即中断向量表中地址 0x0038~0x003B 处存放的 4 字节就是 14 号中断服务程序的入口地址。CPU 读取该地址的内容送入 PC,即可跳转到对应的中断服务程序。

例3:在五段式流水线中,IF阶段的指令 I3 发生取指缺页,同时MEM阶段的指令 I1 发生数据缺页。应先处理哪个?

解:按程序顺序,I1I3 之前。精确中断要求按程序顺序处理,因此先处理 I1 的数据缺页。I1 之后的所有指令(包括 I2I3)被冲刷。I1 的缺页处理完后,从 I1 重新开始执行(Fault 返回当前指令)。

易混淆知识点

1. 异常和中断有什么区别?

异常(内中断)由 CPU 内部事件引起(执行指令过程中产生),如除零、缺页、非法指令,与当前指令直接相关。中断(外中断)由 CPU 外部设备引起(I/O 完成、定时器),与当前指令无关。异常在指令执行过程中被检测,中断在指令执行结束后被检测。

2. 缺页属于中断还是异常?

缺页属于异常(内中断)中的故障(Fault)。它在 MEM 阶段发现页面不在主存中时产生,与当前正在执行的访存指令直接相关。处理完缺页后,CPU 重新执行引起缺页的那条指令。

3. Cache 缺失需要异常处理吗?

不需要。Cache 缺失由硬件自动处理(从主存调入 Cache 行),对软件完全透明,不涉及操作系统内核。而缺页需要操作系统介入(调页面、更新页表),是一种异常。

4. 自陷(Trap)是"自愿"的中断吗?

是的。自陷是程序通过执行特定指令(如 syscall、INT n)主动触发的,CPU 据此进入内核态。因此自陷的发生时机是确定的(程序员写了 syscall 就一定触发),与随机发生的外部中断不同。

考点清单

  • 异常(内中断)在指令执行过程中检测,中断(外中断)在指令结束后检测
  • 故障(Fault):返回后重新执行触发指令(缺页就是这样)
  • 自陷(Trap):返回后执行下一条指令(系统调用 syscall)
  • 终止(Abort):不可恢复的硬件故障,不返回
  • 中断响应是硬件行为;保护/恢复现场是软件(ISR)行为
  • 关中断操作发生在保存断点之前(防止断点保存过程被打断)
  • NMI(不可屏蔽中断)不受 IF 标志控制,优先级最高
  • 中断向量表以中断类型号为索引,存放 ISR 入口地址
  • Cache 缺失由硬件处理,缺页由操作系统处理(触发异常)

真题练习

相关真题(11题)

2026Q21选择题2分

I/O相关指令中特权指令与非特权指令的区分

2024Q21选择题2分

中断I/O方式中屏蔽字与中断响应过程辨析

2023Q21选择题2分

异常与中断的检测时机及处理流程

2021Q21选择题2分

异常处理后需要重新执行当前指令的情况

2020Q18选择题2分

自陷(Trap)的性质与处理流程

2020Q20选择题2分

外部中断与内部异常的区分

2020Q21选择题2分

可屏蔽中断与不可屏蔽中断的响应机制

2019Q14选择题2分

缺页异常的检测与处理流程

2011Q19选择题2分

指令周期与访存、中断的关系

2011Q21选择题2分

中断屏蔽字的设置方法

2010Q21选择题2分

单级中断系统中断服务程序的执行顺序