发生中断或异常时,运行用户态的 CPU 会立即进入核心态,转换的过程通过硬件实现。
故障和自陷异常是软件中断,终止异常和外部中断是硬件中断。
Tip
Cache 缺失不需要中断和异常,由硬件自动实现。
中断处理需要保存 PC 和 PSW,但是子程序调用不需要保存 PSW,因为子程序调用是主动可控的行为,主动调用说明 PSW 已经没用了。
中断(外中断)
是指来自 CPU 执行指令外部的事件引起的,通常用于信息输入/输出。
外中断分为可屏蔽中断 (INTR) 和不可屏蔽中断 (NMI),NMI 通常是紧急的硬件故障:如电源掉电等。
不可屏蔽中断 NMI
NMI 由于随时有可能触发,不需要等到指令执行完,所以没有响应周期,直接进入处理周期。
常见的中断有:I/O 结束中断、时钟中断。
时钟中断
时钟中断的主要工作是处理和时间有关的信息以及决定是否执行调度程序,和时间有关的所有信息,包括系统时间、进程的时间片、延时、使用CPU的时间、各种定时器。
中断响应的条件
- CPU 处于“开中断”状态
- 至少要有一个未被屏蔽的中断请求
- 当前指令刚执行完(处于指令的中断响应周期)
异常(内中断)
异常均不能被屏蔽。
异常分为:故障、自陷和终止。
故障:通常是由指令执行引起的异常。如非法操作码、缺页故障、除数为 0、运算溢出等。
自陷(访管指令):是一种事先安排的“异常”事件,用于在用户态下调用操作系统内核程序。如条件陷阱指令、系统调用指令。
终止:使 CPU 无法继续执行的硬件故障,如控制器出错、存储器校验错等。
中断处理过程
Tip
中断允许触发器:控制开关中断; 中断请求触发器:控制此时是否有中断请求。
- 中断响应(硬件隐指令)
- 关中断(中断允许触发器置 0)
- 保存断点(保存到系统堆栈),主要的是PSW和PC
- 中断服务程序寻址
- 软件识别方式:设置一个异常状态寄存器,记录异常原因,操作系统按优先级顺序查询,调出优先级最高的异常的处理程序
- 硬件识别方式:也称向量中断。中断向量表格式为<中断类型号,中断向量>,通过类型号查询到中断向量(处理程序的首地址)
- 中断处理程序(软件)
- 保存现场和屏蔽字
- 开中断(中断允许触发器置 1)(仅在多级中断系统中)
- 执行对应处理程序
- 关中断(中断允许触发器置 0)(仅在多级中断系统中)
- 恢复现场和屏蔽字
- 开中断(中断允许触发器置 1)
- 中断返回
中断优先级
- 不可屏蔽中断>内部异常>可屏蔽中断
- 内部异常中,硬件故障>软件中断
- DMA 中断请求>I/O 设备的中断请求
- I/O 传送类中断中,高速设备>低速设备
- 输入设备>输出设备
- 实时设备>普通设备
中断屏蔽技术
每个中断源都有一个屏蔽触发器 MASK,1 表示屏蔽该中断源的请求,0 表示不屏蔽,所有触发器组合在一起就是一个屏蔽字寄存器。
例子:优先级 A>B>C>D,要将中断处理次序改为 D>A>C>B,则每个中断源的屏蔽字为
中断源/屏蔽字 | A | B | C | D |
---|---|---|---|---|
A | 1 | 1 | 1 | 0 |
B | 0 | 1 | 0 | 0 |
C | 0 | 1 | 1 | 0 |
D | 1 | 1 | 1 | 1 |
Tip
屏蔽后无法收到该中断源的请求,若检测到请求则表示未被屏蔽,一定会进行中断响应。
中断优先级
中断屏蔽技术决定了处理优先级(软件实现,可修改)。 排队器决定了响应优先级(硬件实现,不可修改)。
请求优先级是“进入队列时的门槛”。 处理优先级是“实际处理中断的关键”。
Tip
处理优先级决定了整个中断处理结束的先后顺序。
如下,在响应阶段,虽然 A 先被响应,但是 C 先处理完,然后是 A,然后 B 被响应后,D 先处理完,最后才是 B,整个顺序还是和处理优先级一致。