cpu是计算机的大脑,它只要和内存进行交互,从内存中提取并执行它。一个CPU的执行周期是从内存中提取一条指令.解码并决定它的类型和操作数,执行,然后再提取,解码执行后续的指令,重复该循环直到程序执行完成。

每个CPU都有一组可以执行的特定指令集。因此,x86的CPU不能执行ARM的程序并且ARM的CPU也不能执行x86的程序。由于访问内存获取执行或数据要比执行指令花费时间长,因此所有的CPU内部都会包含一些寄存器来保证关键变量和临时结果,因此,在指令集中通常会有一些一些指令用于把关键字从内存中加载到寄存器中,以及把关键字从寄存器存入到内存中。还有一些其它的指令会把来自寄存器和内存的操作数组合,例如add操作就会把两个操作数相加并把结果保存到内存中。
除了用于保存变量和临时结果的通用寄存器外,大多数计算机还具有几个特殊的寄存器,这些寄存器对于程序员是可见的。其中之一就是程序计数器,程序计数器会指示下一条需要从内存中提取指令的地址。提取指令后,程序计数器将更新为下一条需要提取的地址。

另一个寄存器是堆栈指针,他指向内存中当前栈的顶端。堆栈指针会包含输入过程中的有关参数.局部变量以及没有保存在寄存器中的临时变量;

还有一个寄存器是PSW-程序状态字寄存器,这个寄存器是由操作系统维护的8个字节long类型的数据集合,它会跟踪当前系统的状态。除非发生系统结束,否则我们可以忽略PSW。用户程序通常可以读取整个PSW,,但只能写入某些字段,PSW在程序调用和I/O中起着重要作用

操作系统必须了解所有的寄存器,在时间多路复用的CPU中,操作系统往往停止运行一个程序转而运行另一个,每次当操作系统停止运行一个程序时,操作系统会保存所有寄存器的值,以便后续重新运行该程序。

为了提升性能,CPU设计人员早就放弃了同时去读取,解码和执行一条简单的指令,许多现代的CPU都具有同时读取多条指令的机制,例如一个CPU可能会有单独访问,解码和执行单元,所以,当CPU执行执行第N条指令时,还可以对N+1条指令进行解码,还可图片说明 以读取N+2条指令,像这样的形式被称为流水线.

比流水线更先进的设计是 超标量(superscalar) CPU,下面是超标量 CPU 的设计

图片说明
在上面这个设计中,存在多个执行单元,例如,一个用来进行整数计算,一个用来浮点数计算,一个用来布尔值计算。两个或者更多的指令比一次性取出,解码并放进缓冲区中,直到他们运行结束,只要有一个执行单元空闲,就会去检查缓冲区是否有可执行的指令。如果有,就把指令从缓冲区中取出并且执行,这种设计的含义是应用程序通常是无序执行的。在大多数情况下,硬件负责保证这种运算的结果与顺序执行指令时的结果相同。

除了用在嵌入式系统中非常简单的 CPU 之外,多数 CPU 都有两种模式,即前面已经提到的内核态和用户态。通常情况下,PSW 寄存器中的一个二进制位会控制当前状态是内核态还是用户态。当运行在内核态时,CPU 能够执行任何指令集中的指令并且能够使用硬件的功能。在台式机和服务器上,操作系统通常以内核模式运行,从而可以访问完整的硬件。在大多数嵌入式系统中,一部分运行在内核态下,剩下的一部分运行在用户态下。

用户应用程序通常运行在用户态下,在用户态下,CPU 只能执行指令集中的一部分并且只能访问硬件的一部分功能。一般情况下,在用户态下,有关 I/O 和内存保护的所有指令是禁止执行的。当然,设置 PSW 模式的二进制位为内核态也是禁止的。

为了获取操作系统的服务,用户程序必须使用 系统调用(system call),系统调用会转换为内核态并且调用操作系统。TRAP 指令用于把用户态切换为内核态并启用操作系统。当有关工作完成之后,在系统调用后面的指令会把控制权交给用户程序。我们会在后面探讨操作系统的调用细节。

需要注意的是操作系统在进行系统调用时会存在陷阱。大部分的陷阱会导致硬件发出警告,比如说试图被零除或浮点下溢等。在所有的情况下,操作系统都能得到控制权并决定如何处理异常情况。有时,由于出错的原因,程序不得不停止。