如果你只打算读一本理解「计算机到底是怎么工作的」的书,那就应该是这本——Patterson & Hennessy《计算机组成与设计:硬件/软件接口(RISC-V 版)》,江湖人称 COD 或「P&H」。
两位作者是什么来头?图灵奖得主,各一位。 Patterson(伯克利)是 RISC 概念的提出者、RAID 的发明人;Hennessy(斯坦福)是 MIPS 之父。这本 1665 页的书,就是两位宗师用最「干净」的指令集 RISC-V,把计算机组成原理从晶体管讲到数据中心。
这篇文章带你把整本书的骨架和精华过一遍。读完它,再翻开原著就不会迷路了。
第 1 章:抽象与性能——一切开始的地方
计算机体系结构领域过去 60 年沉淀了八大伟大思想,全书反复出现:
- 面向摩尔定律设计——芯片资源每 18 个月翻倍,设计要瞄准四年后的工艺,而不是今天的;
- 用抽象简化设计——上一层不必知道下一层的实现,这是全书的主线;
- 加速大概率事件——优化常见路径比优化罕见路径收益大得多,Cache、分支预测全是这个思想;
- 并行提高性能——从流水线到多核 GPU 的总纲;
- 流水线化——洗衣店的智慧(后面细讲);
- 预测——猜对了比等待快,分支预测器因此成为 CPU 里最聪明的部件之一;
- 存储器层次——速度和容量不可兼得,那就造一座金字塔(第 5 章主角);
- 冗余提高可靠性——备份和校验码的哲学。
第 1 章还给出全书最重要的公式,我称之为性能铁律:
$$\text{CPU 时间} = \text{指令数} \times \text{CPI} \times \text{时钟周期}$$
后面所有章节,都是在优化这三个因子。 第 2、3 章减少指令数,第 4 章压低 CPI,第 5、6 章解决「内存跟不上 CPU」和「单核不够用」。记住这张图,全书就有了地图。
第 2 章:指令集——计算机的母语
这一章是 RISC-V 的主场。核心观点:软件和硬件的接口就是指令集(ISA),它是整个计算机体系的地基。
RISC-V 设计哲学浓缩为几条:
- 简单至上:RV32I 只有 47 条基础指令(对比 x86 的几千条);
- 规整即高效:32 个寄存器、4 种指令格式、字段位置固定,硬件译码极简;
- x0 恒等于零:一个「免费」的清零寄存器,衍生出
mv、比较、伪指令一大票用途; - load-store 架构:只有
lw/sw碰内存,运算指令只操作寄存器。
书里用递归求和、swap、排序等 C 例子逐句翻译成 RISC-V 汇编,几个必会的招式:
add x5, x6, x7 # 三地址:x5 = x6 + x7
lw x5, 8(x6) # 从内存 x6+8 处加载字
sw x5, 8(x6) # 存回内存
beq x5, x0, else # 等于零就跳转(if 的骨架)
jal x1, foo # 跳转并保存返回地址(call 的骨架)
jalr x0, x1, 0 # ret 的真身:跳到 x1
过程调用(函数)是本章重头戏:调用者/被调用者各保哪些寄存器(t 系列不保,s 系列必保)、栈帧怎么开怎么收、ra 为什么必须第一时间压栈——这些规则合称调用约定,写汇编不守约定,程序就「偶尔正常偶尔玄学」。
本章结尾的对比很有趣:MIPS、x86 逐一登场。x86 那种「指令长度 1~15 字节、操作数顺序颠倒、几十种寻址模式」的历史包袱,让你瞬间理解为什么 RISC 会赢。
本章还藏着 C 排序程序的完整汇编案例——全书最值得手抄一遍的段落,写完你就真正会读汇编了。
第 3 章:算术运算——二进制世界的加减乘除
计算机做算术远比想象中麻烦,本章回答三个问题:
减法怎么办?补码。 正负数统一用补码表示,加法器顺便就把减法做了,硬件省一套电路。代价是要理解溢出:两个正数相加得到负数,就是符号位被「顶」了。
乘除法怎么加速? 朴素乘法是「移位 + 加法」的循环,书中逐步演进到 Booth 算法。除法更慢(不能完全并行),这也是为什么嵌入式程序员看到 % 运算会皱眉。
小数怎么办?IEEE 754 浮点。 精髓是把二进制小数写成「符号 × 1.xxx × 2^n」的科学计数法。必懂的常识:
0.1在二进制里是无限循环小数,所以浮点比较永远用容差,不用==;- 浮点加法不满足结合律——
(a+b)+c ≠ a+(b+c),编译器不敢随便重排; - 单精度 32 位 = 1 符号 + 8 指数 + 23 尾数。
本章结尾用 RISC-V 向量扩展(SIMD)给矩阵乘法提速 8 倍——「用更宽的寄存器一次算 8 个数」,这是 GPU 计算的思想雏形。
第 4 章:处理器——把指令集变成电路
全书难度巅峰,也是最有成就感的部分。核心问题:一条指令到底是怎么被执行的?
数据通路:五条指令拼出一台 CPU
书中先搭一个「单周期数据通路」:取指 → 译码 → 读寄存器 → ALU 运算 → 访存 → 写回,lw/sw/beq/add/jal 五种指令轮流走完这条流水线。多路选择器(MUX)负责按指令类型「选路」,控制单元用真值表生成每一路的开关信号。
流水线:洗衣店的智慧
单周期跑一条指令要一个完整长周期,快不起来。流水线的思路和洗衣店一样:洗衣机还在转,你就把下一批衣服备好——一条指令分 5 步(IF/ID/EX/MEM/WB),5 条指令同时在机器的不同阶段,理想性能直接翻 5 倍。
但世界不完美,冒险(hazard)来了:
- 数据冒险:
add x5,...后紧跟sub x6, x5, ...,x5 还没写回就要用。解法是转发(forwarding)——ALU 结果直接从 EX 段送到下一条指令的输入,不必等写回; - load-use 冒险:load 的数据 MEM 段末才拿到,无法转发,只能停一拍(stall);
- 控制冒险:遇到 beq,下一条取什么?CPU 根本不知道分支往哪跳。解法是分支预测——猜对了零开销,猜错了冲刷流水线。
RISC-V 的规整设计在这里兑现红利:字段位置固定,五段流水线的转发逻辑干净利落;x86 要做到同样的效果,译码阶段就得复杂十倍。
本章最后把单周期扩展成完整流水线数据通路,加上异常处理(ecall、非法指令 → 保存 PC 进 mepc、跳到 mtvec)——这正是上一篇文章《RISC-V 从入门到实战》里 CSR 那套机制的硬件本体。
第 5 章:存储层次——用金字塔骗过物理定律
CPU 快了 1000 倍,DRAM 只快了 10 倍——存储墙是现代计算机最痛的矛盾。本章的答案:既然造不出又快又大的内存,就用局部性原理造一个骗局。
两个局部性支撑整个金字塔:
- 时间局部性:刚用过的数据马上还会用;
- 空间局部性:用了地址 x,大概率马上用 x+1、x+2。
于是 Cache 把数据按「块」搬进金字塔上层,赌你会反复用。命中率 99% 和 98% 的差距,在性能上可能是 2 倍——这就是为什么「数组按行遍历比按列遍历快」这种常识存在。
必懂机制三件套:
- 直接映射:内存块按地址低位「对号入座」进 Cache 槽位,找起来最快,但两个热点数据可能互相踢;
- 组相联:每个组放 N 个候选,缓解冲突;配合 LRU 替换;
- 写策略:写命中时 write-through(立刻写穿)或 write-back(攒着再写)。
虚拟内存是金字塔的另一半:每个进程以为自己独占整个内存地址空间,页表(RISC-V 里的 satp 寄存器 + 多级页表)负责把虚拟地址翻译成物理地址,TLB 缓存翻译结果。它同时解决了三件事:内存不够(换页到磁盘)、进程隔离(权限位)、程序重定位。
本章的隐喻堪称全书写得最好的一段:「图书馆里写论文」——书桌是 Cache,书架是主存,地下室图书馆是磁盘,你永远不会为了查一个词跑一趟地下室,你会把整本书借到桌上。
第 6 章:并行——从多核到数据中心
单核时钟撞上功耗墙(频率上不去),行业集体转向并行。本章把并行分成几个层次:
- 数据级并行(SIMD):一条指令算 8 个数,向量扩展、GPU 的祖传技艺;
- 硬件多线程:一个核里塞多套寄存器,A 线程等内存时切到 B 线程,流水线不空转;
- 多核共享内存:几颗核共用主存,代价是缓存一致性问题——每个核都有自己的 Cache,谁说了算?MESI 协议登场;
- 消息传递集群:数据中心路线,几万台机器通过网络拼成一台「计算机」,Warehouse-scale Computer(仓储级计算机)这个词就出自本书作者。
本章的金句:写并行程序难,不是因为 API 复杂,而是因为人类大脑天生线性。 数据竞争、死锁、伪共享,每一个都是反直觉的坑。
全书彩蛋:Green Card
书末附赠的 RISC-V 绿卡(Green Card)是全书浓缩:一页纸列全常用指令的格式、字段、操作和伪指令对照。印刷版学生人手一张,考试直接带进考场。电子版在书末第 1656 页起——建议打印贴在显示器旁边,比背手册实用得多。
怎么读这本书:给三种人的路线
嵌入式工程师:重点第 1、2、4 章 + Green Card,第 5 章看 Cache 基础。目标:看懂反汇编、理解中断现场、写出 Cache 友好的代码。
备考/考研党:全书顺序通读,重点做第 2、4、5 章习题——流水线转发和 Cache 映射是出题重灾区。
转体系结构的程序员:第 1 章快速过,第 2 章对照上篇《RISC-V 从入门到实战》的 QEMU 实验动手验证,第 4、5 章精读。有余力接着读同作者的进阶版《计算机体系结构:量化研究方法》。
写在最后
这本书最厉害的不是知识点密度,而是反复敲打的思维方式:
性能问题永远是「测量 → 找瓶颈 → 针对性优化」的循环。 凭直觉优化的人,通常优化错地方。
八大思想里,「抽象」和「加速大概率事件」两个尤其值得内化——前者让你敢面对复杂系统,后者让你在 90% 的场景下做对选择。
图灵奖得主的功力就在这里:他们不是在教你芯片,而是在教你如何在物理约束下做工程设计。这堂课的价值,远超任何一个具体的处理器。
配套阅读:本站《RISC-V 从入门到实战》提供书中的 QEMU/裸机实验环境搭建;本文图片部分取自原书插页,仅作学习讲解用途。