CPU 的功能

功能 含义
指令控制 完成取指令、分析指令、执行指令,实现程序的顺序控制
操作控制 产生并发出完成指令所需的操作信号,控制相关部件动作
时间控制 按时间顺序提供控制信号,使各操作在正确节拍发生
数据加工 对数据进行算术运算和逻辑运算
中断处理 处理运行中的异常情况和特殊请求
Summary

控制器协调指令序列,运算器加工数据。

![CPU 基本结构](/assets/cpu-basic-structure.svg)

运算器

运算器负责对数据进行加工。

部件 作用
ALU 执行算术运算和逻辑运算
通用寄存器组 保存操作数、目的操作数、中间结果和各种地址信息
暂存寄存器 暂存从主存读来的数据,避免破坏通用寄存器原有内容
ACC 累加寄存器,用于暂时保存 ALU 运算结果
PSW 程序状态字,保存运算或测试形成的状态信息
移位器 对运算结果执行移位
计数器 控制乘除运算等操作的步数
机器字长

机器字长通常指 CPU 一次能直接处理的二进制数据位数,常与通用寄存器位数、ALU 位数、CPU 内部数据通路宽度相关。它不同于指令字长、存储字长和主存地址位数。

# 控制器

控制器协调并控制计算机各部件执行程序的指令序列,基本功能包括取指令、分析指令、执行指令和中断处理。

部件 作用
PC 程序计数器,指出下一条指令在主存中的地址,通常具有自增功能
IR 指令寄存器,保存当前正在执行的指令
指令译码器 对操作码字段译码,向控制器提供特定操作信号
微操作信号发生器 根据 IR、PSW 和时序信号产生控制信号
时序系统 产生时序信号,控制各微操作出现的时间
MAR 主存地址寄存器,保存要访问的主存单元地址
MDR 主存数据寄存器,保存要写入主存或从主存读出的信息

MAR 和 MDR 是 CPU 与主存交换信息时的关键接口:MAR 给出地址,MDR 暂存数据。

CPU 内部总线

CPU 内部各寄存器、ALU、MAR、MDR 等部件之间需要交换信息。若采用内部总线结构,这些部件通过一条公共通路传送数据。

CPU 内部总线

内部总线的关键不是“线连在一起”本身,而是控制器在某个节拍发出控制信号:

控制对象 含义 例子
输出控制 允许某个源部件把内容送到总线 PCout 表示 PC 驱动总线
输入控制 允许某个目的部件从总线接收内容 MARin 表示 MAR 接收总线内容
运算控制 指定 ALU 做哪种运算 加、减、与、或、移位
存储控制 指定主存读或写 R 读命令,W 写命令

例如 (PC) -> MAR 在单总线结构中通常表示为:

1
2
PCout, MARin 有效
PC -> Bus -> MAR

同一时刻通常只能有一个部件驱动总线,否则多个输出会冲突;但可以有一个源部件输出,并让一个或多个目的部件接收。

关键寄存器

关键寄存器职责

寄存器 保存什么 典型作用 对普通程序 对操作系统
PC 下一条指令地址 取指时送入 MAR;顺序执行时自动形成下一条指令地址 不透明。程序的顺序、分支、调用和返回都会改变 PC 透明度较低。OS 在进程切换、中断和异常处理时必须保存、恢复或修改 PC
IR 当前指令 保存取出的指令,供译码和后续执行使用 透明。普通程序通常不能直接读写 IR 基本透明。OS 也通常不直接操作 IR
MAR 主存地址 保存本次访存要访问的主存单元地址 透明。由硬件在访存过程中使用 基本透明。OS 关心地址转换和访问权限,但通常不直接读写 MAR
MDR 主存数据 读主存时接收数据;写主存时暂存待写数据 透明。由硬件在访存过程中使用 基本透明。OS 关心访存结果,但通常不直接读写 MDR
ACC 运算结果或隐含操作数 保存 ALU 运算结果,常作为累加器使用 不透明。可作为程序可见寄存器或隐含操作数 不透明。上下文切换时需要保存和恢复
GPR 通用数据、地址或中间结果 保存操作数、运算结果和地址信息 不透明。程序可直接使用 不透明。上下文切换时需要保存和恢复
PSW 状态标志和控制信息 保存溢出、符号、零、进位等状态信息,参与控制判断 部分不透明。条件码影响分支,但特权控制位不可由普通程序任意修改 不透明。OS 需要保存、恢复并控制其中的特权状态
BR 基址 形成基址寻址中的有效地址,也可用于重定位 通常不透明。程序是否可见取决于体系结构 不透明。OS 可能用它配合存储保护或地址重定位
IX 变址值 形成变址寻址中的有效地址,常用于数组、表格访问 不透明。程序可通过变址寄存器表达下标变化 不透明。上下文切换时需要保存和恢复
SP 栈顶地址 指向当前栈顶,支持调用、返回、中断和局部数据保存 不透明。过程调用、压栈、出栈会改变 SP 不透明。OS 在中断、异常和进程切换时必须处理栈指针
BP/FP 栈帧基准地址 指向当前函数栈帧的固定位置,便于访问参数和局部变量 不透明。编译器常用它组织函数调用栈 不透明。调试、异常处理和上下文保存可能依赖它
Tip

PC/IR 面向指令流,MAR/MDR 面向主存访问,ACC/GPR/PSW 面向运算结果和状态,BR/IX/SP/BP 面向地址形成和程序运行环境。

# 程序执行小例

设主存中有一段程序,用来计算:

1
y = a * b + c

可以把 CPU 的工作过程理解为:PC 不断指出下一条指令地址,指令进入 IR 后由控制器译码,操作数通过 MAR/MDR 从主存取入 CPU,最后由运算器加工并把结果写回。

指令 主要动作 关键寄存器变化
LOAD a 从主存取出 a,送入累加器 PC -> MAR 取指;IR 保存指令;Ad(IR) -> MAR 取操作数;MDR -> ACC
MUL b 从主存取出 b,与 ACC 中的 a 相乘 MDR -> MQACC -> XMQ * X -> ACC
ADD c 从主存取出 c,与 ACC 相加 MDR -> XACC + X -> ACC
STORE y ACC 中的结果写回主存 Ad(IR) -> MARACC -> MDRMDR -> M(MAR)

这个例子强调的是部件职责:PC/IR 负责指令流,MAR/MDR 负责访存接口,ACC/MQ/X/ALU 负责数据加工,控制器负责在正确节拍接通相应通路。

指令周期、机器周期、时钟周期

指令周期层级

概念 含义
指令周期 CPU 从主存取出并执行一条指令所需的全部时间
机器周期 又称 CPU 周期,一个指令周期通常由若干机器周期组成
时钟周期 又称节拍、T 周期,是 CPU 操作的基本时间单位

一个指令周期内的机器周期数可以不等,每个机器周期内的节拍数也可以不等。不同指令需要的阶段不同,例如:

指令情况 可能的周期组成
空指令 NOP 取指周期
普通运算指令 取指周期、执行周期
间接寻址指令 取指周期、间址周期、执行周期
响应中断的指令 取指周期、间址周期、执行周期、中断周期

单周期、多周期与流水线处理器

指令执行方案

处理器组织方式 基本做法 主要特点
单周期处理器 每条指令都在一个时钟周期内完成,即需要 CPU 时钟信号进行同步 所有指令使用相同周期长度;时钟周期必须按最慢指令设置,硬件控制相对直接,但短指令也要等待这个长周期结束
多周期处理器 一条指令拆成多个阶段,不同指令可使用不同数量的时钟周期 每个时钟周期完成一部分操作;不同指令只经历自己需要的阶段;同一硬件部件可以在不同周期复用
流水线处理器 把指令执行过程分成若干级,多条指令在不同级中重叠执行 单条指令仍要经过多个阶段,但理想情况下每个周期都能完成一条指令;重点问题变成流水线相关、冲突和性能分析

三者的差别是同样的取指、译码、执行、访存、写回等工作如何占用时钟周期

直观区分

设一条指令大致需要取指、译码、执行、访存、写回五类工作。

  • 单周期处理器:五类工作压进一个很长的时钟周期。
  • 多周期处理器:五类工作拆到多个较短时钟周期,不需要的阶段可以跳过。
  • 流水线处理器:一条指令分阶段前进,同时让后续指令进入前面的阶段。
因此,后面分析数据通路和控制信号时,要同时看两层:
  1. 功能层:当前阶段要完成什么微操作。
  2. 时序层:这些微操作安排在哪个时钟周期或流水线级中。

指令周期流程

指令周期流程

指令执行的一般流程是:

1
取指周期 -> 是否需要间址 -> 执行周期 -> 是否响应中断 -> 下一条指令

四个工作周期都可能访问主存,但访存目的不同。

工作周期访存目的

工作周期 访存目的
取指周期 取指令
间址周期 取有效地址
执行周期 取操作数或保存执行结果,具体取决于指令
中断周期 保存程序断点

取指周期

取指周期的任务是从主存中取出当前指令,并形成下一条指令地址。

1
2
3
4
5
(PC) -> MAR
1 -> R
M(MAR) -> MDR
(MDR) -> IR
(PC) + 1 -> PC

其中 1 -> R 表示控制器向主存发出读命令。

间址周期

间址周期的任务是根据指令中的地址码访问主存,取出有效地址。

1
2
3
4
Ad(IR) -> MAR
1 -> R
M(MAR) -> MDR
(MDR) -> Ad(IR)

这里主存读出的不是操作数,而是有效地址。

执行周期

执行周期根据 IR 中指令字的操作码和操作数,通过 ALU 操作产生执行结果。

不同指令的执行周期操作不同,因此没有统一的数据流向。分析执行周期时,应根据具体指令判断数据从哪里来、经过哪些部件、最后写到哪里。

中断周期

中断周期的任务是保存断点并转入中断服务程序。若用栈保存断点,且进栈采用“先修改指针,后写入数据”,可表示为:

1
2
3
4
5
6
(SP) - 1 -> SP
(SP) -> MAR
1 -> W
(PC) -> MDR
(MDR) -> M(MAR)
向量地址 -> PC

1 -> W 表示控制器向主存发出写命令。