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

同一时刻通常只能有一个部件驱动总线,否则多个输出会冲突;但可以有一个源部件输出,并让一个或多个目的部件接收。数据通路结构和逐节拍分析见 CPU-Datapath

关键寄存器

关键寄存器职责

寄存器 保存什么 典型作用 对普通程序 对操作系统
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 负责数据加工,控制器负责在正确节拍接通相应通路。完整的取指、间址、执行和中断流程见 Instruction-Cycle