← 返回首页

408 · COMPUTER ORGANIZATION · 唐朔飞 / 白中英 完整版

计算机组成原理

从一根线、一个门,到一台能跑程序的机器。

28 节课,覆盖王道 8 章。从二进制编码、定点 / 浮点运算,到存储层次、Cache 算例、指令系统、CPU、流水线、总线、IO 完整链路。

~45 分 8 章 28 节 大题:Cache + 指令 + 流水线

// agenda

28 张卡片:从 0/1 到完整计算机

数据 & 运算

  1. 计算机性能指标
  2. 进制 + 原反补移
  3. 补码运算 + 溢出
  4. IEEE 754 浮点
  5. 浮点运算
  6. 加法器与 CLA
  7. 原码 + Booth 乘法
  8. 定点除法

存储 & 指令

  1. 存储层次
  2. SRAM / DRAM 内部
  3. ROM 家族
  4. 主存扩展
  5. Cache 三种映射
  6. Cache 替换 + 写
  7. 虚拟存储与 TLB
  8. 指令格式 + 寻址

CPU & IO

  1. CPU 内部结构
  2. 数据通路
  3. 控制器(硬布线/微程序)
  4. 流水线五段
  5. 流水线性能 + 冒险
  6. 总线分类
  7. 总线仲裁 / 通信
  8. 中断完整流程
  9. IO 控制方式
  10. 整机一图回顾

01 · 性能

字长 · 主频 · CPI · MIPS · MFLOPS。

核心定义

  • 字长:CPU 一次处理的二进制位数(8/16/32/64)
  • 主频 f:时钟频率(Hz),周期 T = 1/f
  • CPI:每条指令平均周期数
  • MIPS:百万条指令/秒
  • MFLOPS:百万浮点运算/秒

关键公式

T_程序 = 指令数 × CPI × T_时钟
   = 指令数 × CPI / f

MIPS = f / (CPI × 10⁶)
加速比 S = T_old / T_new

Amdahl 定律

S = 1 / [(1-f) + f/p]
// f: 可加速比例, p: 加速倍数

例:90% 可并行,10% 串行。无论多少处理器,最大加速 = 1/0.1 = 10。

基准程序 Benchmark

  • SPEC CPU:综合整数/浮点
  • TPC:事务处理
  • Linpack:高性能计算

三种地址

  • 主存物理地址:内存芯片真实地址
  • 逻辑/虚拟地址:进程视角
  • 指令地址:取指地址

02 · 数据表示

原码 / 反码 / 补码 / 移码(8 位为例)。

对比表

+0-0范围
原码0 00000001 0000000−127~+127
反码0 00000001 1111111−127~+127
补码唯一 0 0000000−128~+127
移码补码符号位取反同补码

转换口诀

  • 正数:三码相同
  • 负数:反码 = 原码符号位不动其余取反
  • 负数:补码 = 反码 + 1(或原码符号位不动其余取反末位+1)
  • 补码 → 真值:补码再取一次补码,加负号

典型转换例

x = -22 (8 位)

|x| = 22 = 00010110
原码 = 1 0010110
反码 = 1 1101001  (除符号位取反)
补码 = 1 1101010  (反码 +1)
移码 = 0 1101010  (补码符号位取反)

三种进制互换

2 → 10: 按位权展开 2 → 16: 4 位一组 10 → 2: 整数除 2 取余, 小数乘 2 取整 例 0.625 → 二进制: 0.625 × 2 = 1.25 → 1 0.25 × 2 = 0.50 → 0 0.50 × 2 = 1.00 → 1 结果: 0.101

02 · 加减乘除

补码加减法 + 三种溢出判定。

补码加法规则

[A]补 + [B]补 = [A+B]补
[A-B]补 = [A]补 + [-B]补
符号位一起参加运算,进位丢弃。

三种溢出判定

方法判别
双符号位结果符号位为 01 → 上溢, 10 → 下溢
单符号位 + 进位最高位进位 C_s ≠ 次高位进位 C_{s-1} → 溢出
OF 标志同号相加,结果异号 → 溢出

实例

A = +120 = 01111000
B = +50  = 00110010
A+B  =    10101010 (= -86?)
真值: 120+50 = 170 > 127 → 溢出!
双符: 0 0|1111000 + 0 0|0110010
       = 0 1|0101010 → 01 上溢

定点小数 vs 整数

定点表示:小数点位置约定,硬件不存。
定点纯整数:小数点在最低位之右
定点纯小数:小数点在符号位之右

逻辑移位 vs 算术移位

左移右移
逻辑末补 0首补 0
算术 (原码)符号位不变,末补 0符号位不变,首补 0
算术 (补码)符号位不变,末补 0符号位不变,首补符号位
意义×2 (溢出注意)÷2

03 · 浮点

符号 · 阶码(移码)· 尾数

三种规格

单精度 32 bit:S(1) | E(8) | M(23),偏置 127

双精度 64 bit:S(1) | E(11) | M(52),偏置 1023

规格化数

值 = (−1)^S × 1.M × 2^(E−bias)

尾数最高位"1"隐含不存 → 多 1 位精度。

四种特殊值

EM意义
00…00±0
00…0≠0非规格化数(接近 0)
11…10±∞
11…1≠0NaN

完整算例:5.75 → IEEE 754 单精度

5.75 = 101.11(二)
     = 1.0111 × 2²

S = 0
E = 2 + 127 = 129 = 10000001
M = 0111000_0000000_0000000 0  (23位)

结果: 0 10000001 01110000...0
HEX:  0x40B80000

反过来: 0xC2820000 是多少?
S=1, E=10000101=133, M=00000100...0
值 = -1.0000100... × 2^(133-127)
   = -1.03125 × 64
   = -66.0

表示范围

单精度最大 ≈ 3.4×10³⁸
单精度最小(规格化)≈ 1.18×10⁻³⁸
精度 ≈ 7 位十进制

03 · 浮点

对阶 → 尾数运算 → 规格化 → 舍入。

加减法 5 步

  1. 对阶:小阶向大阶看齐(小阶尾数右移,阶码加)
  2. 尾数求和(差)
  3. 规格化:左规 / 右规
    左规:尾数首两位异号,左移 + 阶码减
    右规:尾数溢出,右移 + 阶码加
  4. 舍入:就近偶舍入、0 舍 1 入
  5. 溢出判断:阶码上溢 → ∞

实例

A = 0.1101 × 2^011
B = 0.1011 × 2^001

step1 对阶: B → 0.001011 × 2^011
step2 加:   0.1101    0
          + 0.001011  0
          = 0.111111  0

step3 规格化: 已规格化
step4 舍入:   保持 0.1111 (4 位)
step5 溢出:   无

结果 = 0.1111 × 2^011

乘除法

乘法:阶码相加,尾数相乘,结果规格化。
除法:阶码相减,尾数相除,结果规格化。

舍入方式

  • 就近偶:默认;中间数向偶数舍
  • 朝零 / 朝正无穷 / 朝负无穷
  • 0 舍 1 入:截断高位为 1 时+1

04 · ALU 内部

从全加器到 CLA 先行进位。

半加器 vs 全加器

半加器全加器
输入A, BA, B, Cin
SumA⊕BA⊕B⊕Cin
CoutABAB + (A⊕B)Cin

串行进位 CRA

n 个全加器首尾串接,C_i+1 = G_i + P_i · C_i。
延迟 O(n),每级 2 个门级延迟。

G_i = A_i · B_i  // 生成
P_i = A_i ⊕ B_i  // 传播

先行进位 CLA

把 C_i+1 完全用 G_0..G_i、P_0..P_i、C_0 展开 → 不再依赖前一级。

C₁ = G₀ + P₀·C₀
C₂ = G₁ + P₁·G₀ + P₁·P₀·C₀
C₃ = G₂ + P₂·G₁ + P₂·P₁·G₀ + …

单级 CLA 不可能做得很大(指数级门数)。实际:4 位一组 CLA,组间再 CLA → O(log n) 延迟。

ALU 结构

ALU = 加法器 + 控制信号选择运算(+ / − / AND / OR / XOR)。复杂运算(×/÷)由多个加减循环完成。

05 · 乘法

原码一位乘 + 补码 Booth。

原码一位乘

  1. 符号位单独 XOR 决定结果符号
  2. 数值部分按绝对值乘
  3. 初始部分积 = 0;乘数末位为 1 → +|X|,否则 +0
  4. 部分积逻辑右移 1 位
  5. n 位乘数循环 n 次

X = 0.1101, Y = 0.1011

部分积      乘数
00.0000   1011
+ X=0.1101
00.1101 → 右移
00.01101  1101.1...    Y末位1→+X
+ X
01.00111 → 右移
00.10011 11.01...      Y末位1→+X
+ X
01.01111 → 右移
00.101111 1.110...     Y末位0→不加
+ 0
00.101111 → 右移
00.0101111  1.1110     Y末位1→+X
+ X
01.0010111 → 右移
00.10010111  完成

结果: +0.10001111  (5/8 × 11/16)

Booth 补码乘法

乘数末尾加附加位 Y_n+1 = 0。每次比较 (Y_n, Y_n+1):

Y_n Y_n+1操作
0 0 / 1 1+0, 右移
0 1+[X]补, 右移
1 0−[X]补 = +[-X]补, 右移

n 位补码乘 → n 次操作(自动处理符号)。结果即直接为乘积补码。

两位 Booth

同时看 3 位 (Y_n−1, Y_n, Y_n+1),每次右移 2 位 → 减半操作次数。实际硬件常用。

05 · 除法

恢复余数 vs 加减交替。

原码恢复余数法

  1. 余数 R = 被除数 X
  2. R = R − Y
  3. 若 R ≥ 0:商位 = 1
  4. 若 R < 0:商位 = 0,恢复 R = R + Y
  5. R 左移一位
  6. 循环 n 次

缺点:恢复操作浪费时间;步骤数不定。

加减交替法(不恢复余数)

  1. 余数 R 与除数 Y 同号 → 商 1,R = R − Y
  2. 余数 R 与除数 Y 异号 → 商 0,R = R + Y
  3. 每次 R 左移一位
  4. n 步后得到 n 位商
  5. 最后若末位上商 0,可加 Y 恢复正余数

优点:步骤数固定,硬件实现简洁。补码除法的标准算法。

除法溢出

商超出表示范围(如 0.X / 0.Y 商 ≥ 1)→ 触发溢出异常。

06 · 存储

金字塔 + 局部性原理 = 高速 / 大容量错觉。

寄存器 ←→ ns 数十字节 Cache ←→ ns 数十 MB TLB ←→ ns 数百项 主存 ←→ 100ns GB SSD ←→ μs TB HDD ←→ ms TB 向上: 快、小、贵 向下: 慢、大、便宜

局部性原理

  • 时间局部性:刚访问的近期还会用
  • 空间局部性:附近地址会被一起用
  • 循环、数组遍历、子程序 → 局部性强
  • 随机访问 → 局部性差,Cache 无效

三级存储观点

  • Cache-主存:硬件管理,对编程透明
  • 主存-辅存(虚拟存储):硬件+OS 共同管,对编程透明
  • 主存-辅存(文件系统):OS 管,编程感知

三种存储分类

按介质半导体 / 磁表面 / 光
按存取方式RAM (随机) / 顺序 (磁带) / 直接 (磁盘)
易失性RAM 易失 / ROM 不易失
可改写RAM 可改 / ROM 多次改 / 只读

CPU 访问主存的两个指标:带宽(每秒字节)+ 访存时间

06 · 半导体存储器

触发器 vs 电容:两种主存技术。

SRAMDRAM
存储元双稳态触发器(6T)电容(1T1C)
每位元件6 个晶体管1 个晶体管 + 1 电容
速度快(几 ns)慢(几十 ns)
密度高 (~4 倍)
是否刷新需要(电荷会泄漏)
功耗低(静态)较高(刷新)
价格便宜
用途Cache、寄存器主存(DDR)

DRAM 刷新

每隔 2 ms 必须刷一遍(电容电荷保持时间)。3 种方式:

  • 集中刷新:每 2 ms 内集中刷一段时间(停止访存的"死区")
  • 分散刷新:每次访存后顺便刷一行 → 访存周期变长
  • 异步刷新:每行单独定时 → 折中

若主存有 128 行 → 集中需 128 × 0.5μs = 64μs"死区";分散将访存周期从 0.5μs 增至 1μs。

DRAM 行列地址复用

为减少地址引脚,DRAM 把地址分行 / 列两次发送(RAS / CAS 选通信号)。

现代 DRAM

SDRAM → DDR → DDR2/3/4/5;带宽提升靠预取 + 并行 bank。

06 · ROM

五种 ROM 各自的"擦写性"。

类型编程方式擦写
掩膜 ROM出厂时光刻不可改
PROM一次性熔丝仅写一次
EPROM电写紫外擦可重复
EEPROM电写电擦可按字节擦
Flash电写电擦按块擦

应用场景

  • 掩膜:大量生产的固件
  • EEPROM:BIOS / 配置数据
  • Flash:SSD / U 盘 / 手机存储

Flash 内部

NOR Flash:按字节访问,可直接执行代码(XIP);常用于 BIOS。
NAND Flash:按页 / 块访问,密度高;用于 SSD、U 盘。

SSD vs HDD

HDDSSD
介质磁盘NAND Flash
随机读~10ms~50μs
抗振
寿命长(机械)有写次数限制(磨损)
FTL有(闪存翻译层 + 磨损均衡)

06 · 容量扩展

位扩展 · 字扩展 · 字位扩展。

位扩展

每字位数不够 → 多片并行组合。共用地址线,各管自己的数据位。

8K×4 → 扩成 8K×8:用两片 A0~A12 同时给两片 片1 → D0~D3 片2 → D4~D7

字扩展

字数不够 → 多片串接。共用数据线,地址多出的高位用来选片(片选信号)。

8K×8 → 扩成 16K×8:用两片 A0~A12 给两片 A13 → 译码器 → CS₁/CS₂ D0~D7 共享

字位扩展(同时)

例:用 1K×4 芯片,组成 4K×8 主存。

需芯片数 = (4K/1K) × (8/4) = 4 × 2 = 8 片
每两片并联补位(8 位)
四组串联补字(4K)
A0~A9 给所有片;A10A11 译码片选

译码器

  • 线选法:每片用一根高位线选;浪费
  • 译码法:用 2-4、3-8 译码器分配片选
  • n 选 1:log₂n 根地址线 → n 片

CPU ↔ 主存接口

CPU 通过 MAR 给地址、MDR 给/收数据、读/写控制线发命令;主存通过 DRDY 应答。

07 · Cache

直接 / 全相联 / 组相联 + 地址划分。

地址划分

主存地址 = 块地址 + 块内偏移;块地址再分:

全相联: Tag | 块内 直接: Tag | Cache 行号 | 块内 组相联: Tag | 组号 | 块内 例: 主存 1M, Cache 32KB, 块 32B 主存地址 20 位 块大小 = 2⁵ → 块内 5 位 块数 = 2¹⁵ 个 Cache 块 2¹⁵ 个块号 直接映射: 行号 = 块号 mod (Cache 块数 = 1024) = 10 位 → Tag = 5 位 全相联: Tag 完整 15 位 4 路组相联: 组数 = 1024/4 = 256 组号 7 位, Tag 8 位

对比

直接全相联组相联
放置自由度固定任意组内任意
查找1 次n 次并行组内并行
电路复杂
冲突抖动严重较少

实际系统多用 4 路 / 8 路组相联,在自由度和电路复杂度间折中。

命中率公式

T_avg = h·t_c + (1−h)·t_m
// h 命中率, t_c Cache 时间, t_m 主存时间

例:h=0.95, t_c=2ns, t_m=100ns → T = 0.95·2 + 0.05·100 = 6.9 ns

07 · 替换与一致

3 种替换 + 2 种写策略。

替换算法

算法策略特点
随机随机选一行替换硬件最简单
FIFO替换最早调入有 Belady
LRU替换最近最久未用性能好,硬件复杂
LFU替换最少使用需计数器

直接映射不需要替换算法(位置已固定);只有全 / 组相联需要。

写策略

Write-throughWrite-back
写时同时写 Cache + 主存只写 Cache,置 dirty
替换不写回dirty=1 才写回
多处理一致性容易需缓存一致性协议
性能每写都慢积攒成块写

写不命中

  • 写分配:先把块调入 Cache 再写
  • 非写分配:直接写主存
  • 常组合:WB + 写分配(块未来要读)
        WT + 非写分配

多核一致性

MESI 协议:每行有 Modified / Exclusive / Shared / Invalid 状态;总线监听(snooping)。

08 · 虚拟存储

从硬件视角看 TLB 与页表。

地址变换硬件流程

  1. CPU 发出虚拟地址 (P, d)
  2. 查 TLB:命中 → 直接得 PFN,访存
  3. TLB 未命中 → 查内存页表
  4. 页表命中且 V=1 → 更新 TLB → 访存
  5. V=0 → 缺页中断 → OS 处理
  6. 访存前还要查 Cache

EAT 公式

假设 TLB 命中率 h,未命中需两次访存:
EAT = h·(t_TLB + t_mem) + (1−h)·(t_TLB + 2·t_mem)

实测:x86 TLB 64-1024 项,命中率 > 99%。

段页式硬件

逻辑 = 段号 S | 段内页号 P | 页内偏移 d S → 段表 → 段内页表起址 (同时验证 S < 段表长度) P → 页表 → 物理块号 F (检查页号 < 段长 / 页大小) 物理 = F | d 带 TLB: 同时缓存 (S, P) → F 映射

TLB / Cache / 主存关系

目的缓存什么
TLB页表项(虚 → 物理)
Cache主存数据 / 指令
主存磁盘上的页 / 段

09 · 指令

指令格式 + 9 种寻址方式。

指令格式

操作码 OP + 地址码。按地址数分:

  • 三地址:OP, A₁, A₂, A₃(A₁ ⊕ A₂ → A₃)
  • 二地址:OP, dst, src(dst ← dst ⊕ src)
  • 一地址:OP, A(隐含累加器:AC ← AC ⊕ A)
  • 零地址:OP(栈式 / NOP / HALT)

操作码扩展

定长操作码无法兼顾"指令数多"与"地址位长"。扩展法:
· 短地址指令用长 OP(少地址腾出位给 OP)
· 长地址指令用短 OP

例:4 位 OP + 12 位地址(三地址 4 位 × 3)。当 OP=1111 时表示扩展,剩下用次 4 位再做选择。

9 种寻址方式

方式EA 计算用途
立即A 本身就是数常数
直接EA = A定位变量
间接EA = (A)跳转表
寄存器R 本身存数最快
寄存器间接EA = (R)指针
相对EA = PC + A跳转、循环
基址EA = BR + A程序定位
变址EA = IX + A数组访问
堆栈SP 隐含函数调用

基址 vs 变址:基址寄存器对用户透明(OS 改 BR);变址寄存器对用户开放(程序改 IX,遍历数组)。

10 · CPU

PC · IR · MAR · MDR · ALU · CU · PSW。

关键部件

  • PC 程序计数器 · 下一条指令地址
  • IR 指令寄存器 · 当前指令
  • MAR · 当前访存地址
  • MDR · 当前访存数据
  • ALU · 算逻运算单元
  • 通用寄存器组 R0…R31
  • PSW · 标志位(Z/C/V/S/I)
  • CU · 控制单元,产生微命令

三种数据通路

结构特点
单总线所有部件挂同一总线;逻辑简单但同时只能传一次
多总线多条并行总线;提高并发
专用固定线路连接;最快,电路复杂

单总线下一条加法指令

// ADD R0, R1
// 假设 ALU 有两个输入锁存器 Y、Z
T1:  R1out, Yin              // R1 → Y
T2:  R0out, ALUop=add, Zin   // R0+Y → Z
T3:  Zout, R0in              // Z → R0

10 · 数据通路

取指 → 译码 → 执行 → 访存 → 写回。

取指阶段 IF(公共)

T1: PCout, MARin
T2: MEMrd, PCout, ALUop=+1, Zin
T3: MDRout(IR), Zout, PCin
T4: IRout

指令送 IR、PC 自增。

译码阶段 ID

控制器分析 OP 字段 → 决定接下来的微操作序列。读出寄存器送 ALU 输入端。

执行举例:ADD R1, [R2]

T5: R2out, MARin          // R2 给地址
T6: MEMrd                  // 读主存
T7: MDRout, Yin            // 数据 → Y
T8: R1out, ALUop=add, Zin  // R1 + Y → Z
T9: Zout, R1in             // 写回 R1
T10: PSW 更新 Z/C/V/S
T11: End

指令周期 4 阶段

  • 取指:取指令 + PC+1
  • 间址:若需间接寻址
  • 执行:完成指令功能
  • 中断:检查 / 响应中断

11 · 控制器

硬布线 vs 微程序。

硬布线 Hardwired

由组合逻辑电路产生控制信号。一条信号 = OP × 节拍 × 标志位 → 与门。

  • ✅ 速度快(直接组合逻辑)
  • ❌ 修改 / 扩展难(重画电路)
  • 典型 RISC 用

微程序 Microprogrammed

把每条机器指令分解成微指令序列,存入控制存储器(CM,通常 ROM)。每个时钟读一条微指令 → 控制信号。

微指令结构

格式说明
水平型一字段一信号;并行多,存大
垂直型类似机器指令;存少,需译码
混合型折中

微指令地址形成

  • 下一条由当前微指令的下址字段指出
  • 计数器自增
  • 分支 / 转移由标志位修改地址

CISC vs RISC

CISC(x86):指令多、变长、寻址复杂 → 微程序;RISC(ARM、RISC-V):指令少、定长、Load-Store → 硬布线 + 流水线。

12 · 流水线

IF · ID · EX · MEM · WB。

t1
t2
t3
t4
t5
t6
t7
t8
I1
IF
ID
EX
MEM
WB
I2
IF
ID
EX
MEM
WB
I3
IF
ID
EX
MEM
WB
I4
IF
ID
EX
MEM
WB

五段功能

  • IF 取指:从 ICache 读指令,PC+4
  • ID 译码:解析 + 读寄存器
  • EX 执行:ALU 运算 / 计算分支地址
  • MEM 访存:读写 DCache(仅 load/store)
  • WB 写回:结果写回寄存器

性能公式

k 段流水,n 条指令:
T = (k + n − 1) × Δt

加速比 S = nk / (k + n − 1)
n → ∞ 时 S → k (最大加速比)

吞吐率 TP = n / T
n → ∞ 时 TP → 1/Δt

流水线分类

  • 单功能 vs 多功能:能处理几种任务
  • 静态 vs 动态:能否动态切换功能
  • 线性 vs 非线性:是否有反馈
  • 标量 vs 超标量:每周期完成几条

12 · 冒险

结构 · 数据 · 控制 三种冒险。

三种冒险

类型原因对策
结构冒险同时刻争抢一份资源(如取指 + 访存)独立 ICache/DCache;增端口
数据冒险 RAW后指令读上一指令未写回的值转发 forwarding / 插气泡 / 编译重排
控制冒险分支指令未定时仍取下一条分支预测 / 延迟槽 / 提前判断

数据冒险三种

  • RAW Read After Write:后指令读前指令的写(常见)
  • WAW Write After Write:写顺序错
  • WAR Write After Read:写覆盖未读

分支预测

  • 静态:永远预测不跳转 / 跳转
  • 1 位动态:根据上次结果预测
  • 2 位饱和:抗噪能力强(最常用)
  • BTB 分支目标缓冲:缓存分支目标

进阶

  • 超标量:多条流水并行发射
  • 超流水:段切更细,频率更高
  • 乱序:动态调度,无依赖即发射

13 · 总线

几条共享线,把所有部件连起来。

按功能

  • 数据总线:双向,传输数据;位数 = 字长
  • 地址总线:单向,传输地址;位数决定寻址范围
  • 控制总线:双向,传命令 / 状态 / 时钟

按层次

  • 片内总线(CPU 内部)
  • 系统总线(CPU ↔ 主存 ↔ IO)
  • 通信总线(机间)

按时序

  • 同步:统一时钟,简单快但要求一致
  • 异步:握手信号
  • 半同步:同步 + 等待信号
  • 分离:地址 / 数据分两次传,提高利用率

带宽计算

带宽 = 频率 × 宽度 × 每周期数
单位:B/s 或 GT/s × byte

例:PCIe 4.0 ×16 = 16 GT/s × 2 B × 16 lanes
    = 64 GB/s

总线性能指标

  • 位宽:并行传输的位数
  • 频率:时钟速度
  • 带宽:每秒数据量
  • 主从:主设备发起,从设备响应

典型总线

前端总线 FSB(已淘汰)→ QPI/UPI → PCIe;存储总线:DDR;外设:USB / SATA / Thunderbolt。

13 · 仲裁 + 通信

谁先用 + 怎么传。

4 种仲裁方式

方式原理优 / 缺点
链式查询请求线广播,允许信号链式传递简单;但近 CPU 优先
计数器定时计数器递增问每个设备起点可移动 → 均衡
独立请求每设备一对请求 / 允许线最快;线多
分布式设备间协商高可靠(无单点)

异步通信三种握手

模式特点
不互锁各自定时撤销;最快但易丢
半互锁请求方等应答后撤请求
全互锁双方都等对方撤销;最可靠最慢

同步通信

主从在统一时钟下,按固定时序传输(如 T1 发地址,T2 发数据)。需要双方速度匹配。

突发传输

连续传送多个数据,只用一次地址 → 大幅提高带宽(DRAM 默认开启 burst)。

14 · 中断

完整中断处理流程 + 嵌套。

中断分类

  • 外中断:外设 / 时钟 / IO 完成(可屏蔽 + 不可屏蔽 NMI)
  • 内中断:异常 / 故障 / trap(除零、缺页、保护错)
  • 陷阱:系统调用

完整流程

  1. 当前指令结束
  2. 检查 INTR → 有则进入中断周期
  3. 关中断,硬件保存 PC、PSW
  4. 识别中断源(向量 / 查询)
  5. 跳到 ISR 入口
  6. 软件保存通用寄存器
  7. 开中断(允许嵌套)
  8. 处理中断
  9. 关中断 → 恢复现场
  10. 开中断 + IRET

中断屏蔽字

每个中断源有一组屏蔽位,决定它能屏蔽哪些其它中断源。同级或低级总被屏蔽,自屏要看实现。

// 例: 4 个中断源 A B C D
// 优先级 A > B > C > D

源    A B C D
A的屏蔽字: 1 1 1 1   // 全屏蔽自及更低
B:           0 1 1 1
C:           0 0 1 1
D:           0 0 0 1

向量中断

每个中断源 → 一个向量号 → 中断向量表中的 ISR 入口地址。
查询式:CPU 轮询所有源;慢但灵活。

中断 vs 异常

中断:异步(外部事件),随机发生;异常:同步(指令引起),必发于该条指令。

15 · IO

查询 → 中断 → DMA → 通道。

方式CPU 介入每次单位
程序查询持续轮询1 字
程序中断请求时响应1 字 / 中断
DMA启动 + 结束1 块 / 中断
通道仅启动通道程序1 组数据 / 中断

DMA 三种工作方式

  • 停止 CPU:DMA 长时间占用总线
  • 周期挪用:DMA 偷一个总线周期(最常用)
  • 交替访问:CPU 与 DMA 错相

DMA 处理流程

  1. CPU 通过 IO 指令初始化 DMA:源 / 目地址 / 长度 / 方向
  2. DMA 请求总线
  3. CPU 让出总线(或挪用周期)
  4. DMA 在内存 ↔ 设备间直接搬数据
  5. 传完发中断告知 CPU

通道

是一种独立的 IO 处理器,能执行通道程序,CPU 只下达开始命令。常见于大型机。

  • 字节多路通道:低速设备共享
  • 选择通道:高速设备独占
  • 数组多路通道:折中

IO 端口编址

方式说明
独立编址专用 IO 指令 IN/OUT;端口空间独立
统一编址(内存映射)把 IO 寄存器映射到内存地址空间,用普通 load/store 即可

设备分类

  • 按速度:低 / 中 / 高速
  • 按交互:人机 / 机机
  • 按字符 / 块:字符设备 / 块设备
  • 按共享:独占 / 共享 / 虚拟(SPOOLing)

// summary

把整个计组串成一张图。

5 大功能部件

  • ① 运算器(ALU + 寄存器组 + PSW)
  • ② 控制器(PC, IR, MAR, MDR, CU)
  • ③ 存储器(Cache - 主存 - 辅存)
  • ④ 输入设备
  • ⑤ 输出设备

3 大思想

  • 抽象层次(电路 → 逻辑 → 体系 → 指令)
  • 局部性原理(Cache、TLB、虚拟存储一脉相承)
  • 并行 / 流水(流水线、超标量、多核)

一条指令的一生

1. PC → MAR → 主存 2. 主存 → MDR → IR 3. PC ← PC + 4 (取指完成) 4. IR 译码 → CU 产生微指令 5. 读寄存器 → ALU 输入端 6. ALU 运算 → 结果 Z 7. (load/store) → MEM 8. 结果回写寄存器 9. 更新 PSW 10. 检查中断 → 下一条

8 章高频考点

  • 数据:补码、IEEE 754 互转
  • 运算:Booth / 加减交替
  • Cache:地址划分 + 命中率
  • 指令:寻址方式 + 操作码扩展
  • CPU:微操作 + 流水线时空图
  • 总线:带宽计算
  • IO:中断 vs DMA