CPU Structure
CPU 的功能
| 功能 | 含义 |
|---|---|
| 指令控制 | 完成取指令、分析指令、执行指令,实现程序的顺序控制 |
| 操作控制 | 产生并发出完成指令所需的操作信号,控制相关部件动作 |
| 时间控制 | 按时间顺序提供控制信号,使各操作在正确节拍发生 |
| 数据加工 | 对数据进行算术运算和逻辑运算 |
| 中断处理 | 处理运行中的异常情况和特殊请求 |
Summary
控制器协调指令序列,运算器加工数据。
运算器
运算器负责对数据进行加工。
| 部件 | 作用 |
|---|---|
| ALU | 执行算术运算和逻辑运算 |
| 通用寄存器组 | 保存操作数、目的操作数、中间结果和各种地址信息 |
| 暂存寄存器 | 暂存从主存读来的数据,避免破坏通用寄存器原有内容 |
| ACC | 累加寄存器,用于暂时保存 ALU 运算结果 |
| PSW | 程序状态字,保存运算或测试形成的状态信息 |
| 移位器 | 对运算结果执行移位 |
| 计数器 | 控制乘除运算等操作的步数 |
机器字长
机器字长通常指 CPU 一次能直接处理的二进制数据位数,常与通用寄存器位数、ALU 位数、CPU 内部数据通路宽度相关。它不同于指令字长、存储字长和主存地址位数。
控制器协调并控制计算机各部件执行程序的指令序列,基本功能包括取指令、分析指令、执行指令和中断处理。
| 部件 | 作用 |
|---|---|
| PC | 程序计数器,指出下一条指令在主存中的地址,通常具有自增功能 |
| IR | 指令寄存器,保存当前正在执行的指令 |
| 指令译码器 | 对操作码字段译码,向控制器提供特定操作信号 |
| 微操作信号发生器 | 根据 IR、PSW 和时序信号产生控制信号 |
| 时序系统 | 产生时序信号,控制各微操作出现的时间 |
| MAR | 主存地址寄存器,保存要访问的主存单元地址 |
| MDR | 主存数据寄存器,保存要写入主存或从主存读出的信息 |
MAR 和 MDR 是 CPU 与主存交换信息时的关键接口:MAR 给出地址,MDR 暂存数据。
CPU 内部总线
CPU 内部各寄存器、ALU、MAR、MDR 等部件之间需要交换信息。若采用内部总线结构,这些部件通过一条公共通路传送数据。
内部总线的关键不是“线连在一起”本身,而是控制器在某个节拍发出控制信号:
| 控制对象 | 含义 | 例子 |
|---|---|---|
| 输出控制 | 允许某个源部件把内容送到总线 | PCout 表示 PC 驱动总线 |
| 输入控制 | 允许某个目的部件从总线接收内容 | MARin 表示 MAR 接收总线内容 |
| 运算控制 | 指定 ALU 做哪种运算 | 加、减、与、或、移位 |
| 存储控制 | 指定主存读或写 | R 读命令,W 写命令 |
例如 (PC) -> MAR 在单总线结构中通常表示为:
1 | PCout, MARin 有效 |
同一时刻通常只能有一个部件驱动总线,否则多个输出会冲突;但可以有一个源部件输出,并让一个或多个目的部件接收。数据通路结构和逐节拍分析见 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 -> MQ,ACC -> X,MQ * X -> ACC |
ADD c |
从主存取出 c,与 ACC 相加 |
MDR -> X,ACC + X -> ACC |
STORE y |
将 ACC 中的结果写回主存 |
Ad(IR) -> MAR,ACC -> MDR,MDR -> M(MAR) |
这个例子强调的是部件职责:PC/IR 负责指令流,MAR/MDR 负责访存接口,ACC/MQ/X/ALU 负责数据加工,控制器负责在正确节拍接通相应通路。完整的取指、间址、执行和中断流程见 Instruction-Cycle。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Elian's blog page!