713 字
4 分钟
计算机组成原理:从门电路到一个能跑 Linux 的 CPU
计算机组成原理:从门电路到 CPU
从晶体管到逻辑门
CPU 的最底层是 MOSFET 晶体管。一个 N 沟道 MOSFET 就是一个电压控制的开关:栅极电压高于阈值 → 导通,否则关断。
CMOS 反相器只用两个晶体管:
VDD ──[PMOS]── OUT ──[NMOS]── GND │ ININ=0 → PMOS 导通,OUT=VDD(1) IN=1 → NMOS 导通,OUT=GND(0)
所有的逻辑门——NAND、NOR、XOR——都是这个结构的变体。NAND 需要 4 个晶体管,一个完整 CPU 需要数十亿个。
组合逻辑 → 时序逻辑
组合逻辑的输出仅取决于当前输入。加入触发器(Flip-Flop)后,电路有了”记忆”:
- D 触发器:在时钟沿采样 D 输入,保存到 Q 输出
- 寄存器:一组 D 触发器的集合(32 位寄存器 = 32 个 DFF)
- 寄存器堆:多个寄存器的阵列,通过地址选择读写
CPU 的本质就是:组合逻辑做计算 + 寄存器存状态 + 时钟驱动节奏。
五级流水线 CPU
经典 RISC 五级流水线:
取指(IF) → 译码(ID) → 执行(EX) → 访存(MEM) → 写回(WB)每一级做的事:
| 阶段 | 动作 | 关键硬件 |
|---|---|---|
| IF | PC → 指令存储器 → 取出指令 | 指令 Cache、PC 寄存器 |
| ID | 解码指令,读寄存器堆 | 寄存器堆(2 读 1 写端口) |
| EX | ALU 计算,地址生成 | ALU、前推多路选择器 |
| MEM | 数据存储器读写 | 数据 Cache |
| WB | 结果写回寄存器 | 寄存器堆写端口 |
冒险处理
数据冒险:后一条指令需要前一条指令的结果。
add r1, r2, r3 # r1 = r2 + r3sub r4, r1, r5 # r4 = r1 - r5 ← 需要 r1,但 r1 还未写回解决方案——前推(Forwarding):ALU 的结果在 EX 阶段就旁路到下一条指令的 EX 输入,无需等待写回。
控制冒险:分支指令导致取指地址不确定。用分支预测——BTB(Branch Target Buffer)+ 两位饱和计数器——现代 CPU 的预测准确率 > 95%。
Cache 层次结构
访存是 CPU 最大的瓶颈。现代 CPU 的 Cache 层次:
L1 Cache: 32KB, 1-2 cycles 延迟L2 Cache: 256KB-1MB, 10-20 cyclesL3 Cache: 8-32MB, 30-50 cyclesDRAM: 8-64GB, 100-300 cyclesCache 的核心参数:块大小、相联度、替换策略(LRU)、写策略(write-back/write-through)。
缓存一致性(MESI 协议)
多核系统的经典问题:Core 1 修改了地址 X,Core 2 的 L1 Cache 中 X 的副本过时了。
MESI 协议用 4 个状态解决此问题:
- Modified:独占且已修改
- Exclusive:独占且干净
- Shared:多核共享
- Invalid:无效
理解计算机体系结构不需要记住所有的细节。需要建立的是一种”分层抽象”的思维习惯——每一层对上层隐藏细节,对下层提出要求。带着这种思维去理解任何复杂系统,都会豁然开朗。
计算机组成原理:从门电路到一个能跑 Linux 的 CPU
https://mizuki.mysqil.com/posts/computer-architecture-basics/