1.处理器状态
中央处理器(CPU):处理器由运算器、控制器以及一系列的寄存器以及高速缓存装置组成。
两类寄存器:1.用户可见寄存器:高级语言编译器通过优化算法分配并使用之,以减少程序访问内存次数;
2.控制和状态寄存器:用于控制处理器的操作,通常由操作系统代码使用。
典型的控制和状态寄存器呢包括了程序计数器 PC,那么这里头记录了要取出的指令的地址。 指令寄存器记录了最近取出的指令。 程序状态字寄存器 PSW,它记录了 CPU 的运行状态, 一些条件码、 模式、 控制位等信息。
通常,我们对硬件希望提供一个基本运行机制,也就是CPU有一个特权级别,在不同的级别下可以运行不同的指令集合。通过分配不同的指令集合供操作系统和用户进程使用。在一个指令系统中,只能够有操作系统来执行的叫做特权指令,另外一类就是非特权指令。
举一个例子 X86 系列处理器,它提供了四个 特权级别。 我们把它称之为特权环 R0, R1, R2 和 R3 那么从 R0 到 R3 它的特权的能力是由高到底的。 那么硬件设计者 设计了这样不同的特权级别 主要的目的呢,是希望在不同的级别呢能够运行不同的 程序。 比如说 R0 是希望能运行操作系统的一些关键代码 所以 R0 相当于内核态。 R1 呢 是运行设备驱动程序和一些 I/O 处理的历程 R2 呢,是运行一些受保护 共享的代码,比如说一些语言编译环境 而 R0 呢,R3 呢是给 用户程序使用的。 那么 R3 呢就相当于用户态 而 R1 和 R2 呢实际上是介乎于两者之间 那么不同的这种特权级别 其实就是运行指令的集合是不一样的 我们来看一下 R0 实际上是运行了所有的指令 而 R3 是运行的一个最小的子集 那么当然了,我们刚才说了,操作系统需要两个状态 所以呢通常情况下,大部分的 操作系统我们所熟知的,Linux 啊,Windows 啊,Unix 啊 都是只选择了 R0 和 R3 这两个特权级别 来使用。
2.中断和异常
上面说到,处理器一般选择两种状态:用户态和内核态。那么,我们是如何实现从用户态到内核态之间的互相切换呢?
从用户态到内核态的唯一途径就是通过中断或者异常,从内核态切换到用户态就是通过寄存器中的的设置程序状态子PSW。
最早的时候,中断的引入是为了支持CPU与外部设备之间实现并行的一种能力,如果没有中断,那么CPU就要负责对所有设备进行工作管理,有了中断,CPU会启用输入输出等工作,启动完成后,设备便可以自己独立工作,CPU再转去处理一些与输入输出无关的事情,当输入输出动作完成后,就会向CPU进行汇报,CPU根据这次输入输出的结果来判断下一步的动作。
异常其实也是一种中断,主要是CPU执行过程中,遇到了一些自身性的问题,例如算术溢出除0、栈溢出等等,会使CPU转向对这次的异常进行处理,决定下一步的动作。
通常,中断也被称为外中断,异常被称为内中断。