11

CPU 的构造

中央处理器

阅读量:1 · 预计 14 分钟读完

ALU控制单元寄存器指令周期
阅读进度6%

第十一章 CPU 的构造 — 中央处理器

导读

在前面十章的旅程中,我们一步步构建了计算机的各个核心部件:逻辑门可以执行逻辑运算,加法器可以做算术运算,触发器和寄存器可以存储数据,内存可以保存程序和数据。现在,是时候将这些部件组装在一起,构建一台完整的计算机的"大脑"——中央处理器(CPU, Central Processing Unit)了。

CPU是计算机中最复杂、最核心的部件。它负责从内存中取出指令、解释指令的含义、执行指令要求的操作,然后取下一条指令——如此循环往复,每秒执行数十亿次。无论是运行操作系统、浏览网页、播放视频还是进行科学计算,所有的工作最终都要由CPU来执行。

本章将从零开始,一步步构建一个简单但完整的CPU。我们将从CPU的基本结构开始,设计指令执行的数据通路,然后构建控制单元来协调各个部件的工作。通过本章的学习,你将亲眼看到一台计算机是如何从一堆逻辑门和寄存器中"活"过来的。

核心概念详解

11.1 CPU的基本功能

CPU的核心功能可以概括为四个字:取指执行。具体来说,CPU不断地重复以下循环:

取指(Fetch):从内存中读取下一条指令

译码(Decode):解释指令的含义,确定需要执行什么操作

执行(Execute):执行指令要求的操作(如加法、数据传送等)

写回(Write Back):将执行结果写回寄存器或内存

这个循环称为指令周期(Instruction Cycle),也称为冯·诺依曼循环

为了完成这些功能,CPU需要以下核心部件:

  • 程序计数器(PC, Program Counter):存储下一条要执行的指令的内存地址
  • 指令寄存器(IR, Instruction Register):存储当前正在执行的指令
  • 通用寄存器组(Register File):提供快速的数据存取
  • 算术逻辑单元(ALU):执行算术和逻辑运算
  • 控制单元(Control Unit):产生控制信号,协调各部件工作
  • 数据总线和地址总线:连接CPU与内存、I/O设备的通道

11.2 指令格式设计

在构建CPU之前,我们需要先定义CPU能够执行的指令集。让我们设计一个简单的指令集,足以演示CPU的工作原理。

假设我们的CPU有以下特性:

  • 8位数据宽度
  • 16位地址空间(可以寻址64KB内存)
  • 4个8位通用寄存器:R0, R1, R2, R3
  • 1个8位ALU

指令格式:每条指令16位(2字节)

| 操作码(4位) | 寄存器/操作数(12位) |

指令集定义

操作码助记符功能格式
0000LOAD Ri, addr从内存加载数据到寄存器0000 Ri addr
0001STORE Ri, addr将寄存器数据存储到内存0001 Ri addr
0010MOV Ri, Rj寄存器间传送0010 Ri Rj xxxx
0011ADD Ri, RjRi = Ri + Rj0011 Ri Rj xxxx
0100SUB Ri, RjRi = Ri - Rj0100 Ri Rj xxxx
0101AND Ri, RjRi = Ri AND Rj0101 Ri Rj xxxx
0110OR Ri, RjRi = Ri OR Rj0110 Ri Rj xxxx
0111JMP addr无条件跳转0111 xxxx addr
1000JZ addr零标志为1时跳转1000 xxxx addr
1001CMP Ri, Rj比较Ri和Rj,设置标志1001 Ri Rj xxxx
1010HALT停止执行1010 xxxx xxxx

11.3 数据通路设计

数据通路(Datapath)是指令执行过程中数据流动的通道,由ALU、寄存器组、内存接口等部件以及连接它们的总线组成。

简化的数据通路结构:

┌──────────┐
                    │  内存     │
                    └────┬─────┘
                         │ 数据/地址总线
                    ┌────┴─────┐
                    │  MAR/MDR  │
                    └────┬─────┘
                         │
              ┌──────────┴──────────┐
              │                     │
         ┌────┴────┐          ┌────┴────┐
         │ 寄存器组 │          │   ALU   │
         │ R0-R3   │←────────→│         │
         └────┬────┘          └────┬────┘
              │                     │
              └──────────┬──────────┘
                         │
                    ┌────┴────┐
                    │  总线    │
                    └─────────┘

关键寄存器:

  • MAR(Memory Address Register):存储要访问的内存地址
  • MDR(Memory Data Register):存储从内存读出或要写入内存的数据
  • PC(Program Counter):存储下一条指令的地址
  • IR(Instruction Register):存储当前指令

11.4 指令执行过程

让我们详细分析几条指令的执行过程。

LOAD指令的执行

指令:LOAD R1, [1000](从内存地址1000加载数据到R1)

执行步骤:

取指阶段

- 将PC的值送到MAR:MAR ← PC

- 向内存发出读请求

- 从MDR读取指令到IR:IR ← MDR

- PC增加2(指向下一条指令):PC ← PC + 2

译码阶段

- 控制单元分析IR中的操作码(0000),识别为LOAD指令

- 提取寄存器编号(R1)和内存地址(1000)

执行阶段

- 将内存地址1000送到MAR:MAR ← 1000

- 向内存发出读请求

- 从MDR读取数据

写回阶段

- 将MDR中的数据写入R1:R1 ← MDR

ADD指令的执行

指令:ADD R1, R2(R1 = R1 + R2)

执行步骤:

取指阶段:(同上)

译码阶段

- 识别为ADD指令

- 提取源寄存器R2和目标寄存器R1

执行阶段

- 将R1的值送到ALU的A输入

- 将R2的值送到ALU的B输入

- ALU执行加法运算:Result ← R1 + R2

写回阶段

- 将ALU的结果写回R1:R1 ← Result

11.5 控制单元设计

控制单元(Control Unit)是CPU的"指挥中心",它根据当前执行的指令产生各种控制信号,协调数据通路中各部件的工作。

控制单元有两种基本实现方式:

硬布线控制(Hardwired Control)

使用组合逻辑电路和时序逻辑电路直接产生控制信号。

优点:速度快(信号直接通过门电路传播)

缺点:设计复杂,修改困难(需要重新设计电路)

硬布线控制单元本质上是一个状态机:

  • 输入:指令操作码、当前状态、标志位等
  • 输出:各种控制信号(寄存器使能、ALU操作选择、内存读写等)
  • 状态转移:由时钟信号驱动,按照指令执行的步骤顺序推进

微程序控制(Microprogrammed Control)

使用一个特殊的存储器(控制存储器)来存储微程序(Microprogram)。每条机器指令对应一段微程序,由一系列微指令(Microinstruction)组成。每个微指令产生一组控制信号。

优点:设计灵活,易于修改和扩展(只需更改微程序)

缺点:速度较慢(需要访问控制存储器)

微程序控制的思想是将复杂的控制逻辑"软件化"——用存储在控制存储器中的微程序来替代硬布线的组合逻辑。这使得指令集的设计和修改变得更加容易。

11.6 状态标志

CPU中通常有一组状态标志(Status Flags),用于记录最近一次算术或逻辑运算的结果特征。

常见的状态标志:

  • Z(Zero):结果为零时置1
  • C(Carry):产生进位/借位时置1
  • N(Negative):结果为负时置1
  • V(Overflow):产生溢出时置1

状态标志对于条件跳转指令至关重要。例如,CMP指令比较两个数后设置标志,随后的JZ指令根据Z标志决定是否跳转。

11.7 流水线技术

在简单的CPU设计中,一条指令的执行需要按顺序完成取指、译码、执行、写回等步骤。在任何时刻,只有一个步骤在使用硬件,其他硬件处于空闲状态。这就像一条只有一个工人的装配线——效率很低。

流水线(Pipelining)技术借鉴了工厂装配线的思想:将指令执行过程分成多个阶段,每个阶段由专门的硬件负责。不同指令的不同阶段可以重叠执行。

4级流水线示例:

时钟周期  1    2    3    4    5    6    7
指令1    IF   ID   EX   WB
指令2         IF   ID   EX   WB
指令3              IF   ID   EX   WB
指令4                   IF   ID   EX   WB
指令5                        IF   ID   EX   WB

在理想情况下,流水线可以使CPU的吞吐量提高约等于流水线级数的倍数。4级流水线的理想加速比是4倍。

流水线的挑战:

  • 数据冒险:后一条指令需要前一条指令的结果,但结果还没有写回
  • 控制冒险:分支指令改变了执行流程,但流水线已经取了错误的指令
  • 结构冒险:多条指令同时需要使用同一个硬件资源

解决这些冒险的技术包括数据前递(Forwarding)、分支预测(Branch Prediction)、乱序执行(Out-of-Order Execution)等。

11.8 超标量与多核

超标量处理器

超标量(Superscalar)处理器在每个时钟周期可以发射和执行多条指令。它通过动态调度,找出指令之间没有依赖关系的部分,并行执行。

例如,如果指令A和指令B操作不同的寄存器且没有数据依赖,超标量处理器可以在同一个周期内同时执行它们。这需要多个ALU和更复杂的调度逻辑。

多核处理器

多核(Multi-core)处理器在一块芯片上集成多个独立的CPU核心。每个核心可以独立执行指令流。

多核处理器的优势:

  • 并行性能:多个核心可以同时处理不同的任务
  • 能效:多个小核心通常比一个大核心更节能
  • 可靠性:一个核心故障不影响其他核心

现代CPU通常包含4到64个甚至更多的核心。服务器级CPU如AMD EPYC可以有128个核心。

11.9 中断与异常

中断(Interrupt)是外部设备向CPU发出的信号,请求CPU暂停当前任务,处理紧急事件。

异常(Exception)是CPU内部产生的特殊情况,如除零错误、页面故障等。

中断/异常的处理过程:

CPU完成当前指令的执行

保存当前状态(PC和状态寄存器)到栈中

跳转到对应的中断/异常处理程序

执行处理程序

恢复保存的状态,继续执行原来的程序

中断机制使得CPU可以响应外部事件(如键盘输入、网络数据包到达),是实现多任务操作系统的基础。

11.10 现代CPU的复杂技术

现代CPU使用了大量复杂技术来提升性能:

分支预测(Branch Prediction):在分支指令的结果确定之前,预测分支方向并提前执行。现代处理器的分支预测准确率可达95%以上。

乱序执行(Out-of-Order Execution):不按照程序的原始顺序执行指令,而是根据数据的可用性和资源的空闲情况动态调度。

寄存器重命名(Register Renaming):消除假依赖,允许更多的指令并行执行。

缓存一致性(Cache Coherence):在多核处理器中,确保每个核心看到的内存数据是一致的。

安全扩展(Security Extensions):如Intel SGX、ARM TrustZone,提供硬件级别的安全隔离。

重要知识点

知识点一:CPU的基本循环是取指-译码-执行-写回

这个循环是冯·诺依曼架构的核心,所有指令的执行都遵循这个基本模式。

知识点二:数据通路定义了数据流动的路径

数据通路由ALU、寄存器组、总线等部件组成,是指令执行的物理基础。

知识点三:控制单元产生协调信号

控制单元是指令执行的"指挥官",可以是硬布线的(快但不灵活)或微程序的(灵活但较慢)。

知识点四:流水线提高了指令吞吐量

通过将指令执行分成多个阶段并重叠执行,流水线可以显著提高CPU的性能。

知识点五:中断机制实现了异步事件处理

中断使得CPU可以响应外部事件,是多任务操作系统的基础。

常见误区

误区一:"CPU的主频越高,性能一定越好"

主频只是影响CPU性能的因素之一。IPC(每周期指令数)、核心数量、缓存大小和层次、微架构设计等都同样重要。一个3GHz的旧架构CPU可能不如一个2.5GHz的新架构CPU。

误区二:"流水线级数越多越好"

更多的流水线级数可以提高时钟频率,但也增加了流水线冒险的复杂度和分支预测错误的代价。过深的流水线(如Pentium 4的31级)反而可能导致性能下降。

误区三:"多核处理器的性能是单核的N倍"

由于Amdahl定律的限制,只有程序中可并行的部分才能从多核中受益。如果程序有10%的串行部分,即使使用无限多个核心,最大加速比也只有10倍。

误区四:"CPU可以直接处理所有高级语言操作"

CPU只能执行机器语言指令。高级语言的每条语句可能需要多条机器指令来实现。编译器负责将高级语言翻译为机器语言。

实践应用

应用一:跟踪指令执行

对于本章定义的指令集,手动跟踪以下程序的执行过程:

LOAD R0, [100]    ; R0 = 内存[100]
LOAD R1, [101]    ; R1 = 内存[101]
ADD R0, R1        ; R0 = R0 + R1
STORE R0, [102]   ; 内存[102] = R0
HALT

应用二:设计控制信号

为LOAD指令设计每个时钟周期需要的控制信号:

  • PC使能、MAR写入、内存读/写、MDR写入、IR写入
  • 寄存器选择、ALU操作、寄存器写入

应用三:分析流水线性能

一个5级流水线的CPU,时钟频率2GHz。计算:

理想情况下每秒执行多少条指令?

如果分支预测错误率为10%,每次错误惩罚15个周期,实际IPC是多少?

应用四:编写简单程序

使用本章定义的指令集,编写程序实现:

计算1+2+3+...+10的和

在内存中查找特定值

本章小结

本章从零开始构建了一个简单但完整的CPU:

CPU的基本功能:取指-译码-执行-写回循环。

指令格式:定义了操作码、寄存器编号和地址的编码方式。

数据通路:由ALU、寄存器组、MAR/MDR等部件组成,定义了数据流动的路径。

控制单元:产生控制信号协调各部件工作,可以是硬布线或微程序实现。

流水线:将指令执行分成多个阶段重叠执行,提高吞吐量。

超标量与多核:通过并行执行多条指令或多个线程来提升性能。

中断与异常:实现了异步事件处理,是多任务系统的基础。

至此,我们已经从最基本的逻辑门一路构建到了完整的CPU。但CPU本身只是一台"裸机"——没有软件的计算机是无法使用的。在下一章中,我们将学习指令集——CPU能够理解的"语言",以及它是如何连接硬件和软件的。