处理器状态
中央处理器CPU由运算器、控制器、一系列的寄存器以及高速缓存构成。
两类寄存器:
- 用户可见寄存器:高级语言编译器通过优化算法分配并使用之,以减少程序访问内存的次数
- 控制和状态寄存器:用于控制处理器的操作,通常由操作系统使用
- 程序计数器PC
- 指令寄存器IR
- 程序状态字PSW
从操作系统的特征(并发、共享)考虑,需要硬件提供保护与控制机制:
- 处理器具有特权级别,能在不同的特权级运行不同的指令集合
- 硬件机制可将OS与用户程序隔离
硬件如何保护操作系统?
在程序状态字寄存器PSW中专门设置一位,根据运行程序对资源和指令的使用权限而设置不同的CPU状态。
操作系统需要两种CPU状态:
- 内核态:运行操作系统程序
- 用户态:运行用户程序
指令也被划分为两种:
- 特权指令:只能由操作系统使用
- 非特权指令:用户程序可以使用的指令,包括访管指令
CPU状态间的转换
-
用户态 \(\rightarrow\) 内核态
唯一途径:中断/异常/陷入机制
-
内核态 \(\rightarrow\) 用户态
设置程序状态字PSW
中断/异常机制介绍
中断/异常的概念:CPU对系统发生的某个事件作出的一种反应,改变了处理器的控制流
中断的引入:为了支持CPU和设备之间的并行操作
异常的引入:表示CPU执行指令时本身出现的问题
事件:
- 中断(外中断):外部事件,是正在运行的程序所不期望的
- I/O中断
- 时钟中断
- 硬件故障
- 异常(内中断):由正在执行的指令引发
- 系统调用
- 页故障
- 保护性异常(权限冲突)
- 断点异常
- 其他程序性异常(如算术溢出)
中断/异常机制工作原理
-
取指令
-
执行指令:在每条指令执行周期的最后时刻,CPU向各个设备的硬件接口发送中断查询信号
若此时一个接口的完成触发器D(标识设备和数据是否准备好)=1,屏蔽触发器MASK=0,则该接口的中断请求触发器INTR的输出被置为1。
所有接口的INTR信号会被送入链式排队器进行中断判优,在CPU的中断允许触发器EINT=1时,CPU对优先级最高的设备进行中断响应。
-
中断隐指令:
将断点PC进栈
关中断:中断允许触发器置为0
硬件把优先级最高的设备的中断触发器内容按规定编码送入程序状态字寄存器PSW的相应位,称为中断码,通过查中断向量表[1]引出中断处理程序
-
中断服务程序:
- 保护现场:将通用寄存器以及PSW的信息进栈
- 设备服务
- 恢复现场:将之前保存的寄存器的值出栈
- 中断返回:执行IRET指令,返回原程序断点
系统调用
系统调用是用户在编程时可以调用的操作系统功能,是操作系统提供给编程人员的唯一接口,它使CPU状态从用户态陷入内核态。
如何触发系统调用?
计算机对内存的使用是以段为单位的,整个系统中,存在一张全局描述符表GDT[2],它存放了每段内存的DPL[3],每次访问内存的时候,都要将DPL与存放在代码段寄存器CS中的CPL[4]相比较,当且仅当DPL\(\geq\)CPL时,才可以进行访问,这表示,接下来只能访问特权级别低于当前所处级别的内存(特权级别:0表示内核态,3表示用户态)。
给定程序
int main(){
printKernel();//打印内核空间的一条字符串
}
因为此程序处于用户态,且需要访问内核态,所以编译器编译代码时,会加入
陷入指令INT
此指令会将CPL置为0,系统进入内核态,触发系统调用,即下面的一系列操作
系统调用执行过程
- 中断/异常机制:硬件保护现场;通过查中断向量表把控制权转给系统调用总入口程序
- 系统调用总入口程序:保存现场;将系统调用的参数保存在内核栈里;通过查系统调用表把控制权转给相应的系统调用程序或内核函数
- 执行系统调用程序
- 恢复现场,返回用户程序