用户态和内核态
cpu状态分为用户态和内核态(也被成为supervisor mode)两种,听名字也知道这两种权限不一样,前者只能使用普通命令,而后者可以使用所有的命令。
特权指令是只能由操作系统使用的命令(内核级别), 比如启动I/O, 内存清零,修改cpu状态字,设置时钟,允许/禁止终端,停机等。非特权指令: 普通用户也能调用的命令,比如控制转移,算术运算, 访管指令(进入内核态, 取数指令等。从用户态到核心态的唯一途径是中断/异常/陷入(trap)机制。
内核态到用户态,只需要设置程序状态字寄存器(Program Status World, PSW),这个寄存器有8位,用来记录程序运行中的各状态,包括进位标志、是否允许中断、是否有溢出等。
PWS寄存器状态位
PWS位地址 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
含义 | CY | AC | F0 | RS1 | RS0 | OV | - | P |
CY:进位标志,AC辅助进位标志,F0软件标志, OV溢出标志。
中断的概念。
中断是CPU中止现在正在处理的程序而转向处理另一些事件的操作,它是现代CPU能处理多进程的基石。
CPU内部事件引发的中断,比如程序出错,运算过程出现溢出,非法指令,地址越界等引发的中断被称为内部中断,也被称为异常,这种中断是不可屏蔽的。而外部I/O设备引发的中断成为外部中断。CPU内部有一个中断允许触发器,当该触发器置 “1” 时允许中断,置“0”时屏蔽中断。
中断发生过程
1.CPU每次执行一条指令之后都会确认中断控制器是否发送了中断请求,如果有,CPU则会从中断向量表(IDT)读取中断请求的中断向量,中断类型和中断向量之间有如下关系: 中断类型号 * 4 = 存放中断向量的首地址,从该地址开始读取4个字节空间就是中断服务程序入口地址的段基址和偏移量。 对于内部中断,中断向量是直接给出的,不用查表。
2.CPU保护当前程序的现场,将断点处的代码段寄存器压入栈。将从IDT中读取的中断入口地址压入CS(代码段寄存器)和IP(下一条指令的地址)中, 转入中断服务程序执行,中断过程中如果出现了优先级别更高的中断,会转入该中断运行,这种情况称为中断嵌套。
3. 中断处理完毕后,堆栈寄存器内容弹栈,恢复断点寄存器的值,恢复断点进程,若有程序正在等待此次I/O的结果,则应将其唤醒。
下一节 进程和线程