第5章 中央处理器
5.1 CPU的功能和基本结构
5.1.1 CPU的功能
中央处理器(CPU)是整个计算机系统的核心,它的功能可以概括为以下几个方面:
-
指令控制:控制指令的取出和执行顺序。CPU必须知道下一条要执行的指令在哪里,这由程序计数器(PC)来记录。程序执行时,CPU根据PC的内容从主存中取出指令,然后PC自动指向下一条指令的地址。对于转移指令,CPU需要修改PC的值,使程序跳转到指定的目标地址。
-
操作控制:一条指令通常由多个微操作组成,CPU需要产生相应的控制信号,指挥各个部件协调工作。例如,执行加法指令时,CPU需要控制ALU进行加法运算,同时控制寄存器将操作数送到ALU的输入端,最后将结果写回目标寄存器。
-
时间控制:CPU必须为每条指令的执行提供精确的时序控制。计算机的所有操作都是在统一的时钟信号驱动下进行的,CPU需要按时序发出控制信号,保证各个微操作按照正确的顺序执行。
-
数据加工:这是运算器的核心功能,包括算术运算(加、减、乘、除)和逻辑运算(与、或、非、异或等),以及移位操作等。数据加工的结果会影响程序状态字(PSW)中的标志位,如进位标志CF、零标志ZF、符号标志SF、溢出标志OF等。
-
中断处理:CPU需要能够响应外部设备和内部异常产生的中断请求。当发生中断时,CPU要暂停当前正在执行的程序,保存断点(返回地址)和现场,然后转去执行中断服务程序,中断处理完毕后再恢复现场,返回到原 程序继续执行。
5.1.2 CPU的基本结构
CPU内部由运算器、控制器和寄存器组三大部分构成。这三部分通过内部数据通路连接在一起,共同完成指令的执行。
1. 运算器
运算器是数据加工的核心部件,主要包括:
-
算术逻辑单元(ALU):这是运算器的核心,负责执行算术运算和逻辑运算。ALU的输入端通常有两个,分别接收两个操作数;输出端给出运算结果,同时产生一些标志信息(如进位、溢出等)。ALU的宽度通常等于机器字长。
-
通用寄存器组(GPRs):这是一组供程序员使用的寄存器,用于存放操作数和中间结果。通用寄存器的个数和位数由指令集体系结构(ISA)决定。在程序执行过程中,操作数可以从主存读到通用寄存器中,然后进行运算,运算结果再存回通用寄存器,这样可以减少对主存的访问次数,提高执行速度。
-
暂存器:这些寄存器不提供给程序员使用,而是由CPU内部在指令执行过程中临时存放数据。例如,在单总线结构的CPU中,需要暂存器来保存ALU的一个输入,因为总线上同时只能传输一个数据。
-
程序状态字寄存器(PSW):也称为标志寄存器,用于存放程序执行过程中的状态信息。主要包括:
- 条件码:如进位标志CF、零标志ZF、符号标志SF、溢出标志OF等,这些标志由ALU运算结果设置,用于条件转移指令的判断。
- 中断允许位:控制CPU是否响应可屏蔽中断。
- 特权级:指示CPU当前运行在用户态还是内核态,用于保护操作系统。
2. 控制器
控制器是CPU的指挥中心,负责产生控制信号,协调整个计算机的工作。主要包括:
-
程序计数器(PC):存放下一条要执行的指令在主存中的地址。取指令时,CPU将PC的内容送到MAR,然后访问主存读取指令;同时,PC自动加上指令字长(按字节编址时,32位指令加4),指向下一条指令的地址。对于转移指令,PC的内容会被修改为转移目标地址。
-
指令寄存器(IR):存放当前正在执行的指令。从主存中取出的指令先放入MDR,然后传送到IR。指令中的操作码部分被送到指令译码器进行译码,地址码部分被送到地址形成部件计算操作数的有效地址。
-
指令译码器(ID):对IR中的操作码进行译码,识别出这是一条什么指令,然后产生相应的控制信号。对于复杂的指令,译码器可能产生多个控制信号序列。
-
时序部件:产生各种时序信号,包括时钟周期、机器周期、指令周期等。时序部件确保各个 微操作按照正确的时间顺序执行。
-
微操作信号发生器:根据指令译码结果和时序信号,生成各部件所需的控制信号,如ALU的控制信号、寄存器的读写信号、主存的读写信号等。微操作信号发生器的实现方式有两种:硬布线逻辑和微程序控制。
3. 寄存器组(程序员可见/不可见)
寄存器可以从程序员的角度分为两类:
-
程序员可见的寄存器:包括通用寄存器、PC、PSW等。汇编语言程序员可以直接访问这些寄存器,编写程序时可以显式地使用它们。
-
程序员不可见的寄存器:包括IR、MAR、MDR、暂存器等。这些寄存器由CPU内部硬件控制,程序员在编写程序时无法直接访问它们,对用户是完全透明的。
5.1.3 CPU的寄存器(细节注意)
理解CPU中各个寄存器的位数和作用,对于理解指令执行过程非常重要:
-
程序计数器(PC):PC的位数等于地址总线的宽度。例如,32位地址总线的计算机,PC就是32位。取指令后PC自动修改,修改的数值等于指令字长除以编址单位。按字节编址时,若指令字长为32位(4字节),则PC+4;若 指令字长为16位,则PC+2。
-
指令寄存器(IR):IR的位数等于指令字长。无论CPU内部数据通路是多少位,IR必须能够完整地存放一条指令。
-
存储器地址寄存器(MAR):MAR的位数等于地址总线的宽度,决定了CPU能够访问的主存空间大小。例如,32位MAR可以访问2^32字节(4GB)的地址空间。
-
存储器数据寄存器(MDR):MDR的位数等于数据总线的宽度,通常等于存储字长。一次访存操作可以读出或写入MDR宽度的数据。
-
通用寄存器:通用寄存器的位数通常等于机器字长。32位CPU的通用寄存器就是32位,64位CPU的通用寄存器就是64位。
特别注意:虽然MAR和MDR从逻辑上属于主存的一部分,但在现代计算机中,它们通常被集成在CPU内部,因为CPU与主存的数据交换必须通过这些寄存器进行。
5.2 指令执行过程
5.2.1 指令周期
指令周期是CPU执行一条指令所需的时间。从宏观上看,指令周期由若干个机器周期组成,而每个机器周期又由若干个时钟周期组成。
-
时钟周期:CPU最小的时间单位,由计算机的主频决定。主频为1GHz的CPU,时钟周期为1ns。时钟周期是CPU内部所有操作的基准,每个微操作都在时钟边沿触 发。
-
机器周期(CPU周期):通常定义为从主存读取一个指令字的最短时间。由于主存速度相对较慢,CPU访问主存的时间往往成为瓶颈,因此机器周期通常等于主存的存取周期。
-
指令周期:取指令、分析指令、执行指令所需的总时间。不同的指令具有不同的指令周期,例如,加法指令可能只需要一个机器周期,而乘法指令可能需要多个机器周期。
一个典型的指令周期包含以下阶段:
- 取指周期:CPU根据PC的内容从主存中读取指令,并将指令放入IR。
- 间址周期(可选):如果指令采用间接寻址,则需要根据地址码再次访问主存,获取操作数的有效地址。
- 执行周期:执行指令规定的操作,如加法、减法、数据传送等。
- 中断周期(可选):如果CPU响应中断,则需要保存断点、现场,并转向中断服务程序。
5.2.2 指令周期的数据流
理解每个周期中数据的流动过程,是掌握CPU工作原理的关键。以下以单总线结构为例,说明各周期的数据流。
1. 取指周期
取指周期的任务是将指令从主存中读出并送入IR。数据流如下:
- (PC) → MAR:将PC的内容通过内部总线送到MAR。MAR中的地址被送到地址总线上。
- CPU发出读命令(MemRead):控制总线上的读信号有效,通知主存进行读操作。
- 主存根据地址线上的地址,将对应的存储单元的内容读出,送到数据总线上。
- MDR从数据总线上接收数据,然后通过内部总线将数据传送到IR。至此,指令被成功取入IR。
- (PC) + 指令长度 → PC:PC自动增加,指向下一条指令的地址。增加的量取决于指令字长和编址方式。
在取指周期中,PC的自动增量操作通常由ALU完成,需要占用一个时钟周期。
2. 间址周期
如果指令采用间接寻址,指令中的地址码并不是操作数的有效地址,而是存放有效地址的地址。间址周期的任务就是根据地址码读取有 效地址。数据流如下:
- 将IR中的地址码(或根据寻址方式计算出的地址)送到MAR。
- CPU发出读命令,从主存中读取数据。
- 读出的数据(即有效地址)被送入MDR,然后通过内部总线送到ALU或暂存器,等待执行周期使用。
注意:间接寻址需要额外的一次访存操作,因此会延长指令的执行时间。
3. 执行周期
执行周期的数据流因指令而异。以加法指令"ADD R0, R1"(将R0和R1的内容相加,结果存回R0)为例,在单总线结构下的数据流如下:
- (R1) → 内部总线 → Y(暂存器):将R1的内容送到暂存器Y,准备作为ALU的一个输入。
- (R0) → 内部总线 → ALU:将R0的内容送到ALU的另一个输入端。
- ALU执行加法运算,结果 → Z(另一个暂存器)。
- Z → 内部总线 → R0:将加法结果写回R0。
注意:在单总线结构中,每条指令的执行需要多个时钟周期,因为总线一次只能传输一个数据。
4. 中断周期
当CPU响应中断时,需要执行中断周期。数据流如下:
- 将PC的内容(即返回地址)压入堆栈。通常,SP先减1,然后(PC) → M[SP]。
- 将PSW的 内容压入堆栈(如果需要保存现场)。
- 将中断服务程序的入口地址送入PC。
- CPU关中断(某些情况下),以防止中断嵌套。
5.2.3 指令执行方案
CPU执行指令的方式主要有三种:
-
单指令周期:所有指令都用相同的机器周期数完成(通常为一个机器周期)。这种方案的优点是控制简单,但缺点是周期长度必须由最慢的指令决定,导致大多数指令执行效率低下。CPI(平均每条指令的时钟周期数)等于1,但实际时钟周期较长。
-
多指令周期:不同指令使用不同数量的机器周期。这种方案可以根据指令的复杂度分配不同的执行时间,硬件利用率较高,但控制逻辑比较复杂。
-
流水线方案:将指令执行过程分解为多个阶段,每个阶段由专用的硬件完成,多条指令可以重叠执行。这种方案可以显著提高CPU的吞吐率,是现代CPU普遍采用的方式。
5.3 数据通路的功能和基本结构
5.3.1 数据通路的功能
数据通路是指CPU内部数据流动的路径,包括ALU、寄存器、总线以及它们之间的连接关系。数据通路的功能是实现数据在各部件之间的传送与处理。每条指令的执行,本质上就是数据在数据通路中按照一定顺序流动的过程。
5.3.2 数据通路的组成
数据通路由两类元件组成:
-
组合逻辑元件:这些元件的输出只取决于当前的输入,没有存储功能。主要包括:
- 算术逻辑单元(ALU):执行运算,输出结果和标志。
- 移位器:对数据进行左移或右移操作。
- 多路选择器(MUX):从多个输入中选择一个输出,用于选择数据源。
- 三态门:控制数据是否输出到总线上,用于实现总线的分时共享。
-
时序逻辑元件:这些元件在时钟边沿将输入数据锁存到输出端,具有存储功能。主要包括:
- 寄存器(通用寄存器、PC、IR等)
- 程序状态字寄存器(PSW)
- 暂存器
5.3.3 数据通路的基本结构
根据内部总线的数量,数据通路可以分为以下几种结构:
- 单总线结构:所有部件都连接在同一条内部总线上。这种结构的优点是简单、成本低,缺点是任何时刻只能有两个部件进行数据传送(一个发送,一个接收),因此每条指令需要多个时钟周期才能完成。例如,执行加法指令时,需要先取出一个操作数到暂存器,再取出另一个操作数,然后执行加法,最后写回结果,共需4个时钟周期(取数、取数、运算、写回)。
-
双总线结构:设置两条内部总线(如A总线、B总线),ALU的两个输入端分别连接到不同的总线。这样,ALU可以同时从两条总线获取两个操作数,减少了数据传送的时钟周期数。双总线结构提高了执行速度,但增加了硬件复杂度。
-
多总线结构:设置更多的内部总线,可以实现更复杂的并行数据传送。高性能CPU通常采用多总线结构,以支持超标量、乱序执行等高级技术。
5.3.4 数据通路的操作举例
以下以单总线结构为例,说明典型操作的数据流:
取指令操作:
- 时钟周期1:(PC) → MAR(PC内容通过内部总线送到MAR)
- 时钟周期2:主存读,MDR 接收数据(CPU发出读信号,等待主存响应)
- 时钟周期3:(MDR) → IR(数据从MDR通过内部总线送到IR)
- 时钟周期4:(PC) + 1 → PC(通过ALU计算,结果写回PC)
加法指令 ADD R1, R2(R1 ← R1 + R2):
- 时钟周期1:(R1) → 内部总线 → Y(将R1送到暂存器Y)
- 时钟周期2:(R2) → 内部总线 → ALU(将R2送到ALU输入端)
- 时钟周期3:ALU执行加法,结果 → Z(运算结果存到暂存器Z)
- 时钟周期4:(Z) → 内部总线 → R1(将结果写回R1)
注意:在单总线结构中,每个数据传送步骤都需要占用一个时钟周期,且不同操作不能并行。因此,指令执行速度受到总线带宽的限制。
5.4 控制器的功能和工作原理
控制器是CPU的指挥中心,负责产生微操作命令序列。根据实现方式的不同,控制器分为硬布线控制器和微程序控制器两大类。
5.4.1 控制器的结构和功能
控制器的基本功能包括:
- 从主存中取出指令,并存入指令寄存器IR。
- 对IR中的指令进行译码,识别出指令的操作类型。
- 根据指令译码结果和当前的时序状态,产生相应的控制信号,控制各部件协同工作。
- 处理中断和异常,保证系统的正常运行。
控制器的输入包括:
- 指令寄存器IR(提供操作码和地址码)
- 时钟信号(提供时序基准)
- 标志位(来自PSW,用于条件判断)
- 中断请求信号(来自外部设备或内部异常)
控制器的输出是各种控制信号,如:
- ALU的控制信号(选择加法、减法等)
- 寄存器的读写控制信号(RegWrite、RegRead)
- 主存的读写控制信号(MemRead、MemWrite)
- 多路选择器的选择信号
5.4.2 硬布线控制器
硬布线控制器采用组合逻辑电路实现,由指令译码器、时序产生器、节拍发生器和逻辑门阵列组成。它的工作原理是:将指令译码结果、时序状态和条件标志输入到组合逻辑电路中,通过逻辑门直接产生控制信号。
优点:
- 速度快:控制信号由组合逻辑直接产生,没有访存延迟,适合高速处理器。
- 结构简单:RISC处理器指令集精简,硬布线控制器的规模较小。
缺点:
- 设计复杂:随着指令数量的增加,逻辑门数量呈指数增长,设计难度大。