计算机组成原理
这门课的讲法我调整过几次,最后定下来的是一句话:从程序员视角看硬件。每个硬件概念都落回同一个问题,你写的 C 代码、你遇到的程序行为,在硬件上是怎么发生的。为什么 0.1 + 0.2 不等于 0.3(第 2 章),为什么按行遍历二维数组比按列快好几倍(第 7 章),为什么同一个循环处理有序数组能快数倍(第 6 章)。这些问题在语言层查不到答案,得往下走一层。
十讲按「数字怎么表示 → 指令怎么长 → CPU 怎么执行 → 数据放哪 → 程序怎么跑起来」推进:
- 第 1 章 · 计算机系统概述:从一份真实的 lscpu 输出开始,讲冯·诺依曼结构、ISA 这份「软硬件合同」,以及性能三因子与 Amdahl 定律。
- 第 2 章 · 数据的表示与运算:补码为什么赢,IEEE 754 为什么让 0.1 + 0.2 输出 0.30000000000000004。全课第一个值得慢读的章节。
- 第 3 章 · 运算器与 ALU:CPU 的全部算术都从一位全加器长出来;顺带解开「除以 10 为什么没编译成除法」。
- 第 4 章 · 指令系统:ISA 合同的具体条款:指令格式、寻址方式,以及 CISC/RISC 分歧还剩多少。
- 第 5 章 · CPU 结构与数据通路:把合同翻译成电路:寄存器、数据通路、硬布线与微程序。
- 第 6 章 · 指令流水线:全课第二个值得慢读的章节。三类冒险、转发、分支预测,以及那个著名的「排序后快数倍」实验。
- 第 7 章 · 存储层次与 Cache:拿本机缓存参数亲手算一次地址映射,回头解释二维数组那个问题。
- 第 8 章 · 主存与虚拟存储器:DRAM 为什么要刷新,页表、TLB、缺页,以及段错误的来龙去脉。
- 第 9 章 · 输入输出系统:轮询、中断、DMA 三种活法,从敲一下键盘讲到屏幕出字。
- 第 10 章 · 汇编与程序运行:汇编、调用约定、栈帧,例子全部来自本机真实的 gcc 输出,把前九章收拢成一次完整的执行。
先修:会写基本的 C(指针与栈帧在 C 指针课程里展开,本课第 10 章会接上)。缺页与页置换想看 OS 侧的分工,读操作系统的内存管理章节。教材配合:CS:APP 第 1~5 章,《编码:隐匿在计算机软硬件背后的语言》。