一、用户态与核心态
为了避免操作系统及其关键数据受到用户程序的破坏,通常需要将 CPU 的执行状态分成两种:用户态 与 核心态。
- 用户态:又称目态,是用户程序执行时机器所处的状态,具有较低的特权指令(只能由操作系统内核部分使用,不允许用户直接使用的指令)。它只能执行规定的指令,只能访问指定的寄存器和存储器。
- 核心态:又称管态、系统态,是操作系统管理程序执行时机器所处的状态,具有较高的特权,能够执行包括特权指令的一切指令,能访问寄存器和存储区。
通过划分核心态与用户态,这两类程序就被严格的区分了,从而在 CPU 执行时的优先级等将会有所不同。
二、中断与异常
在引入用户态与核心态这两种工作状态后,就需要考虑这两种状态之间的切换,让相关指令能够在用户态与核心态之间反复横跳。中断与异常就恰好能够解决这一问题,从而提高系统的资源利用率。
1、中断与异常的定义
中断(Interrupt)也称为外中断,是指来自 CPU 执行指令以外的事件的发生,比如设备发出的 I/O 结束中断,表示设备输入/输出处理已经完成,希望处理机能够向别的设备发出下一个输入/输出请求,同时让完成输入/输出后的程序继续执行。
异常(Exception)也称为内中断、例外或者陷入(trap),指源自 CPU 执行指令内部的事件,如程序的非法操作码、地址越界、算数溢出等等。
2、中断处理的过程
网上关于中断处理的过程有所不同,主要是其所占的软硬件角度不同,以及其所选的中断的开始不同,其原理都是大致相同的,主要分为以下部分:
⓪ 中断请求:某一中断源向 CPU 发起中断请求,对于外部中断 CPU 在当前指令最后一个时钟周期查询中断请求信号的。
硬件部分
① 关中断:CPU 响应中断后,首先要保护程序的现场状态,在保护现场的过程中,CPU 不应响应更高级中断源的中断请求;否则,现场保存不完整,中断结束后也就不能正确的恢复并执行现行程序。
② 保存断点:为了能够恢复到原来的程序,必须将原来的程序的断点(程序计数器 PC)保存起来。
③ 引出中断服务程序:取出中断服务程序的入口地址送入程序计数器 PC。
软件部分
④ 保存现场与屏蔽字:进入中断服务程序后,首先会保存现场(现场信息一般是指程序状态字寄存器 PSWR 和 某些通用寄存器的内容)。
⑤ 开中断:允许更高级的中断请求得到相应。
⑥ 执行中断服务程序:这是中断请求的目的。
⑦ 关中断:保证在恢复现场和屏蔽字时不被中断。
⑧ 恢复现场与屏蔽字:将现场和屏蔽字恢复到原来的状态。
⑨ 开中断、中断返回:中断服务程序的最后一条指令通常是一条中断返回指令,使其返回到原程序的断点处,以便继续执行原程序。