概论#
冯诺依曼结构:五大部件 ALU CU 存储器 IO设备
计算机的五层次结构 虚拟机器 M4 高级语言机器 用编译程序翻译成汇编语言程序 M3 汇编语言 用汇编程序翻译成机器语言 M2 操作系统 用机器语言解释操作系统 传统机器 M1 传统语言 用微程序解释机器指令 微程序机器 M0 微指令系统 由硬件直接执行微指令
性能指标#
机器字长#
- 32 位处理器 → 机器字长一般为 *32 bit
| 概念 | 谁决定的? | 作用点 | 示例 |
|---|---|---|---|
| 机器字长 | CPU 内部 ALU/寄存器宽度 | CPU 一次运算能力 | x86-64 → 64bit |
| 指令字长 | ISA 的格式设计 | 每条指令的长度 | x86 变长指令、RISC-V 32bit |
| 存储字长 | 内存组织+数据总线 | CPU 每次从内存取多少位 | DDR4 通常 64bit |
总线#
总线的分类#
- 片内总线
- 通信总线
- 系统总线 : ①数据总线:用来传输各功能部件之间的数据信息。 ②地址总线:用来指出数据总线上的源数据或目的数据在主存单元的地址或I/O设备的地址 ③控制总线:用来发出各种控制信号传输线;还起到监视各部件状态的作用。
总线结构#
总线成为性能瓶颈
多总线结构
总线判优控制#
为解决总线控制权的问题(多设备同时竞争使用权)
集中式仲裁方式: 1链式查询、2计数器定时查询、3独立请求(控制逻辑集中在某处,实现相对简单)
分布式仲裁方式:控制逻辑复杂,可靠性高。
1。链式查询: 离总线控制部件最近的设备具有最高的优先级。对电路故障敏感,且优先级别低的设备可能很难获得请求 2。计数器定时查询: 3。独立请求方式:响应快,优先次序控制灵活(通过程序改变),但控制线数量多,总线控制更复杂。(n个设备需要2n条控制线)
总线周期#
完成一次总线操作的时间称为总线周期
- 申请分配阶段 主申请使用权 总线仲裁授权
- 寻址阶段 主模块给地址和命令,指定从模块被激活
- 传数阶段 主从之间进行数据的读或写操作
- 撤销阶段 撤销主模块有关信息 让出使用权
四种**总线通信控制#
同步通信和异步通信的主要区别是前者有公共时钟,总线上的所有设备按统一的时序,统一的传输周期进行信息传输,通信双方按约定好的时序联络。 后者没有公共时钟,没有固定的传输周期,采用应答方式通信,具体的联络方式有不互锁、半互锁和全互锁三种。 不互锁方式通信双方没有相互制约关系;半互锁方式通信双方有简单的制约关系;全互锁方式通信双方有完全的制约关系。其中全互锁通信可靠性最高。
1. 同步通信 (Synchronous)#
- 核心机制: 统一时钟。同一时序
- 优点: 控制简单 模块步调一致
- 缺点: 缺乏灵活性,强制同步。速度取决于最慢的模块(木桶效应),总线效率受限。
- 适用: 总线长度短
2. 异步通信 (Asynchronous)#
- 核心机制: 无公共时钟,采用应答方式(握手)。
- 主模块发请求 (Request) -> 等待 -> 从模块发响应 (Acknowledge)。
- 优点: 极高灵活性,允许模块速度不一致。
- 应答方式分类: 不互锁、半互锁、全互锁。
- 适用: 各部件速度差异大,需并行或串行传送的场合。
3. 半同步通信 (Semi-synchronous)#
- 核心机制: 同步时钟 + 等待信号 (WAIT)。
- 既保留统一时钟,又允许通过插入“等待周期”来协调慢速设备。
- 特点: 比异步简单,比同步灵活。控制可靠,但时钟频率不能太高。
- 适用: 系统工作速度不高,但设备速度差异较大的简单系统。
4. 分离式通信 (Split-transaction)#
- 核心机制: 准备数据不占总线
- 主模块发命令后立即释放总线;从模块准备好数据后,重新申请总线发送数据。
- 特点: 只有在传输有效数据/命令时才占用总线,不存在空闲等待时间。
- 优势: 充分挖掘总线潜力,实现信息交叉重叠传送,效率最高。
- 适用: 大型计算机系统。
存储器#
缓存-主存 主存-辅存 双层次#

①目的:提高访存速度;扩大存储容量。缓存-主存层次主要解决 CPU 和主存速度不匹配的间题。主存-辅存层次主要解决存储系统的容量问题。 ②设计依据:程序访问的局部性原理。CPU 从主存取指令或取数据,在一定时间内,只是对主存局部地址区域的访问。这是由于指令和数据在主存内都是连续存放的,并且有些指令和数据往往会被多次调用(如子程序、循环程序和一些常数),即指令和数据在主存的地址分布不是随机的,而是相对的簇聚,使得 CPU 在执行程序时,访存具有相对的局部性。
现代计算机中对寄存器的定义是指CPU内部的小型、高速存储位置,也包括MAR和MDR

主存中存储地址分配#
字节序 问题 既然内存是按“字节”编址的(每个地址存8位,存储单元是 1 字节),但CPU处理的“字”通常是32位或64位(多字节),那么当我们要把一个多字节的“字”存入内存时,这几个字节谁排在前面(低地址),谁排在后面(高地址)呢?

大端模式 (Big-Endian) / 大尾方式
-
规则: 高位字节存放在低地址(起始地址)。
-
图片解读:
- 字地址为
0(起始位置)。 - 内存里的顺序是:
12->34->56->78。 - 地址 0 存
12(高位),地址 3 存78(低位)。
- 字地址为
-
特点: 这最符合人类的阅读习惯(从左到右)。
-
应用: 网络传输标准(TCP/IP 协议)通常采用大端模式。所以大端序也被称为“网络字节序”**。 小端模式 (Little-Endian) / 小尾方式
-
规则: 低位字节存放在低地址(起始地址)。
-
图片解读:
- 字地址为
0(起始位置)。 - 内存里的顺序是:
78->56->34->12。 - 地址 0 存
78(低位),地址 3 存12(高位)。
- 字地址为
-
特点: 看起来是反的,但对计算机电路(如加法器)很友好,因为计算通常从低位开始。
-
应用: x86 架构的 CPU(如 Intel、AMD,即我们大部分服务器和电脑)通常采用小端模式。所以小端序也被称为**“主机字节序”**。
-
-
-
按字寻址
存储芯片内的地址译码方式#
线选法:地址信号只须经过一个方向的译码就可以选中某一存储单元的所有位。适用于地址线较少的芯片。
重合法:地址线分成两组,分别经行、列两个方向译码,只有行、列两个方向均选中的存储元才能进行读/写。适用于地址线较多的芯片。
DRAM和SRAM#

核心对比表:
| 比较维度 | 记忆核心 | SRAM (静态随机存储器) | DRAM (动态随机存储器) |
|---|---|---|---|
| 存储原理 | 触发器稳 vs 电容漏 | 双稳态触发器 | 电容存储电荷 |
| 存储元件 | SRAM 复杂,DRAM 简单 | 晶体管数量多 (通常 6个MOS管) | 简单 (1管1容:1MOS + 1电容) |
| 刷新需求 | 静态 vs 动态 | 不需要 (通电即保持) | 需要 (电荷泄露,需周期性刷新) |
| 集成度 | DRAM 更“挤”得下 | 低 (元件大,占地多) | 高 (元件少,占地小) |
| 存取速度 | 快 vs 慢 | 极快 (非破坏性读出) | 较慢 (充放电慢,且需重写) |
| 功耗 | 谁更省电 | 较大 (晶体管持续导通) | 较小 (动态刷新虽耗电,但整体更低) |
| 成本/价格 | 贵 vs 便宜 | 高 | 低 |
| 引脚/地址 | 多 vs 少 | 地址线同时送入 (引脚多) | 地址线复用 (分行/列送,引脚少) |
DRAM的刷新#
动态随机存取存储器利用存储元中的栅极电容存储电荷,电容上有电荷表明存放数据1,无电荷表明存放数据0。由于存储元电路存在漏电流,使栅极电容上的电荷流失,因此必须每隔一段时间对存储体中的所有记忆单元的栅极电容补充电荷,这个过程称为刷新。
刷新的过程实质上是先将原存信息破坏性读出,再由刷新放大器形成原信息并重新写入的再生过程
刷新方式#
- 集中刷新:在规定的一个刷新周期内,对全部存储单元集中一段时间逐行进行刷新,此刻必须停止读/写操作。这段时间称为“死时间”
- 分散刷新:对每行存储单元的刷新分散到每个存取周期内完成,无死区
- 异步刷新:是前两种方式的结合,既可缩短“死时间”,又充分利用最大刷新间隔
RAM#

存储器和CPU的连接#
位、字 扩展#


汉明码#
新增添的检测位数k应满足:2^k ≥ n+k+1。

核心逻辑#
-
(第 1 位):负责二进制下标倒数第 1 位是 1 的位置。
-
(第 2 位):负责二进制下标倒数第 2 位是 1 的位置。
-
(第 4 位):负责二进制下标倒数第 3 位是 1 的位置。
-
…以此类推。
2. 快速分组口诀(Skip 策略)#
这是做手工计算时最不容易出错的方法:
-
组(位置 1): “拿 1 个,跳 1 个”
-
检查位置:1, 3, 5, 7, 9, 11…
-
图解:
[1] _ [3] _ [5] _ [7] ...
-
-
组(位置 2): “拿 2 个,跳 2 个”
-
检查位置:2, 3, 6, 7, 10, 11…
-
图解:
_ [2, 3] _ _ [6, 7] _ _ [10, 11] ...
-
-
组(位置 4): “拿 4 个,跳 4 个”
-
检查位置:4, 5, 6, 7, 12, 13, 14, 15…
-
图解:
_ _ _ [4, 5, 6, 7] _ _ _ _ [12...]
-
异或就是 一行和答案一起使得1的个数为偶
多体并行存储器#
多体并行系统就是采用多体模块组成的存储器。每个模块有相同的容量和存取速度,各模块各自都有独立的地址寄存器(MAR)、数据寄存器(MDR)、地址译码、驱动电路和读/写电路,他们能并行工作,又能交叉工作。 多体并行存储器分为高位交叉编址(顺序编址)和低位交叉编址(交叉方式)两种:
- 高位交叉弊端:假设程序顺序存储在M0内 可能导致M0很忙 其他存储器很闲
- 低位交叉:可以在不改变每个模块存取周期的前提下,提高存储器的带宽
带宽 bps 计算
Cache#

原理流程#
先查缓存,命中直取;未命中,整块调入;满了就换
Cache – 主存的地址映射#

直接 实现简单,但主存块只能固定地对应某个缓存块,不够灵活,命中率低。
全相联 灵活,命中率也更高,缩小了块冲突率。但所需的逻辑电路甚多,成本高
组相联 它们的折中,被广泛应用。
缓存一致性问题#
简单来说,当 CPU 修改了 Cache 里的数据时,主存(内存)里的数据还是旧的。这时候,Cache 和主存的数据就不一致了。
写直达法#
每次 CPU 修改 Cache 中的数据时,立即、同时把这个新数据也写回到主存中。
- 后果: 时刻保持 Cache 和主存的数据一模一样,增加了访存次数。写直达法的”写“操作时间就是访问主存的时间。
写回法 (Write-Back)#
CPU 修改数据时,只修改 Cache,不修改主存。 只有当这个被修改过的块(Block)因为空间满了要被替换时,才把它一次性写回主存。
- 关键技术 —— 脏位 (Dirty Bit):
- Cache 给每个块贴了个“便利贴”(标记位),叫 Dirty Bit。
- 如果 CPU 改了数据,就把这个位设为
1(脏了)。 - 如果只是读操作,这个位保持
0(干净)。 - 替换时: 如果是“干净”的,直接扔掉;如果是“脏”的,才需要写回主存。

Cache 替换算法#
FIFO LRU 随机

IO设备#
I/O 与主机交换信息四大控制方式:#
-
**程序查询方式,不断查询,踏步等待,串行最慢
-
程序中断方式:并行更好
- CPU 启动 I/O 后 不再查询
- 设备准备好 → 发中断请求
- CPU 暂停当前程序去处理 I/O
程序查询方式和程序中断方式都由程序实现外围设备的输入输出,它们有何不同? (1)程序查询方式是用户在程序中安排一段输入输出程序,它由I/O指令、测试指令和转移指令等组成。CPU一旦启动I/O后,就进入这段程序,时刻查询I/O准备的情况,若未准备就绪就踏步等待;若准备就绪就实现传送。在输入输出的全部过程中,CPU停止自身的操作。 (2)程序中断方式虽也要用程序实现外部设备的输入、输出,但它只是以中断服务程序的形式插入到用户现行程序中。即CPU启动I/O后,继续自身的工作,不必查询I/O的状态。而I/O被启动后,便进入自身的准备阶段,当其准备就绪时,向CPU提出中断请求,此时若满足条件,CPU暂停现行程序,转入该设备的中断服务程序,在服务程序中实现数据的传送。 从宏观上分析,程序中断方式克服了程序查询方式中的 CPU” 踏步“现象,实现CPU I/0 的并行工作,提高了 CPU 的资源利用率。
- DMA :主机与I/O并行工作**,主存与I/O之间有一条直接数据通路**
当I/O准备就绪后,发出DMA请求,此时CPU不直接参与I/O和主存间的信息交换,只是把外部总线(地址线、数据线和有关的控制线)的使用权暂时交赋予DMA,仍然可以完成自身内部的操作(如加法、移位等),故不必中断现行程序,只需暂停一个存取周期访存(即周期挪用),CPU的效率更高。
还是有中断请求,虽然不靠中断请求传数据,但是需要向CPU结束报告传送结束,cpu将中断现行程序去做DMA结束处理工作
4. 通道/IO处理机专用处理器最高效。
接口 vs 端口:
I/O接口通常是指主机与I/O设备之间设置的一个硬件电路及其相应的软件控制。
接口是连接系统;端口指接口电路中的一些寄存器。
为何要接口(5 理由):
选设备、做缓冲、转格式、调电平、管状态。
接口四类:
串并、可编/不可编、通用/专用、程序/DMA。
DMA#
选择型DMA接口、链式多路型DMA接口、独立请求多路型DMA接口
流程#
1. 预处理:给DMA指明是读还是写;主存起始地址→DMA;设备地址→DMA;传送数据个数→DMA;启动设备
2. 数据传送:继续执行主程序;同时完成一批数据的传送
3. 后处理:中断服务程序;CPU做DMA结束处理工作
DMA与主存交换数据的三种方式:#

定点数和浮点数 计算#
真值#
是我们在日常数学计算中使用的形式。
- 特点: 带有
+(正)或-(负)符号,数字部分通常用二进制表示(也可以是十进制)。 示例: - (二进制真值) 等于十进制的
- (二进制真值) 等于十进制的
机器数#
这是数值在计算机硬件(寄存器/内存)中的实际存储形式。
表示机器数#
正数情况下,三码相同;负数情况下,反码符号位不变,其余位取反,补码在反码加1
负数求补码的方法: 1符号位不变 2数值位取反加一
补码求真值技巧
移码#
为了方便比较大小(浮点数的阶码)。
移码和补码只是一个符号位不同
定点数和浮点数#

实际工业应用 IEEE 754#
为了解决定点数“范围太窄”的问题,科学家引入了科学计数法的思想
- S (Sign): 符号位,0正1负。
- M (Mantissa): 尾数。是一个定点小数,决定了数的精度(有效数字有多少位)。
- E (Exponent): 阶码。是一个定点整数,决定了数的范围(小数点能移多远)。
- R (Radix): 基数(通常隐含为 2)。
定点运算#
加减法 ==已知 ,求 的方法是:连同符号位,按位取反,末位加一== 用符号位产生的进位与最高有效位产生的进位异或操作,若为1则溢出
最高位进位舍去
乘除法


浮点运算#
加减运算:对阶、尾数求和、规格化、舍入、溢出判断
乘除运算:阶码运算、尾数运算
逻辑右移等于小数点左移
指令系统#
指令= 操作码 + N个地址码

指令字长 == 存储字长 (通常是8bit的整数倍)
指令中有三种字段: 操作码字段、寻址特征字段和地址码字段。 操作码字段指出机器完成某种操作,其位数取决于指令系统的操作种类。 寻址特征字段指出该指令以任何方式寻找操作数的有效地址,其位数取决于寻址方式的种类。 地址码字段和寻址特征字段共同指出操作数或指令的有效地址,其位数与寻址范围有关。
字节对齐#
寻址方式#

指令寻址#

数据寻址(指令进行中)#
-
立即寻址 (Immediate): 数据就在指令里。 形式地址A就是操作数
- 例子:
int a = 10;(10 就在指令里,不用去别处找)。
- 例子:
-
直接寻址 (Direct): 指令里写的是内存地址。
- 例子: “去 1001 号房间拿数据”。
-
寄存器寻址 (Register): 数据在 CPU 的寄存器里。
- 例子: “东西在我的口袋(寄存器AX)里,直接拿”。这是最快的。
-
间接寻址 (Indirect): 指令里给的地址里存的还是个地址(套娃)。
- 例子: “去 1001 号房间,桌上有张纸条,纸条上写着东西在 2002 号房间”。(类似 C 语言的指针
*ptr)。
- 例子: “去 1001 号房间,桌上有张纸条,纸条上写着东西在 2002 号房间”。(类似 C 语言的指针
-
基址/变址寻址: 用基础地址 + 偏移量。
- 例子: 数组访问
arr[i]。数组开头是基址,i是偏移量。
- 例子: 数组访问
CPU#
CPU的主要功能:指令控制、操作控制、时间控制、数据加工、处理中断等
寄存器:存放当前指令的地址,存放操作数
CU:发出各种操作命令序列
ALU:实现算术逻辑运算
中断系统:处理异常情况和特殊请求
中断系统#
中断:中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。简单来说,就是CPU停下当前的工作任务,去处理其他事情,处理完后回来继续执行刚才的任务。
设计中断系统需解决的问题:
①各中断源如何向CPU提出中断请求 ②当对个中断源同时提出中断请求时,中断系统如何确定优先响应哪个中断源的请求 ③CPU在什么条件、什么时候、以什么方式来响应中断 ④CPU响应中断后如何保护现场 ⑤CPU响应中断后,如何停止原程序的执行而转入中断服务程序的入口地址 ⑥中断处理结束后,CPU如何恢复现场,如何返回到原程序的间断处 ⑦在中断处理过程中又出现了新的中断请求,CPU该如何处理
一次程序中断大致分为五阶段 中断请求 中断判优 中断响应:EINT 为“1” 且该设备未被屏蔽 进入中断响应周期 执行 中断隐指令 中断服务:进入取指周期 按向量地址取出一条无条件转移指令,转至对应的中断服务程序开始执行 中断返回:中断服务程序的最后一条指令就是中断返回指令,即返回到程序断点,至此一次程序中断结束
中断服务的流程:(保护现场 中断服务 恢复现场 中断返回)
**CPU****进入中断周期后,完成哪些操作?
(1)保存断点:保存当前正在执行的程序的地址,以便在中断处理完毕后能返回被中断的原程序继续执行。
(2)形成中断服务程序的入口地址:确定中断服务程序的入口地址,并将其装入程序计数器。(硬件向量法/软件查询法)
(3)硬件关闭中断:在响应中断后,CPU会自动关闭外部硬件中断,以防止在处理中断的过程中再次被中断。【前三个为中断隐指令,CPU自动完成】
(4)保护现场:保存当前程序的运行状态,包括PC、程序状态字、通用寄存器等的内容,以便在中断处理完毕后能恢复到中断前的状态。
(5)中断服务:执行中断服务程序,处理中断请求。
(6)恢复现场:在中断处理完毕后,恢复被保存的程序运行状态。
(7)中断返回:在中断服务子程序的最后要安排一条中断返回指令,执行该指令,系统自动将堆栈内保存的程序计数器和程序状态字值弹出,从而恢复主程序断点处的地址值,使CPU转到被中断的程序中继续执行。
优先级和屏蔽字#
什么是中断屏蔽字,它的作用是什么? 对应一个中断请求触发器就有一个屏蔽触发器,将所有屏敝触发器组合在一起,便构成一个屏蔽寄存器,屏蔽寄存器的内容称为屏蔽字 作用:控制中断的响应优先级
流水线#
影响流水线性能的因素有哪些?分别由什么原因导致的?分别采用什么方法解决?
结构相关:重叠指令争用同一功能部件产生资源冲突 解决办法: 1 在完成前一条指令对数据的存储器访问时,暂停(一个时钟周期)取后一条指令的操作 2 设置两个独立的存储器分别存放操作数和指令,以免取指令和取操作数同时进行时相互冲突。
数据相关:流水线中的各条指令因重叠操作,可能改变对操作数的读写访问顺序,从而导致了数据相关冲突 解决办法之一是后推法,即遇到数据相关时,就停顿后继指令的运行,直至前面指令的结果已经生成。 解决办法之二是采用定向技术。直接将执行结果送到其他指令所需要的地方。
控制相关:转移指令导致的 尽早判别转移是否发生,尽早生成转移目标地址;加快和提前形成条件码;提高转移方向的猜准率
多级时序#
微操作命令的分析#
- 取指周期
公共取指周期模板(必背):
无论什么指令,前三个节拍(取指)几乎是一样的。
(注:具体是否+1还是+4,看题目是按字编址还是按字节编址)
2间址周期
3执行周期
- 访存指令: ADD X;LDA X;STA X;

控制单元 CU#


微程序#
要搞懂微程序,必须先搞懂这四个概念的层级(从大到小):
- 机器指令 (Machine Instruction):程序员看到的指令,如
ADD R1, R2。 - 微程序 (Micro-program):一条机器指令对应一段微程序。
- 微指令 (Micro-instruction):微程序中的一步。通常对应一个时钟周期(节拍)。
- 微命令 (Micro-command):微指令中的具体信号位。例如
PC_out(PC输出)、ALU_add(ALU加法)。
对应关系:
- 1条机器指令 = 1段微程序 (由若干条微指令序列组成)。
- 1条微指令 = 若干个微命令 (并行发出的控制信号)。
把微程序设计想象成你在写一个 “解释器”。
- 输入:机器指令(字节码)。
- 代码库:控存(CM)。
- 执行逻辑:每读到一个字节码,就跳转到代码库里对应的函数(微程序),一行行执行代码(微指令),指挥底层硬件(ALU, 寄存器)干活。
基本工作流程:
- 取指令:从主存取来机器指令的操作码(OP)。
- 映射:将 OP 映射为控存中的一个地址(这是该指令对应微程序的入口地址)。
- 读微指令:从控存中取出第一条微指令。
- 执行并下址:执行这条微指令包含的微命令,并计算下一条微指令的地址。
下址逻辑#
微程序怎么知道下一条微指令在哪里?这通常包含在微指令的格式中。
格式通常是: [ 操作控制字段 | 顺序控制字段 ]
下址的来源有三种:
-
计数器自增:类似 PC+1,直接去下一条()。
-
断定 (Branching):根据状态标志(如 ZF, CF)跳转。
- 考题写法:如果微指令中有测试位,比如 “如果是负数则跳到 X”,这就是断定。
-
操作码映射 (Mapping):仅用于第一条微指令,由机器指令的 OP 码转化而来。
除非题目明确要求“采用断定法”或“给出下址形成逻辑”,否则在写综合题时,默认可以省略那些蓝色的“寻找下一地址”的步骤,直接写数据通路的操作。
执行阶段


微指令#
·垂直型微指令的结构类似于一般机器指令的结构,由微操作码确定微指令的功能。通常一条微指令只能有1~2个微操作命令。因为它要经过译码后控制对象,影响每条微指令的执行时间。而且垂直型微指令字长较短,实现一条机器指令的微程序要比水平型微指令编写的微程序长得多,它是用较长的微程序结构来换取较短的微指令格式
·水平型微指令一次能定义并执行多个并行操作,其并行操作能力强,效率高。而且水平型微指令的大多数微命令一般可直接控制对象,故执行每条微指令的时间短。又因水平型微指令字长较长,故可用较少的微指令数来实现一条机器指令的功能