CPU Structure And Instruction Cycle
CPU 的功能
| 功能 | 含义 |
|---|---|
| 指令控制 | 完成取指令、分析指令、执行指令,实现程序的顺序控制 |
| 操作控制 | 产生并发出完成指令所需的操作信号,控制相关部件动作 |
| 时间控制 | 按时间顺序提供控制信号,使各操作在正确节拍发生 |
| 数据加工 | 对数据进行算术运算和逻辑运算 |
| 中断处理 | 处理运行中的异常情况和特殊请求 |
控制器协调指令序列,运算器加工数据。
运算器
运算器负责对数据进行加工。
| 部件 | 作用 |
|---|---|
| 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 有效 |
同一时刻通常只能有一个部件驱动总线,否则多个输出会冲突;但可以有一个源部件输出,并让一个或多个目的部件接收。
关键寄存器
| 寄存器 | 保存什么 | 典型作用 | 对普通程序 | 对操作系统 |
|---|---|---|---|---|
| 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 | 栈帧基准地址 | 指向当前函数栈帧的固定位置,便于访问参数和局部变量 | 不透明。编译器常用它组织函数调用栈 | 不透明。调试、异常处理和上下文保存可能依赖它 |
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 负责数据加工,控制器负责在正确节拍接通相应通路。
指令周期、机器周期、时钟周期
| 概念 | 含义 |
|---|---|
| 指令周期 | CPU 从主存取出并执行一条指令所需的全部时间 |
| 机器周期 | 又称 CPU 周期,一个指令周期通常由若干机器周期组成 |
| 时钟周期 | 又称节拍、T 周期,是 CPU 操作的基本时间单位 |
一个指令周期内的机器周期数可以不等,每个机器周期内的节拍数也可以不等。不同指令需要的阶段不同,例如:
| 指令情况 | 可能的周期组成 |
|---|---|
空指令 NOP |
取指周期 |
| 普通运算指令 | 取指周期、执行周期 |
| 间接寻址指令 | 取指周期、间址周期、执行周期 |
| 响应中断的指令 | 取指周期、间址周期、执行周期、中断周期 |
单周期、多周期与流水线处理器
| 处理器组织方式 | 基本做法 | 主要特点 |
|---|---|---|
| 单周期处理器 | 每条指令都在一个时钟周期内完成,即需要 CPU 时钟信号进行同步 | 所有指令使用相同周期长度;时钟周期必须按最慢指令设置,硬件控制相对直接,但短指令也要等待这个长周期结束 |
| 多周期处理器 | 一条指令拆成多个阶段,不同指令可使用不同数量的时钟周期 | 每个时钟周期完成一部分操作;不同指令只经历自己需要的阶段;同一硬件部件可以在不同周期复用 |
| 流水线处理器 | 把指令执行过程分成若干级,多条指令在不同级中重叠执行 | 单条指令仍要经过多个阶段,但理想情况下每个周期都能完成一条指令;重点问题变成流水线相关、冲突和性能分析 |
三者的差别是同样的取指、译码、执行、访存、写回等工作如何占用时钟周期。
设一条指令大致需要取指、译码、执行、访存、写回五类工作。
- 单周期处理器:五类工作压进一个很长的时钟周期。
- 多周期处理器:五类工作拆到多个较短时钟周期,不需要的阶段可以跳过。
- 流水线处理器:一条指令分阶段前进,同时让后续指令进入前面的阶段。
- 功能层:当前阶段要完成什么微操作。
- 时序层:这些微操作安排在哪个时钟周期或流水线级中。
指令周期流程
指令执行的一般流程是:
1 | 取指周期 -> 是否需要间址 -> 执行周期 -> 是否响应中断 -> 下一条指令 |
四个工作周期都可能访问主存,但访存目的不同。
| 工作周期 | 访存目的 |
|---|---|
| 取指周期 | 取指令 |
| 间址周期 | 取有效地址 |
| 执行周期 | 取操作数或保存执行结果,具体取决于指令 |
| 中断周期 | 保存程序断点 |
取指周期
取指周期的任务是从主存中取出当前指令,并形成下一条指令地址。
1 | (PC) -> MAR |
其中 1 -> R 表示控制器向主存发出读命令。
间址周期
间址周期的任务是根据指令中的地址码访问主存,取出有效地址。
1 | Ad(IR) -> MAR |
这里主存读出的不是操作数,而是有效地址。
执行周期
执行周期根据 IR 中指令字的操作码和操作数,通过 ALU 操作产生执行结果。
不同指令的执行周期操作不同,因此没有统一的数据流向。分析执行周期时,应根据具体指令判断数据从哪里来、经过哪些部件、最后写到哪里。
中断周期
中断周期的任务是保存断点并转入中断服务程序。若用栈保存断点,且进栈采用“先修改指针,后写入数据”,可表示为:
1 | (SP) - 1 -> SP |
1 -> W 表示控制器向主存发出写命令。