CPU
CPU,或者说微处理器,是所有计算机系统的心脏。微处理器进行数学运算,逻辑操作并从内存中读取指令并执行指令,进而控制数据流向。计算机发展的早期,微处理器的各种功能模块是由相互分离(并且尺寸上十分巨大)的单元构成。这也是名词“中央处理单元”的起源。现代的微处理器将这些功能模块集中在一块非常小的硅晶片制造的集成电路上。在本书,名词
CPU 、微处理器和处理器交替使用。
微处理器处理二进制数据:这些数据由
1 和 0 组成。这些 1 和 0 对应电气开关的开或关。就好像 42 代表 4 个 10 和 2 个单元,二进制数字由一系列代表
2 的幂数的数字组成。这里,幂数意味着一个数字用自身相乘的次数。 10 的一次幂是 10 , 10 的 2 次幂是 10x10 ,
10 的 3 次幂是 10x10x10 ,依此类推。二进制 0001 是十进制 1 ,二进制数 0010 是十进制 2 ,二进制 0011
是十进制 3 ,二进制 0100 是十进制 4 ,等等。所以,十进制 42 是二进制 101010 或者( 2+8+32 或 21+23+25
)。在计算机程序除了使用二进制表示数字之外,另一种基数, 16 进制,也经常用到。在这种进制中,每一位数字表示 16 的幂数。因为十进制数字只是从
0 到 9 ,在十六进制中 10 到 15 分别用字母 A , B , C , D , E , F 表示。例如,十六进制的 E 是十进制的
14 ,而十六进制的 2A 是十进制的 42 ( 2 个 16+10 )。用 C 语言的表示法(本书一直使用),十六进制数字使用前缀“
0x ”:十六进制的 2A 写做 0x2A 。
微处理器可以执行算术运算如加、乘和除,也可以执行逻辑操作例如“
X 是否大于 Y ”。
处理器的执行由外部时钟控制。这个时钟,即系统时钟,对处理器产生稳定的时钟脉冲,在每一个时钟脉冲里,处理器执行一些工作。例如,处理器可以在每一个时钟脉冲里执行一条指令。处理器的速度用系统时钟的频率来描述。一个
100Mhz 的处理器每秒钟接受到 100 , 000 , 000 次时钟脉冲。用时钟频率来描述 CPU 的能力是一种误解,因为不同的处理器在每一次时钟脉冲中执行的工作量不同。虽然如此,如果所有的条件同等,越快的时钟频率表示处理器的能力越强。处理器执行的指令非常简单,例如:“把内存位置
X 的内容读到寄存器 Y 中“。寄存器是微处理器的内部存储空间,用来存储数据并进行操作。执行的操作可能使处理器停止当前操作而转去执行内存中其他地方的指令。正是这些微小的指令集合在一起,赋予现代的微处理器几乎无限的能力,因为它每秒可以执行数百万甚至数十亿的指令。
执行指令时必须从内存中提取指令,指令自身也可能引用内存中的数据,这些数据也必须提取到内存中并在需要的时候保存到内存中去。
一个微处理器内部寄存器的大小、数量和类型完全决定于它的类型。一个
Intel 80486 处理器和一个 Alpha AXP 处理器的寄存器组完全不同。另外, Intel 是 32 位宽而 Alpha
AXP 是 64 位宽。但是,一般来讲,所有特定的处理器都会有一些通用目的的寄存器和少量专用的寄存器。大多数处理器拥有以下特殊用途的专用的寄存器:
Program Counter ( PC )程序计数器
这个寄存器记录了下一条要执行的指令的地址。
PC 的内容在每次取指令的时候自动增加。
Stack Pointer ( SP )堆栈指针
处理器必须能够存取用于临时存储数据的大容量的外部读写随机存取内存(
RAM )。堆栈是一种用于在外部内存中存放和恢复临时数据的方法。通常,处理器提供了特殊的指令用于将数据压在堆栈中,并在以后需要是取出来。堆栈使用
LIFO (后进先出)的方式。换句话说,如果你压入两个值 x 和 y 到堆栈中,然后从堆栈中弹出一个值,那么你会得到 y 的值。
一些处理器的堆栈向内存顶部增长,而另一些向内存的底部增长。还有一些处理器两种方式都可以支持,例如:
ARM 。
Processor Status ( PS )
指令可能产生结果。例如:“
X 寄存器的内容是否大于 Y 寄存器的内容?“可能产生真或假的结果。 PS 寄存器保留这些结果以及处理器当前状态的其他信息。多数处理器至少有两种模式:
kernel (核心态)和 user (用户态), PS 寄存器会纪录能够确定当前模式的那些信息。