第一章 概述
计算机发展史***:
- 第一代:电子管计算机(1946-1958)
- 第二代:晶体管计算机(1958-1964)
- 第三代:中小规模集成电路计算机(1964-1971)
- 第四代:大、超大规模集成电路计算机(1971年以后)
1.1 计算机系统结构
第一台电子数字计算机:1946年美国宾夕法尼亚大学的ENIAC
冯诺依曼(普林斯顿)结构: 以运算器为中心 。最根本特征是采用存储程序原理。
原理图:
现代计算机: 以存储器为中心。
原理图:
计算机系统的层次结构图:
翻译程序:
编译程序: 将源程序的全部语句一次全部翻译成机器语言程序,而后在执行。
解释程序: 将源程序的一条语句翻译成对应机器语言的一条语句并立即执行, 接着翻译源程序的下一条语句, 重复执行的语句也会被重新翻译。
从C语言源程序到可执行文件:
兼容: 指的是软硬件兼容(时间上向后兼容)
1.2 计算机硬件指标
机器字长: CPU总线的宽度=运算器的位数=通用寄存器的宽度=数据总线宽度
存储字长: MDR位数
数据字长: 数据总线一次能传送信息的位数
指令字长: 一般为存储字长的整数倍, 若为2倍, 需要2次访存取一条指令。与IR寄存器有关
存储容量: 存储单元个数(2*MAR位数次方) x 存储字长(MDR)
CPU主频(时钟频率): 1/CPU时钟周期, 单位Hz。不会影响CPI, 但可以加快指令执行速度
CPI: 执行一条指令所需时钟周期数
执行一条指令耗时: CPI x CPU时钟周期
CPU执行时间: (指令条数 x CPI ) / 主频
IPS: 每秒执行多少条指令, 主频/平均CPI
FLOPS: 每秒执行多少浮点运算 (K > M > G > T > P > E > Z, 换算:10^3)
时钟周期图:
博客参考: 计算机组成原理(唐朔飞)第三版
第二章 总线
2.1 总线概念及性能指标
传输周期(总线周期): 一次总线操作所需时间, 包含申请阶段, 寻址阶段, 传输阶段等
总线时钟周期: 即机器时钟周期
总线的工作频率: 总线周期的倒数
总线的时钟频率: 时钟周期的倒数
总线宽度: 数据总线的根数
总线带宽: 总线宽度 x 总线工作频率
主设备: 发出总线请求且获得总线控制权的设备
从设备: 指被主设备访问的设备
片内总线: CPU内部各寄存器之间及ALU的连接。
系统总线:
数据总线: 双向传输总线, 位数与机器字长、存储字长有关。
地址总线: 指明CPU访问的存储单元或I/O端口的地址, 单向传输, 位数与存储单元有关。
控制总线: 用来发出各种控制信号的传输线, 单向传输。
猝发传送: 传输一次首地址和一组数据
I/O总线与通信总线: CPU和主存通过I/O总线与主机相连, I/O接口通过通信总线(电缆)与外设相连。
2.2 总线结构
1) 单总线结构
特点:
1) 结构简单, 成本低, 易于接入新的设备。
2) 带宽低, 负载重, 多个部件只能争用唯一的总线。
单总线图:
2) 双总线结构
特点:
1) 将较低速的I/O设备从单总线上分离出来
2) 需要增加通道等硬件设备
双总线结构图:
3) 三总线结构
特点:
1) 提高了I/O设备的性能, 提高系统吞吐量
2) 系统工作效率较低
三总线结构图:
4) 多总线结构
多层PCI总线图:
2.3 总线通信控制
主要解决通信双方获知传输开始和传输结束, 及通信双方协调配合。有同步通信、异步通信、半同步通信、分离式通信四种方式。
总线周期的四个阶段:
1) 申请分配阶段: 可细分为传输请求, 总线仲裁两个阶段
2) 寻址阶段: 发出本次要访问从模块的地址及有关命令
3) 传输阶段: 主从模块进行数据交换
4) 结束阶段: 主模块有关信息从系统总线上撤除, 让出总线使用权
1) 同步通信
通信双方由统一时标控制数据传送, 时标通常由CPU的总线控制部件发出。
示例图:
特点: 规定明确, 统一, 模块间的配合简单一致, 但必须按最慢速度的部件来设计公共时钟, 影响总线工作效率。
2) 异步通信
采用应答方式(握手方式), 主模块发出请求信号, 从模块反馈响应。较同步方式慢, 根据应答方式可分以下三种类型
不互锁方式: 主模块发出请求信号, 不必等接受到从模块的回答信号, 而是经过一段时间, 便撤销请求信号, 从模块收到请求信号后, 发出回答信号, 经过一段时间撤销回答信号
半互锁方式: 主模块必须接受到模块回答信号再撤销请求信号, 从模块不等主模块撤销请求信号, 而是经过一段时间撤销回答信号。
全互锁方式: 主模块必须等从模块回答再撤销, 从模块必须等主模块撤销请求信号, 才撤销回答信号。
原理图:
3) 半同步通信
通过增加一条WAIT线, 保留了同步通信的基本特点, 又像异步通信, 允许不同速度的模块和谐工作。与同步通信相比, 无需将周期设置为速度最慢的设备, 较慢的从设备可以通过WAIT信号增加等待周期。
原理图:
4) 分离式通信
当从设备按照命令进行读数据的必要准备时, 总线属于空闲状态。为优化这一点, 将一个传输周期分解为两个子周期, 第一个子周期,主模块使用总线发送地址和命令后, 释放总线使用权; 第二个子周期由从设备准备好数据后申请使用总线使用权。
特点: 各模块欲占用总线必须提出申请, 各模块准备数据过程不占用总线, 总线被占用时都在有效工作, 但这种控制比较复杂, 普通微信计算机很少采用。
第三章 存储系统
3.1 主存储器概念及性能指标
主存的技术指标:
存储容量: 存储单元个数(MAR) x 存储字长(MDR位数) ( 单位: b ) 。
存储器带宽: 即数据传输率=数据宽度/存储周期, 单位时间内存储器存取的信息量 。
存储时间: 启动一次存储操作(读/写)到完成该操作所需的全部时间。
存取周期: 存储器进行连续两次独立的存储器操作所需最小间隔时间, 通常存取周期大于存取时间。
存储周期图:
按存取方式分类:
1) 串行访问存储器: 顺序存取器(磁带), 直接存取器(磁盘、光盘)。
2) 随机存储器(Random Access Memory): 存储器的任何一个存储单元的内容都可以随机存取, 分静态RAM(触发器原理)和动态RAM(电容充放电原理), 存取时间与存储单元物理位置无关。
3) 只读存储器(Read Only Memory): 存储的内容只能读, 而不能重新写入的存储器, 通常存放固定不变的程序。
存储器的层次结构图:
备注: 主存和cache之间的数据调动是由硬件自动完成的, 主存与辅存之间的数据调动是硬件和操作系统共同完成的。
3.1.1 RAM与ROM
静态RAM: 基于触发器工作原理存储信息, 电源掉电时, 原存信息丢失, 属易失性存储器。
动态RAM: 基于电容存储电荷的原理来寄存信息。属易失性存储器。电容上的电荷一般只能维持1-2ms, 因此必须在2ms内对所有存储单元恢复一次原状态, 即刷新。同CPU采用异步方式交换数据, SDRAM同CPU采用同步方式。行缓冲器通常用SRAM实现。
静态RAM与动态RAM的比较:
只读存储器:
掩模ROM: 不可重写
PROM: 可以实现一次性编程的只读存储器, 依靠熔丝断和未断来区别所存信息是 "0" 或 "1" 。
EPROM: 一种可擦除可编程只读存储器。可进行多次重写
Flash Memory: 闪速存储器, 如U盘, 看进行多次快速擦除重写, 但写比读慢
SSD: 固态硬盘, 集成度高, 功耗低, 价格贵
3.1.2 译码驱动方式
线选法:
特点: 一根字选择线直接连接一个存储单元, 只适用容量不大的存储芯片
行列译码器:
特点: 对比线选法, 可以减少地址线, 如32*32根地址线可以连接1024个存储单元。
3/8 译码器:
对比图:
芯片引脚题注意事项:
1) 数据线
2) 地址线, DRAM采用地址复用技术, 地址线减半。
3) 读写控制线1根 或 2根
4) 片选线1根 或 行通选和列通选共两根(复用技术, DRAM采用)
3.1.3 动态RAM刷新
刷新的过程实质上是将原存信息先读出, 再由刷新放大器形成原信息重新写入的过程。一般取2ms为刷新周期或称再生周期。通常有三种方式刷新: 集中刷新, 分散刷新, 异步刷新。
1) 集中刷新
集中刷新是在规定的一个刷新周期内, 对全部存储单元集中一段时间逐行进行刷新, 刷新过程必须停止读/写操作。不能进行读/写操作的这段时间称为访存 "死区"。
集中刷新时间分配示意图:
2) 分散刷新
分散刷新是指对每行存储单元的刷新分散到每个存取周期内完成, 存取周期分读/写周期+刷新周期。这样不存在 "死区" , 但存取周期变长, 系统速度下降。
分散刷新时间分配示意图:
3) 异步刷新
异步刷新是前两种方式的结合, 既可以缩短 "死区" , 又充分利用最大刷新间隔2ms的特点。
异步刷新时间分配示意图:
3.2 存储器与CPU的连接
位扩展示意图:
字扩展示意图:
字、位扩展示意图:
3.3 提高访存速度的措施
3.3.1 单体多字系统
根据程序和数据在存储体内是连续存放的, 因此CPU也是连续访存取出信息的。通过增大存储器的带宽, 在一个周期内, 从同一地址取出多条指令, 可以提高系统速度。但遇到转移指令, 或操作数不能连续存放, 则效果不明显。
原理图:
3.3.2 多体并行系统
采用多体模块组成的存储器。每个模块都有独立的读写控制电路等, 可并行工作。
高位交叉, 顺序编址示意图:
低位交叉编址的四体存储器:
3.4 高速缓冲存储器
Cache全由硬件实现, 是硬件存储器。TLB缺失可以由软or硬件完成。页面缺失由软件处理。TLB采用全相联方式
Cache - 主存存储空间的基本结构图:
Cache的基本结构原理图:
3.2.1 直接映射
主存在Cache的位置=主存块号%Cache总快数。每个主存块只能固定某个对应的缓存块, 使缓存的存储空间得不到充分利用。
示意图:
直接映射的地址结构:
3.2.2 全相联映射
允许主存映射到Cache中的任何一块位置上, 标记位数增多, 命中率最好。 需要每个Cache行都设置一个比较器。
示意图:
3.2.3 组相联映射
直接映射和全相联映射的一种折中。所属分组=主存块号%分组数。r路需要r个比较器。
2路组相联示意图:
组相联映射地址结构:
3.2.4 Cache的写策略
写命中时:
全写法: 写操作时数据既写入Cache又写入主存, 但增加了访存次数。
回写法: 即写操作时只把数据写入Cache而不写入主存, 当Cache数据被替换出去时才写回主存。可设置一个脏位, 表示被修改过才需写回主存。多次写操作只需一次写入内存, 但增加了Cache的复杂性。
写不命中时:
写分配法: 加载主存中的块到Cache中, 而后更新这个Cache块, 一般配合回写法。
非写分配法: 只写入主存, 不进行调块。通常配合全写法使用 。
备注:
多级Cache: 现代计算机中, 各级Cache之间使用写非分配法+全写法, Cache和主存中使用写回法+分配法。
分离Cache结构: 分离指令Cache和数据Cache, 充分利用指令和数据的不同局部性来优化性能。减少指令流水线的冲突。指令Cache比数据Cache的空间局部性更好
多级Cache:
3.2.5 Cache替换算法
1) 随机算法: 不需要算法位
2) 先进先出算法: 不需要算法位
3) 近期最少使用算法(LRU): 2路时有一位LRU位, 4路时用2位LRU位。新装入的行计数器置为0, 其余全+1; 命中时, 命中行清零, 比其低的计数器+1; 未命中时且无空闲行, 则淘汰最高的行。
4) 最不经常使用算法:(LFU): 为每个Cache块设置一个计数器, Cache满后, 替换计数器值最小的。曾经被经常访问的主存块在未来不一定会用到, 实际运行效果不好。
计算cache大小:
第四章 输入输出系统
4.1 I/O接口 (设备控制器)
即I/O控制器, 是主机和外设之间的交接界面, 协调主机与外设之间的数据传输。
示例图:
I/O接口的功能:
1) 进行地址译码和设备选择
2) 实现主机和外设通信联络控制
3) 实现数据缓冲
4) 信号格式的转换
5) 传送控制命令和状态信息
I/O接口图:
端口: 接口电路中可以进行读写的存储器, 若干端口加上相应的控制逻辑才可以组成接口
接口与端口区别图:
4.2 中断系统
中断请求: 中断系统需对每个中断源设置中断请求标记触发器INTR, 当状态为"1"时, 表示中断源有请求。通过INTR线发出的是可屏蔽中断, 通过NMI线发出的是不可屏蔽中断。
示例图:
中断响应判优: 通常通过硬件排队器实现, 响应优先级在硬件线路上是固定的, 处理优先级可以利用中断屏蔽技术动态调整。具体优先级如下:
1) 不可屏蔽中断 > 内部异常 > 可屏蔽中断
2) 内部异常中, 在关中断模式下也会被响应。硬件故障 > 软件中断
3) DMA中断请求 > I/O设备传送的中断请求
4) I/O 传送类中断里, 高速设备 > 低速设备
5) 输入设备 > 输出设备, 实时设备 > 普通设备
示例图:
中断屏蔽技术 (优先级: D>A>C>B) 图:
中断响应: 由硬件直接实现, 称为中断隐指令, 并不是一条具体的指令, 本质是硬件一系列自动操作, 操作如下:
1) 关中断
2) 保存断点: 如PC, PSW的内容。(保存到栈中), 异常的断点是当前指令的地址, 中断的断点是下一条指令的地址。
3) 引出中断服务程序: 识别中断源, 将对应服务程序入口地址送入程序计数器PC中。有硬件向量法和软件查询法。
硬件向量法示意图:
中断向量: 中断服务程序的入口地址
中断向量表: 系统中全部中断向量集中存放到存储器的某个区域
中断服务程序处理过程:
1) 保护现场和屏蔽字: 保存通用寄存器和状态寄存器的内容。(保存到堆中)
2) 开中断(可多重中断)
3) 执行中断服务程序
4) 关中断(可多重中断)
5) 恢复现场和屏蔽字
6) 开中断
7)中断返回: 中断服务程序的最后一条指令通常是一条中断返回指令(特权指令)。
示意图:
中断响应条件:
1) 中断源有中断请求
2) CPU允许中断, 即开中断 (异常和不可屏蔽中断不受此限制)
3) 对于外中断, CPU在每条指令执行阶段结束前向接口发出中断查询信号。 (异常不受此限制)
中断与异常:
中断: 来自CPU外部, 与CPU执行指令无关的事件引起的中断。分为可屏蔽中断与不可屏蔽中断。中断不和任何指令相关联, 异常与指令相关。
异常: 分为硬件故障和程序性异常, 程序性异常也称软件中断, 可分为故障, 自陷, 终止。
1) 故障: 执行结束前被检测到的异常事件
2) 自陷: 预先安排的一种 "异常" 事件, 故障与自陷属于软件中断。
3) 终止: 发生了使计算机无法继续执行的硬件故障, 如控制器出错, 存储器校验错。终止与外中断属于硬件中断。
备注: 所有异常和中断都是硬件检测发现的
广义的中断类型:
中断响应时间: 一条指令执行结束。
4.3 DMA方式
DMA控制器图:
DMA传送图:
DMA接口基本组成原理图:
AR: 主存地址寄存器, 用于存放主存中需要交换数据的首地址, 每交换一次数据, AR+1
WC: 字计数器, 记录传送数据的总字数, 通常使用补码形式, 计数器为0时, 表示数据传送完成。
BR: 数据缓存寄存器, 用于暂存每次传送的数据。
DAR: 设备地址寄存器, 存放I/O设备的设备码或表示设备信息存储区的寻址信息。如磁盘数据所在的区号、盘面号和柱面号。
DREQ: I/O设备向DMA接口提出申请。
HRQ: 向CPU发出总线使用权的请求信号。
HLDA: CPU发出的响应信号。
DACK: 通知I/O设备。
DMA方式与程序中断方式的比较:
DMA方式 | 程序中断方式 | |
传输方式 | 靠硬件传送 | 由程序来传送 |
保护现场 | 不需要中断现行程序 | 需要保护现场 |
响应 | 任意一个机器周期结束时(DMA请求) | 指令执行结束才响应 |
软硬件 | 仅靠硬件控制传输数据 | 软硬结合 |
优先级 | DMA方式 >> 中断方式 |
备注: CPU会在每个存储周期(总线周期) 结束后检查是否有DMA请求。DMA请求与DMA中断不同。DMA请求是外设向DMA发送
DMA的传送方式
1) 停止CPU访问主存: 由DMA接口向CPU发一个停止信号, 让出总线使用权。这种方式控制简单, 缺点是CPU基本处于不工作状态或保持原状态。
示意图:
2) 周期挪用: DMA与CPU同时访问主存时, CPU总是将总线占有权让给DMA (I/O不立即访问主存可以丢失数据) , 一般为一个存取周期, DMA的这种占有成为周期挪用或周期窃取。每挪用一个主存周期都需要申请、建立和归还总线控制权。CPU正在访存时, 存取周期结束后让出总线。
示意图:
3) DMA与CPU交替访问: 适用于CPU的工作周期比主存存取周期长的情况 (如: CPU工作周期是1.2us, 主存周期小于0.6us) 。 这种情况不需要总线使用权的申请、建立和归还。
示意图:
第五章 数据的表示和运算
大小端存储方式:
边界对齐存储方式:
边界对齐特点: 浪费了一些存储空间, 但提高指令和取数的速度。
边界不对齐特点: 可以充分利用存储空间, 但可能需要多次访存, 影响了指令执行效率。
原理图:
5.1 计算机中的数值
有符号数与无符号数 (即没有符号的数) 不同, 区分正负;最高位用"0"表示正, "1" 表示负号。
机器数: 把符号"数字化"的数称为机器数。
真值: 带 "+" 或 "-" 符号的数称为真值。
原码: 符号位"0"表示正数, "1"表示负数。数值位即真值的绝对值。
反码: 通常用来作为原码求补码, 或补码求原码的中间过渡。正数反码是其正数本身。
补码: 可以将减法操作化作加法操作。正数的补码是其本身, 负数的补码可以看作对其原码除符号位外, 每位求反, 末位加1。特别地, [x]补 经过符号位和数值位按位取反+1 得到[-x]补。
移码: 针对补码无法直接比较大小而引出的一种表示法, 即对补码加上一个 , 即将最高位符号位取反。
除0: 故障
长字节转短字节: 截断高位
短字节转长字节: 符号扩展
各类机器数真值范围图:
移码与补码对照图:
备注:
1) 十进制小数不一定都能用二进制表示。
2) 原码, 反码的表示在数轴上对称, 存在+0和-0;而补码, 移码的0是唯一的。
3) 移码和补码的符号位相反, 数值位相同
4) 负数的补码中, 数值部分越大, 真值越大(更靠近0), 多表示一个最小负数
5) 移码保持数据原有大小顺序, 移码大则真值大
6) 补码符号位可以参与运算
5.2 定点数的运算
在计算机中, 小数点不用专门的器件表示, 而是按约定的方式标出, 即定点表示法和浮点表示法。
定点表示法: 小数点位于数符和第一数值之间时, 机器内的数为纯小数; 当小数点位于数值位之后时, 机器内的数为纯整数。
定点数示意图:
5.2.1 移位运算
通过移位运算与加减法运算可实现乘除运算。
算术移位规则:
逻辑移位: 左移, 右移都补0
5.2.2 加减法运算
现代计算机中都采用补码做加减法运算。符号位一起参与运算。
基本公式:
溢出判断:
方法一示意图:
方法二: 采用一位符号位, 根据数据位进位C1与符号位进Cs位异或判断, 不同为溢出
示意图:
方法三: 采用双符号位, 符号位不同为溢出。(模4补码, 更容易检查加减法溢出问题)
5.2.3 乘法运算
溢出判断: 无符号n位 x n位, 仅当前n位为0不溢出, 有符号时, 前n+1位为全1或全0不溢出。
原码乘法步骤:
1) 符号位与数值位分开求, 符号位采用异或
1) 由乘数末位值确定被乘数是否与原部分积相加, 然后右移一位, 形成新的部分积, 同时乘数也右移一位, 空出最高位放部分积的最低位。重复n次
示例图:
补码乘法示例图: 符号位参与运算, 进行n+1累加, n次右移
5.2.4 除法运算
恢复余数法: 相减后, 当余数为负时, 需要加上除数, 将其恢复成原来的余数。
原码恢复余数法示例图:
加减交替法: 可以认为是恢复余数法的一种改进算法。设余数为R, 除数为y, 则:
1) R>0时, 上商"1", 再2R-y;
2) R<0时, 上商"0", 先R+y, 再左移一位-y, 即2(R+y)-y=2R+y。
3) 商符由两个操作数的符号异或而得, 第n+1步余数为负时, 需要加上|y|得到正确余数
原码加减交替法示意图:
补码除法原理图:
原码除法与补码除法对比图:
5.3 浮点数的运算
浮点表示: 小数点位置可以浮动的数。位数相同时,表示数值的范围比定点数大。将尾数最高位为1的浮点数称为规格化数, 此时精度最高。尾数是小数, 其位数n反映了浮点数的精度。
浮点数形式示意图:
规格化:
原码表示的尾数规格化: 尾数最高位数值必须是1
补码表示的尾数规格化: 尾数最高数值位必须和尾数符号位相反
IEEE 754 标准:
最大最小值的绝对值:
全0全1阶码情况:
浮点数加减运算步骤:
1) 对阶: 小阶向大阶看齐
2) 尾数加减
3) 规格化
4) 舍入 (最简单的是处理方法是 截断法)
5) 判断溢出: 阶码溢出才算溢出
C语言中的类型转化:
int 转化 float : 可能会精度缺失
float转化int: 可能会溢出或精度缺失
5.4 算术逻辑单元
逻辑门电路图:
一位全加器:
并行进位加法器:
带标志的加法器:
OF: 有符号数的加减运算是否发生了溢出, OF=1时, 说明有溢出。(次高进位异或最高位的进位)
SF: 有符号数加减运算结果的正负性。SF=0时表示运算结果为正 (最高位生成)
ZF: 加减运算结果是否为0, ZF=1表示运算结果为0
CF: 无符号数加减法运算是否发生了溢出, CF=1时说明发生了溢出 (Sub异或Cout最高位产生的进位)
多路选择器: 有k个输入, 控制信号的位数
三态门图:
ALU框图:
补码加减运算部件: Sub控制端为1时表示做减法, 实现 X+Y(取反)+1 = [X]补+[-Y]补
第六章 指令系统
6.1 指令概述
6.1.1指令集体系结构
机器语言由一条条语句构成, 习惯把每一条机器语言的语句称为机器指令, 将全部的机器指令的集合称为机器的指令系统。
指令集体系结构(ISA): 包括指令格式, 数据类型及格式, 操作数的存放方式, 程序可访问的寄存器个数, 位数和编号, 存储空间大小和编址方式, 寻址方式, 指令执行过程的控制方式等。
80-20规律: 典型程序中80%的语句仅仅使用处理机中的20%的指令, 这些指令都属于简单指令。
RISC: 精简指令系统计算机 (Reduced Instruction Set Computer), 指令按边界对齐。
CISC: 复杂指令系统计算机 (Complex Instruction Set Computer), 大多能实现软件兼容, 即高档机包含了低档机的全部指令。
RISC与CISC比较图:
6.1.2 指令格式
指令的一般格式图:
按地址码数目分类:
四地址指令:该指令完成(A1)OP(A2) -->A3的操作, 4个地址各占6位, 直接寻址范围为=64。共需访问4次存储器(取指令一次, 取两个操作数两次, 存放结果一次)。
三地址指令: 该指令完成(A1)OP(A2)-->A3的操作, 程序中大多数指令是按顺序执行的, 后续指令的地址隐含在程序计数器PC中。3个地址字段各占8位, 寻址范围为=256, 需要访问4次存储器。
二地址指令: 该指令完成(A1)OP(A2)-->A1 的操作, A1即代表原操作数, 也代表存放本次运算的结果地址。共需要4次访问存储器; 若为(A1)OP(A2)-->ACC, 只需要两次访存。直接寻址范围为=4K。
一地址指令: 可完成(ACC)OP(A1)-->ACC的操作, 只需两次访存, 直接寻址范围为=16M。
零地址指令: 无地址码部分, 如空操作, 停机, 中断返回等指令, 或是操作数的地址隐含在堆栈指针SP中。
示意图:
按操作码长度分类:
1) 定长操作码: 适用于字长较长的计算机以及RISC, 指令译码时间短。
2) 不定长操作码: 在字长较短的微型计算机中广泛使用, 会增加指令译码和分析的难度。
不定长操作码图:
操作类型:
1) 数据传送: 寄存器与存储单元, 存储单元与存储单元,, 寄存器与存储单元,之间的传送。
2) 算术逻辑操作: 算术运算(加,减,乘,除等)与逻辑运算(与,或,非,异或等)。
3) 移位: 左移, 右移。
4) 转移: 无条件转移, 条件转移, 调用与返回, 陷阱与陷阱指令。
5) 输入输出:与I/O设备交互。
6) 其他: 停机指令, 开中断指令等。
6.2 指令的寻址方式
6.2.1 指令寻址
分为顺序寻址与跳跃寻址, 顺序寻址可以通过PC自动加"1个指令字长", 形成下一条指令的地址; 跳跃寻址通过转移类指令实现。
指令寻址方式示意图:
6.2.2 数据寻址
数据寻址方式种类多, 在指令中需设一字段表明是哪一种寻址方式。
一地址指令的格式图:
1) 立即寻址: 操作数本身设在指令字内, 即形式地址就是数据本身, 数据采用补码形式存放。
2) 直接寻址: 指令字中的形式地址A就是操作数的真实地址。
3) 隐含寻址: 不明显给出操作数的地址, 操作数的地址隐含在操作码或某个寄存器中。
4) 间接寻址: 形式地址是操作数的有效地址所在的存储单元地址。与直接寻址相比, 扩大了操作数的寻址范围, 但多次间接寻址时, 可用存储字首位来标记是否还需要继续访存寻址。
5) 寄存器寻址: 地址码字段直接给出了寄存器的编号, 无需访存, 减少执行时间。
6) 寄存器间接寻址: 比间接寻址少访存一次。
7) 基址寻址: 需要设有寄存器BR, 可以扩大操作数的寻址范围。面向操作系统, 有利于多道程序设计, 便于编制浮动程序, 可由用户指定具体寄存器为基址寄存器。
8) 变址寻址: 与基址寻址极为相似, 面向用户, 有效地址等于指令字的形式地址+变址寄存器IX, 处理数组问题时, 只需改变寄存器IX内容, 无需多条指令, 适合编制循环程序。
9) 相对寻址: 有效地址是程序计数器PC+形式地址。 位移量可正可负, 由补码表示, 便于程序浮动, 广泛用于转移指令。
直接转移指令: 转移目标地址直接放在指令中
间接转移指令: 转移目标地址存放在寄存器或内存单元中
相对转移指令: 如上图所示
10) 堆栈寻址: 要求计算机中设有堆栈, 操作数只能从栈顶中存或取, 堆栈寻址可视为一种隐含寻址, 操作数的地址总是被隐含在SP指针中。硬堆栈(寄存器组)不访存, 软堆栈访存1次。
对比图:
6.3 程序的机器级代码表示
x86架构CPU中的寄存器图:
AT&T格式与Inter格式对比图:
算术运算指令:
逻辑运算指令:
选择语句的机器级表示:
循环语句的机器级表示:
loop指令实现循环:
函数调用的机器级表示:
函数调用时:
1) 如图情况, 保存call下第一条mov的地址
2) 将ebp的内容入栈(+1个单位再入栈) 并 使ebp指向栈顶esp
函数返回时:
1) mov将栈顶指针esp指向栈底指针ebp
2) pop将esp(此时esp=ebp)中的内容放入esp中, esp减"一个单位"
函数的传参与函数的局部变量:
函数的返回值:
备注:
push xxx : 先让esp减4, 再将xxx压入栈中
pop xxx: 将栈顶元素出栈写入xxx中, 在让esp加4
第七章 中央处理器
7.1 CPU的功能及结构
汇编程序员可见的寄存器: PSW、通用寄存器组(含基址/变址)、PC、ACC、SR(移位寄存器)
CPU基本结构图:
7.2.1 通路数据
1) CPU内部单总线方式: ALU需要配合暂存器使用。单周期处理器不能采用单总线方式
示意图:
2) CPU内部多总线方式: 同时在多个总线上传送不同的数据
3) 专用数据通路方式: 性能较高, 但硬件量大
组合逻辑元件: 输出仅取决于当前的输入, 组合电路不含存储信号的记忆单元, 如三八译码器, 多路选择器, 三态门。
时序逻辑元件: 时序电路包含存储信号的记忆单元, 如各类寄存器和存储器, 如PC, PSW等
7.2.2 多处理器
单指令流单数据流(SISD)结构: 一个处理器和一个存储器, 一段时间内仅执行一条指令, 可采用指令流水线方式, 多模块交叉方式组织存储器
示意图:
单指令流多数据流(SIMD)结构: 通常由一个指令控制部件, 多个处理单元组成, 一个指令流同时对多个数据进行处理, 称为数据级并行技术, 使用for循环最有效, case或switch语句效率最低。向量处理器是SIMD的变体。
示意图:
向量处理器:
多指令流单数据流(MISD)结构: 实际不存在
多指令流多数据流(MIMD)结构: 指同时执行多条指令分别处理多个不同数据, 分为多计算机系统和共享式存储多处理器系统(SMP)。
多计算机系统示意图:
多核处理器示意图:
硬件多线程的三种实现方式:
多核处理器: 将多个处理单元集(多个执行核心)成到单个CPU, 每个处理单元称为一个核。属于共享内存的对称多处理器。
对称多处理器(SMP): 多个处理器共享单一的地址空间。分为UMA和NUMA两种类型。一般采用偶数路CPU, 也称共享内存多处理器。
同时多线程SMT: 在一个单处理器或单核中设置了两套线程状态部件
统一存储访问UMA多处理器: 处理器对所有存储单元的访问时间是大致相同的, 需要解决Cache一致性问题
非统一存储访问NUMA多处理器: 主存被分割给了不同处理器
7.2 指令周期
CPU从主存中每取出并执行一条指令所需的全部时间。 指令周期的不同阶段区分是指令还是数据。
机器周期: 即CPU周期, 一个机器周期包含若干时钟周期, 一般为访存时间
时钟周期: 也称节拍, T周期, CPU时钟周期, CPU操作的基本单位
存取周期: 存储器进行连续两次独立的存储器操作所需最小间隔时间
各周期关系示意图:
不同指令的指令周期:
指令流程图:
取指周期数据流:
间址周期数据流:
中断周期数据流:
指令执行方案:
单指令周期: 对所有指令选用相同的执行时间来完成, 指令之间串行执行
多指令周期: 对不同类型指令选用不同个数的时钟周期, 指令之间串行执行
流水线方案
7.3 控制器
CU的输入信号来源图:
7.3.1 硬布线控制器 (组合逻辑设计)
略
7.3.2 微程序控制器
将一条机器指令编写成一个微程序, 每一个微程序包含若干条微指令, 每一条微指令对应一个或几个微操作命令。然后把这些微程序存到一个控制存储器中。
微指令格式:
水平型微指令: 一条微指令能定义多个可并行的微命令; 微程序短, 执行速度快; 缺点是微指令长, 造成控存容量极大。
垂直型微指令: 一条微指令只能定义一个微命令; 微指令短, 简单, 规整, 便于编写微程序; 缺点是微程序长, 执行速度慢, 效率低。
混合型微指令: 在垂直型的基础上增加一些不太复杂的并行操作。
微指令格式图:
微周期: 执行一条微指令所需的时间, 通常为一个时钟周期
微程序控制单元的基本框图:
CMDR: 微指令寄存器, 又称uIR, 存放微指令
CMAR: 微地址寄存器, 又称uPC, 存放微指令地址
CM: 控制存储器, 用ROM实现
工作过程:
1) 取指令: 取指微程序入口地址一般为CM的0号单元, 为公共操作, 机器开始运行时, 自动将取指微程序入口地址送入CMAR。
2) 译指: 由机器指令的操作码字段通过微地址形成部件产生该机器指令所对应的微程序入口地址, 并送入CMAR。
3) 从CM中逐条取出对应的微指令并执行
4) 执行完对应一条机器指令的一个微程序后, 回到取指微程序的入口地址, 重复 (1)。
微指令的编码方式:
1) 直接编码: 每一位代表一个微操作命令。
直接编码方式图:
2) 字段直接编码方式: 将微指令的操作控制字段分成若干段, 互斥的微操作命令存放在一个字段内(每个小段要考虑留出一个状态表示不操作)。执行速度稍微减慢。
字段直接编码图:
3) 字段间接编码: 又称隐式编码, 可进一步缩短微指令字长, 但削弱了微指令并行控制能力, 故通常作为字段直接编码方式的一种辅助手段。
示意图:
微指令序列地址的形成
1) 直接由微指令的下地址字段指出 (断定法)
2) 根据机器指令的操作码形成
3) 增量计数器: 即(CMAR) --> CMAR
4) 根据各种标志决定微指令分支转移的地址
5) 由硬件产生微程序入口地址: 响应中断时
6) 通过测试网络
后续微指令地址形成方式的原理图:
微程序控制单元的设计步骤:
1) 写出对应机器指令的微操作命令及节拍安排
如取指周期的微操作命令及节拍安排示意图:
2) 确定微指令格式: 确定微指令的编码方式, 以确定微指令的操作控制字段位数, 根据CM中存的微指令总数, 确定微指令的顺序控制字段的位数, 最后可确定微指令字长。
3) 编写微指令码点: 根据操作字段每一位代表的微操作命令, 编写每一条微指令的码点。
7.4 指令流水线
时间并行: 流水线技术, 将一个任务分解成几个不同的子阶段, 每个子阶段在不同功能部件上并行。
空间并行: 硬件资源的重复, 如超标量处理机。
流水线对指令集的要求:
1) 指令长度尽量一致
2) 采用LOAD/STORE访存, 其他指令不能访存
3) 数据和指令在存储器中按边界对齐存放
指令的串行执行:
指令的六级流水:
五段式指令流水线图:
备注: 无条件转移指令修改PC值发生在五段流水线的第三阶段。条件转移指令修改PC值发生在五段流水线的第四阶段。
7.4.1流水线性能指标
1) 吞吐率: 指单位时间内流水线所完成的任务数量, 或是输出结果的数量。
理想的流水线时空图:
2) 加速比: 同样的任务量, 不使用流水线与使用流水线所用的时间之比
理想状态下的流水线图:
3) 效率: 流水线的设备利用率, 完成n个任务占用的时空区有效面积与总面积之比
示意图:
7.4.2 影响流水线性能的因素
1) 结构冒险: 不同指令争用同一功能部件产生资源冲突, 如访存冲突 (互斥)。
解决方法:
1) 后一相关暂停一周期;
2) 资源重复配置
2) 数据冒险: 读写先后顺序不同, 影响计算结果 (同步)。
写后读(RAW): 读在写之前, 发生数据冒险。
解决方法:
1) 通过硬件或软件来延后冲突的相关指令的执行; 一般延后到M(访存段)之后
2) 数据旁路技术: 直接把前一条指令的ALU计算结果作为自己的输入数据(EX阶段)
3) 编译优化: 调整指令顺序
3) 控制冒险: 由转移指令引起, 使流水线的连续流动被破坏 。
解决方法:
1) 静态预测: 总是预测条件不满足
2) 动态预测: 根据程序执行的历史情况, 进行动态预测调整, 准确率较高
3) 预取转移成功和不成功两个控制流方向的目标指令
4) 加快和提前形成条件码
7.4.3 流水线中的多发技术
超标量技术: 指在每个时钟周期内可同时并发多条独立指令, 即以并行操作方式将两条或两条以上指令编译执行。需要配置多个功能部件。CPI<1
超标量流水图:
超流水线技术: 将一些流水寄存器插入流水线段中, 好比流水线再分段。通过提高主频方式, CPI=1。
超流水线图:
超长指令字技术: 由编译程序挖掘指令间潜在的并行性, 将多条能并行操作的指令组成一条具有多个操作码字段的超长指令字。需要多个处理部件
超长指令字图:
7.5 控制方式
控制不同微操作序列所采用的时序控制方式称为 CU 的控制方式。
7.5.1 同步控制方式
任何一条指令或微操作的执行都是事先确定的, 并且受统一基准时标的时序信号所控制的方式。
1) 采用定长的机器周期: 一律以最长的微操作序列和最繁的微操作作为标准, 会造成时间上的浪费。
2) 采用不定长的机器周期: 把大多数微操作安排在一个较短的机器周期内完成, 对于复杂微操作, 采用延长机器周期或增加节拍的办法来解决
延长机器周期示意图:
3) 采用中央控制和局部控制相结合的方法: 将机器的大部分指令安排在统一的, 较短的机器周期内完成, 称为中央控制, 将少数操作复杂的指令中的某些操作 (如: 乘除法和浮点运算) 采用局部控制方式来完成。
示意图:
7.5.2 异步控制方式
不存在基准时标信号, 没有固定的周期节拍和严格的时钟同步, 由专门的应答线路控制, 即执行部件完成操作后发回 "回答" 信号,再开始新的微操作, 需要采用各种应答电路, 较同步控制方式复杂。
7.5.3 联合控制方式
同步控制和异步控制相结合, 对各种不同指令的微操作实行大部分统一, 小部分区别对待的办法。
7.5.4 人工控制方式
为了调机和软件开发的需要, 在机器面板或内部设置一些开关或按键, 来达到人工控制的目的。
注: 以上部分图片来源王道计算机组成原理教材