三、指令周期的数据流
指令周期的数据流描述了在取指周期和执行周期中,数据、地址和控制信号在CPU、内存和I/O子系统之间流动的路径。
核心概念:总线是关键通道
数据流的核心是系统总线,它通常分为三组:
- 数据总线:在CPU和内存/I/O之间双向传输指令和数据。
- 地址总线:CPU单向发出,指定要读写的内存地址或I/O端口地址。
- 控制总线:传输控制信号(如内存读、内存写、中断确认等),协调各部件操作。
数据流就是数据、地址和控制信号在这些总线上“穿梭”的过程。
两个主要阶段的数据流
指令周期主要由两个阶段循环构成:取指周期 和 执行周期。
一、取指周期的数据流
这个阶段的目标是从内存中读取下一条指令。无论指令是什么,所有指令的取指阶段数据流都是相同的。
参与部件:
- CPU:程序计数器(PC)、指令寄存器(IR)、内存地址寄存器(MAR)、内存数据寄存器(MDR)/数据缓冲寄存器、控制单元(CU)
- 内存
数据流步骤:
-
传送地址:
- CPU内部:PC中的内容(即下一条指令的地址)被拷贝到内存地址寄存器(MAR) 中。
- CPU外部:MAR中的地址通过地址总线发送到内存模块。
-
发出读命令:
- CPU的控制单元(CU) 通过控制总线向内存发送一个 “内存读” 信号。
-
读取指令:
- 内存模块根据地址总线上的地址,定位到对应的存储单元,将其中的内容(即指令代码)取出。
- 内存将该指令代码通过数据总线发送回CPU。
-
接收并存储指令:
- CPU通过数据总线接收指令代码,并将其存入内存数据寄存器(MDR)。
- 指令代码再从MDR被移动到指令寄存器(IR) 中保存,以备下一阶段(译码)使用。
-
更新程序计数器:
- 同时,在指令被读取后,程序计数器(PC) 的值会自动增加(例如+1或+4,取决于指令长度和架构),以指向下一条指令的地址。
取指周期数据流总结:
PC -> MAR -> 地址总线 -> 内存
控制总线:读信号
内存 -> 数据总线 -> MDR -> IR
PC++
二、执行周期的数据流
这个阶段的数据流因指令而异,因为不同指令要执行的操作完全不同。控制单元(CU)会对IR中的指令进行译码,从而激活不同的数据通路。
我们以三种典型指令为例:
1. 内存加载指令(如 LOAD R1, X)
- 功能:将内存地址X中的数据加载到寄存器R1中。
- 数据流:
- 译码:CU识别出这是LOAD指令,操作数是地址X。
- 传送地址:将IR中的地址部分(X)送入MAR -> 通过地址总线发送到内存。
- 发出读命令:CU通过控制总线发送 “内存读” 信号。
- 读取数据:内存将地址X处的数据通过数据总线送回CPU -> 存入MDR。
- 写回寄存器:MDR中的数据被移动到指定的目标寄存器R1中。
2. 算术运算指令(如 ADD R1, R2)
- 功能:将寄存器R1和R2中的内容相加,结果存回R1。
- 数据流:
- 译码:CU识别出这是ADD指令。
- 取操作数:寄存器R1和R2的值被直接送入算术逻辑单元(ALU) 的输入端。
- 执行操作:CU命令ALU执行加法操作。
- 接收结果:ALU输出计算结果。
- 写回寄存器:计算结果被送回到目标寄存器R1中。
- 注意:此操作完全在CPU内部完成,不涉及内存访问,速度极快。
3. 存储指令(如 STORE R1, X)
- 功能:将寄存器R1中的数据存储到内存地址X中。
- 数据流:
- 译码:CU识别出这是STORE指令。
- 传送数据:将寄存器R1中的数据送入MDR。
- 传送地址:将IR中的地址部分(X)送入MAR -> 通过地址总线发送到内存。
- 发出写命令:CU通过控制总线发送 “内存写” 信号。
- 写入数据:MDR中的数据通过数据总线被写入到内存的地址X处。
4. 转移指令(如 JMP X)
- 功能:改变程序执行顺序,跳转到地址X处执行。
- 数据流:
- 译码:CU识别出这是跳转指令。
- 更新PC:将IR中的地址部分(X)直接加载到程序计数器(PC) 中。
- 这样,下一个取指周期将从地址X开始,而不是顺序的下一个地址。
三、中断周期的数据流
中断周期的数据流:这个过程完全由控制单元(CU) 协调,其核心目标是保存现场(主要是程序断点)并跳转到中断服务程序。
核心原则
- 栈操作:假设栈向低地址增长,采用“先修改指针,后存入数据” 的方式。
- 硬件自动执行:中断周期是由硬件自动触发的一系列操作,并非由某条特定指令引起。
中断周期数据流详细步骤
整个中断周期可以清晰地划分为两个阶段:
- 保存现场阶段:将程序计数器(PC)的内容(即断点)压入系统栈。
- 跳转阶段:加载中断服务程序(ISR)的入口地址到PC。
其数据流如下图所示:
阶段一:保存断点(压栈操作)
目标:将PC
(断点)存入栈中,并更新栈顶指针SP
。
-
计算新栈顶地址:
SP -> ALU
(将当前栈指针送入算术逻辑单元)ALU执行: ALU输出 = SP - 字长
(计算新的空栈顶位置)ALU输出 -> SP
(先修改指针:将新地址写回SP寄存器,更新栈顶)ALU输出 -> MAR
(同时,将新栈顶地址送入内存地址寄存器)
-
准备断点数据:
PC -> MDR
(将程序计数器中的断点地址送入内存数据寄存器)
-
执行内存写操作:
MAR -> 地址总线
(将新的栈顶地址发送到内存)控制总线(内存写信号) -> 内存
(CU发出“写”命令)MDR -> 数据总线 -> 内存
(后存入数据:将断点写入新的栈顶位置)
阶段二:跳转至中断服务程序(ISR)
目标:将PC指向中断处理程序的入口地址。
-
获取ISR入口地址:
- CU根据中断向量号,计算出中断向量在中断向量表(IVT) / 中断描述符表(IDT) 中的内存地址。
- CU执行一次内存读操作:从上述表中读取出ISR的入口地址,并将其存入
MDR
。
-
更新PC:
MDR -> PC
(CU控制将入口地址从MDR加载到程序计数器PC中,覆盖原有值)
总结与要点
- 领导者:控制单元(CU) 是全程的指挥者,发出所有控制信号。
- 核心数据流:
- 保存断点:
PC -> MDR -> 栈内存
;SP - 字长 -> SP, MAR
- 跳转:
中断向量表[中断号] -> MDR -> PC
- 保存断点:
- 关键特点:
- 硬件自动完成:整个过程由硬件触发并执行,对程序员透明。
- 原子性:中断周期的操作是不可分割的,保证了现场保存的完整性。
- 精确中断:中断响应总是在一条指令执行结束后、下一条指令开始前发生。
中断周期是计算机实现并发和实时响应能力的基石,其数据流体现了硬件和软件之间精密协同的工作原理。
总结
指令周期的数据流可以高度概括为以下模式化的循环:
取指周期数据流(固定):
PC → MAR → 地址总线 → 内存
控制总线(读) → 内存
内存 → 数据总线 → MDR → IR
PC 自增
执行周期数据流(可变):
- 涉及内存:
地址/数据 → MAR/MDR ↔ 地址/数据总线 ↔ 内存
- 涉及运算:
寄存器 ↔ ALU ↔ 寄存器
- 涉及跳转:
地址 → PC
整个过程由控制单元(CU) 产生的控制信号严格指挥,像交通警察一样,精确控制着数据在总线和其他部件间的流动方向和时机。理解数据流是理解计算机体系结构如何实现“自动计算”的关键。