程序状态字PSW和程序计数器PC
PSW
程序状态字是一个寄存器或一组标志位的集合,用于反映 CPU 当前操作的状态和控制 CPU 的某些操作模式。主要包含了一些标志位信息,常见的如 进位标志 (C),零标志 (Z),符号标志 (S/N),溢出标志 (O/V);以及一些控制信息,常见的如 中断允许标志 (I)(是全局性的控制,与中断屏蔽字不同。中断屏蔽字用于控制对具体的不同中断源的响应,且不保存在PSW中),CPU运行模式等
PC
PC的作用比较简单,就是存放下一条将要被执行指令的内存地址,因此PC的值需要经常刷新。在部分操作系统中,PC负责的部分可以保存在PSW中,这也是为什么维基百科说“它经常包含一个指向下一条需要被执行指令的指针。”但实际上这个描述我认为不准确,因为PC需要频繁刷新,放在PSW中就不那么灵活了,现代大部分操作系统也是独立保存PC。
CPU运行模式的切换
操作系统不允许用户程序实现内核态的功能,用户程序需要使用内核态的功能时,只能通过中断或者异常切换CPU的运行模式。系统调用也可能从用户态切换到内核态,但实际上是产生了自陷(Trap)异常。
中断
中断是来自CPU外部的、异步事件产生的来自硬件设备的信号,用于请求CPU处理。是硬件产生的中断。
异常
异常是来自CPU内部的、同步的错误或者特殊事件。可以分为故障(Fault):如缺页异常、自陷(Trap):如系统调用、终止(Abort),其中 终止(Abort)是由于硬件故障导致的,前两者是由软件导致的中断。
注:访管指令是专门用于系统调用的指令,执行之后产生一个Trap异常。
外中断是随机的,内部中断(异常)是条件满足执行到当前指令必然发生的。
CPU运行模式的切换(假设从用户态到内核态)
- (系统调用传递系统调用参数,然后执行trap指令产生异常)
- 产生异常或中断;
- 硬件打断用户程序;(中断隐指令)
- 硬件保护现场,主要是PC和PSW和栈指针;(中断隐指令)
- 硬件找到中断信号对应的中断向量,指明中断服务的入口地址;(中断隐指令)
- 硬件清除PSW中的中断允许标志,并将CPU模式改为内核态;(中断隐指令)
- 执行操作系统内核的系统调用入口程序,保存通用寄存器的内容;(内核态)
- 可能打开中断执行服务,与硬件交互;(内核态)
- 执行中断信号对应的中断服务;(内核态)
- 恢复通用寄存器,执行特权返回指令;(内核态)
- 硬件恢复现场,打开中断;
- 返回用户态,回复用户栈指针;
注:中断和异常发生时,CPU既可能处于内核态,也可能处于用户态,取决于CPU正在处理的任务。
当系统添加新类型的设备时,需要注册相应的中断服务例程。
Gemini基于以上内容更详细的总结:
1.准备与触发(用户态)
- (特定于系统调用)应用程序传递系统调用参数到约定寄存器,然后执行
trap
指令产生异常。 - 或,执行指令时产生错误(异常),或被外部设备信号(中断)打断。
2.硬件强制切换(中断隐指令)
- a. 打断:硬件打断用户程序执行。
- b. 保护现场:硬件将用户态的PC、PSW和栈指针等核心上下文压入内核栈。
- c. 定位与切换:硬件通过中断向量找到服务入口地址,加载到PC;同时,清除PSW中的中断允许标志(关中断),并将CPU模式改为内核态。
3.内核处理(内核态)
- a. 保存附加现场:内核入口程序手动保存通用寄存器。
- b. 执行服务:内核可能重新打开中断以提高响应性,然后与硬件交互,执行具体的中断/异常/系统调用服务。
- c. 准备返回:服务完毕,内核手动恢复通用寄存器,然后执行特权返回指令(如
IRET
)。
4.硬件强制返回(中断隐指令)
- a. 恢复现场:硬件响应
IRET
指令,从内核栈中弹出并恢复用户的PC、PSW和用户栈指针。 - b. 恢复中断状态:恢复PSW的同时,自动恢复了用户态的中断允许状态(通常是打开中断)。
5.返回用户程序(用户态)
- CPU返回用户态,程序从中断处继续无缝执行。