CMU 15-213 CSAPP 深入理解计算机系统 · 开篇与课程概览
课程来源:卡内基梅隆大学(Carnegie Mellon University)计算机科学学院 课程编号:15-213 / 15-513 / 14-513 / 18-213 Introduction to Computer Systems(ICS) 课程主页:https://www.cs.cmu.edu/~213/(Fall 2026 学期) 教材官网:https://csapp.cs.cmu.edu/(含 11 个官方 lab 的完整讲义与自学 handout) 教材:Randal E. Bryant, David R. O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition, Pearson, 2016 (中文版《深入理解计算机系统》第 3 版,机械工业出版社) 辅助教材:Brian W. Kernighan, Dennis M. Ritchie, The C Programming Language, 2nd Ed. 笔记语言:中文(技术术语保留英文原文) 笔记定位:以 “程序在机器上的真实行为” 为主线,逐讲精讲 24 讲官方内容 + 期末复习,并给出 11 个官方 lab 的清单、难度评估与最优执行顺序。 素材来源:CMU 15-213 Fall 2025 完整 24 讲幻灯片、Fall 2026 已发布讲义、 Recitation 与 Bootcamp 讲义、教材官网 11 个 lab 的 writeup 与自学 handout。 所有资料来源均已在本文档中透明记录(见 五、资料来源与获取记录)。
写在前面:为什么要学 CSAPP
有一个问题,几乎所有写了几年代码的人都答不完整:
当你敲下
./a.out并按下回车,从这一瞬间到屏幕上出现第一行输出,计算机到底做了什么?
你的 C 代码被编译器变成了什么?变量真的”存在”吗,它住在哪里?malloc 给你的那块内存, 物理上在芯片的哪个位置?为什么把矩阵遍历的循环内外层对调一下,程序就快了三倍? 为什么栈上多写几个字节,整个程序的控制流就被别人接管了?
CSAPP 这门课(CMU 的 15-213,俗称”镇系神课”)就是来回答这些问题的。它不教你怎么写代码, 它教你你的代码在真实硬件上到底发生了什么。学完之后你会获得三种能力:
| 能力 | 具体表现 | 对应本笔记 |
|---|---|---|
| 写出更快的代码 | 知道缓存怎么工作,就知道怎么让数据”顺手”;知道 CPE 怎么算,就知道瓶颈在哪 | Lecture 9–10、15 |
| 写出更可靠的代码 | 知道补码怎么溢出、栈帧怎么布局,就知道哪里会崩、会被攻击 | Lecture 2、5–6、8 |
| 看懂底层的一切 | 能读汇编、能读 ELF、能读页表、能读 /proc、能读懂系统调用 | Lecture 3–7、11–12 |
而这门课最值钱的部分,是它配了一整套魔鬼实验(lab):从只准用 ! ~ & ^ \| + << >> 实现位运算,到用 gdb 拆炸弹,到构造缓冲区溢出攻击和 ROP 链,到写出能在 90% 命中率下 跑赢基准的矩阵转置,到从零实现一个 malloc,到写一个带作业控制的 shell,再到写一个 支持并发的缓存代理。每一个 lab 都是一次真正的”系统级”工程训练。
一、课程概览(Course Overview)
1.1 官方课程定位
课程主页对 ICS 的定位原文是:
“The ICS course provides a programmer’s view of how computer systems execute programs, store information, and communicate. It enables students to become more effective programmers, especially in dealing with issues of performance, portability and robustness. It also serves as a foundation for courses on compilers, networks, operating systems, and computer architecture, where a deeper understanding of systems-level issues is required.”
拆解成三条主线:
- 程序员视角(programmer’s view)——不是从电路出发,而是从”我写的这段 C 代码会怎样”出发。
- 三个关切(three concerns)——性能(performance)、可移植性(portability)、 健壮性(robustness)。这三者就是全课程的技术价值锚点:
- 性能 → 缓存、代码优化、并行(Lecture 9–10、15、21–24)
- 可移植性 → 数据表示、字节序、对齐、链接、ISA(Lecture 2、6–7)
- 健壮性 → 缓冲区溢出、信号、并发竞态(Lecture 5–6、17、21–23)
- 后续课程的地基——编译器、网络、操作系统、体系结构课都以它为先修。
课程官方覆盖的主题列表(Topics covered):
machine-level code and its generation by optimizing compilers, performance evaluation and optimization, computer arithmetic, memory organization and management, networking technology and protocols, and supporting concurrent computation.
对应到教材章节,就是 CS:APP3e 的第 1–12 章(跳过第 4 章处理器体系结构大部分内容, 第 8 章之前插入链接与调试,第 11 章网络与文件系统合并讲授)。
1.2 先修要求与授课规模
- 先修课:15-122 Principles of Imperative Computation(CMU 的 C 语言与算法入门课)。 对自学者而言,等价要求是:熟练 C 语言(指针、结构体、动态内存)+ 基本数据结构与算法。
- 12 学分,每周两次 80 分钟讲座 + 一次 50 分钟 recitation + 不定期 bootcamp。
- Fall 2026 由 Phillip Gibbons、Seth Goldstein、Taha Khan 三位老师分别讲授 15-213/15-513/14-513 三个平行班(内容一致,班型不同)。
1.3 考核结构(Fall 2026 官方)
| 项目 | 占比 | 说明 |
|---|---|---|
| 9 个 lab(L0–L8) | 50% | 全部通过 Autolab 提交,权重不等(见实验清单) |
| 书面作业(Written Assignments) | 6% | 结合 peer review |
| 随堂纸笔小测(in-class paper quizzes) | 4% | 全学期 10 次,去掉最低 2 次 |
| 期中考试(Midterm) | 15% | 闭卷,第 8 周左右课堂内进行 |
| 期末考试(Final) | 25% | 闭卷,考试周 |
注意 lab 占了一半的分。 这门课的重心在动手,不在背书。
1.4 迟交政策(Fall 2026)
- 所有 lab 截止于当天 23:59 ET。
- 最多迟交 3 天,L0 与 L8 最多迟交 1 天。
- 全学期每人 5 个 grace day(宽限日),自动应用于迟交作业; 每个 lab 可用的 grace day 数量有上限(见实验清单表)。
- 超出上限或 grace day 用完后,每天扣 15%。
二、讲次总表(以 CMU 15-213 Fall 2025 完整学期为准)
为什么用 Fall 2025 的日程做基准? 因为它是目前唯一完整发布了全部 24 讲幻灯片 的学期(Fall 2026 正在进行中,只发布到第 9 讲)。两学期的讲次顺序、主题、教材对应 完全一致,Fall 2025 因此是自学的最佳基准。下表日期为 Fall 2025 实际授课日。
2.1 讲座序列(24 讲)
| 讲次 | 日期 | 主题(官方原题) | 本笔记章 | 教材 | 关联 Lab |
|---|---|---|---|---|---|
| L01 | Aug 26 | Overview | 第 1 章 | Ch.1 | — |
| L02 | Aug 28 | Bits, Bytes, & Integers | 第 2 章 | 2.1–2.4 | L1 发放 |
| L03 | Sep 02 | Machine Programming (Part I) | 第 3 章 | 3.1–3.6 | L0 截止 |
| L04 | Sep 04 | Machine Programming (Part II) | 第 4 章 | 3.6–3.7 | L2 发放 |
| L05 | Sep 09 | Machine Programming (Part III) | 第 5 章 | 3.7–3.9 | L1 截止 |
| L06 | Sep 11 | Machine Programming (Part IV) | 第 6 章 | 3.8–3.11 | — |
| L07 | Sep 16 | Linking | 第 7 章 | Ch.7 | L2 截止,L3 发放 |
| L08 | Sep 18 | Design and Debugging | 第 8 章 | 3/9 延伸 | — |
| L09 | Sep 23 | The Memory Hierarchy | 第 9 章 | 6.1–6.3 | — |
| L10 | Sep 25 | Cache Memories | 第 10 章 | 6.4–6.7 | L3 截止,L4 发放 |
| L11 | Sep 30 | Virtual Memory: Concepts | 第 11 章 | 9.1–9.6 | — |
| L12 | Oct 02 | Virtual Memory: Details | 第 12 章 | 9.7–9.8 | — |
| L13 | Oct 07 | Dynamic Memory Allocation: Basic | 第 13 章 | 9.9 | — |
| L14 | Oct 09 | Dynamic Memory Allocation: Advanced | 第 14 章 | 9.10–9.12 | L4 截止,L5 发放 |
| — | Oct 14/16 | 秋假(fall break) | — | — | — |
| — | Oct 21 | 期中考试(In-class Midterm) | — | Ch.1–9 | — |
| L15 | Oct 23 | Code Optimization | 第 15 章 | Ch.5 | — |
| L16 | Oct 28 | Processes and Multitasking | 第 16 章 | 8.1–8.4 | L5a 截止 |
| L17 | Oct 30 | Exceptional Control Flow | 第 17 章 | 8.5–8.8 | — |
| L18 | Nov 06 | System Level I/O and File Systems | 第 18 章 | Ch.10 | L5b 截止,L6 发放 |
| L19 | Nov 11 | File Systems / Network Programming (Part I) | 第 19 章 | 11.1–11.4 | — |
| L20 | Nov 13 | Network Programming (Part II) | 第 20 章 | 11.4–11.6 | L6 截止,L7 发放 |
| L21 | Nov 18 | Concurrent Programming | 第 21 章 | 12.1–12.3 | — |
| L22 | Nov 20 | Synchronization: Basic | 第 22 章 | 12.4, 12.5.1–3 | — |
| L23 | Nov 25 | Synchronization: Advanced | 第 23 章 | 12.5.4–5, 12.7–8 | L7 截止,L8 发放 |
| L24 | Dec 02 | Thread-Level Parallelism | 第 24 章 | 12.6 | — |
| — | Dec 04 | Frontiers of Computing(无讲义) | — | — | L8 截止 |
| 复习 | Dec 05/07 | Exam Review | 第 25 章 | 全书 | — |
2.2 配套环节(Recitation 与 Bootcamp)
讲义全部公开,是自学时极易被忽略但价值极高的材料:
| 环节 | 内容 | 素材文件 |
|---|---|---|
| Recitation 1 | Introduction, Datalab | F25-rec01_slides.txt / rec01_handout.txt |
| Recitation 2–3 | Bomb Lab(两讲) | F25-rec02_slides.txt / F25-rec03_slides.txt |
| Recitation 4 | Attack Lab and Stacks | F25-rec04_slides.txt / rec04_handout.txt |
| Recitation 5 | Caches and C Review | F25-rec05_slides.txt |
| Recitation 6 | Caches & Blocking | F25-rec06_slides.txt |
| Recitation 7–8 | Malloclab(Part I/II) | F25-rec07_slides.txt / F25-rec08_slides.txt |
| Recitation 9 | Processes and Shells | F25-rec09_slides.txt |
| Recitation 10 | Tshlab | F25-rec10_slides.txt |
| Recitation 11 | Networking and Proxies | F25-rec11_slides.txt |
| Recitation 12 | Synchronization | F25-rec12_slides.txt |
| Recitation 13 | Exam Review | F25-rec13_slides.txt |
| Bootcamp 1 | Linux, Command Line, Git | lab1_slides.txt / lab1_handout.txt |
| Bootcamp 2 | Debugging & GDB | lab2_slides.txt / lab2_handout.txt |
| Bootcamp 3 | GCC & Build Automation | lab3_slides.txt / lab3_handout.txt |
| Bootcamp 4 | C Programming | F25-cprogramming-bootcamp.txt |
| Bootcamp 5 | Post-checkpoint Malloc | F25-malloc-bootcamp.txt |
| Bootcamp 6 | Exam Review | F25-final.txt |
| 活动讲义 | GDB 与汇编 / 链接 / 机器级编程(含答案版) | F25-gdb-and-assembly*.txt、machine-*-soln.txt |
Bootcamp 1–3 是零基础的救命稻草。 如果你没在 Linux 命令行下写过程序、 没用过 gdb、不清楚
gcc的各个开关,先做这三个 bootcamp 再开始 Lecture 3。
三、11 个官方 Lab 的清单与执行顺序
教材官网 https://csapp.cs.cmu.edu/3e/labs.html 提供了 11 套完整的 turnkey lab, 每一套都带 writeup(讲义)、README(文件清单与提交要求)和自学用 handout 压缩包 (不含答案,可自由下载)。这是 CSAPP 最珍贵的部分——世界上几乎所有讲系统课的学校 都在用或改编这些 lab。
3.1 十一个 lab 总览
| # | Lab | 官方核心任务 | 主要考察 | 难度 | 建议耗时 | 前置知识 |
|---|---|---|---|---|---|---|
| 1 | Data Lab | 只用 ! ~ & ^ \| + << >> 实现位运算与浮点函数 | 位级表示、补码、IEEE 754、UB | ★★☆☆☆ | 8–15 h | Lecture 2 |
| 2 | Bomb Lab | 反汇编并”拆”掉 6 个关卡的二进制炸弹 | 汇编阅读、控制流、gdb | ★★★☆☆ | 10–20 h | Lecture 3–5、8 |
| 3 | Attack Lab | 对两个有缓冲区溢出漏洞的 target 构造 5 次攻击 | 栈帧、代码注入、ROP | ★★★★☆ | 12–25 h | Lecture 5–6、8 |
| 4 | Buffer Lab(IA32 遗留版) | 32 位版缓冲区溢出攻击(已被 Attack Lab 取代) | 栈帧、IA32 调用约定 | ★★★☆☆ | 8–15 h | Lecture 5–6 |
| 5 | Arch Lab | 写 Y86-64 汇编、扩充 SEQ 处理器、优化流水线 | 指令集、数据通路、流水线 | ★★★★☆ | 15–30 h | Lecture 3–4 + 教材 Ch.4 |
| 6 | Cache Lab | Part A 写缓存模拟器;Part B 优化矩阵转置 | 缓存组织、LRU、分块、局部性 | ★★★★☆ | 15–30 h | Lecture 9–10、15 |
| 7 | Performance Lab | 优化卷积/矩阵转置内核的 CPE | 代码优化、循环变换、CPE 测量 | ★★★☆☆ | 8–15 h | Lecture 9–10、15 |
| 8 | Shell Lab | 实现带作业控制的 Unix shell(tsh) | 进程、信号、系统调用、竞态 | ★★★★☆ | 15–25 h | Lecture 16–18 |
| 9 | Malloc Lab | 从零实现 malloc / free / realloc | 堆布局、分配器设计、空间/时间权衡 | ★★★★★ | 20–40 h | Lecture 11–14 |
| 10 | Proxy Lab | 实现并发缓存 Web 代理 | socket、并发、同步、HTTP、缓存 | ★★★★☆ | 15–30 h | Lecture 18–23 |
| 11 | SFS Lab | 实现并发文件系统(CMU 自加,教材官网无) | 文件系统、并发、锁 | ★★★★☆ | 15–25 h | Lecture 18–19、21–23 |
关于 SFS Lab:这是 CMU 15-213 在 Fall 2025 / Fall 2026 新增的第 9 个 lab(对应 课程编号 L8,4%)。它不在教材官网的 11 个 lab 列表中(教材官网列表到 Proxy Lab 为止), 属于 CMU 自研的并发文件系统 lab。本文档把它列在最后,并明确标注这一点。
两个”取代关系”:Buffer Lab(32 位)已被 Attack Lab(64 位)取代; Arch Lab 另有 Legacy Y86(32 位)版本。自学时优先做 64 位版本。
3.2 推荐执行顺序(★ 本章最重要的部分)
ordering 的三个原则: ① 先补齐工具链能力 → ② 再按课程时间线推进 → ③ 把最难的 Malloc 留足时间。
阶段 0:环境与工具(不做 lab,但是所有 lab 的前提)
├─ Bootcamp 1: Linux / 命令行 / Git
├─ Bootcamp 2: Debugging & GDB
└─ Bootcamp 3: GCC & Build Automation
│
▼
阶段 1:数据与机器码(Lecture 2–8 期间)
① L0 C Programming (热身,确认 C 与 Linux 工具链没问题)
② Data Lab ★★☆☆☆ (位运算 + 补码 + 浮点,检验 Lecture 2)
③ Bomb Lab ★★★☆☆ (gdb + 汇编,检验 Lecture 3–5;全课程最"好玩")
④ Attack Lab ★★★★☆ (栈帧 + 代码注入 + ROP,检验 Lecture 5–6)
并行可选:Buffer Lab(32 位遗留,只想练栈溢出可跳过)
│
▼
阶段 2:存储与性能(Lecture 9–15 期间,期中考试前后)
⑤ Cache Lab ★★★★☆ (模拟器 + 矩阵转置优化,知识密度最高)
并行可选:Performance Lab(与 Cache Lab Part B 高度重叠,可二选一)
⑥ Arch Lab ★★★★☆ (Y86-64 + 流水线,需要额外读教材 Ch.4,可与 Cache Lab 换序)
│
▼
阶段 3:内存管理(Lecture 11–14 之后,最需要时间的一段)
⑦ Malloc Lab ★★★★★ (全课程最难,务必留 3 周以上;先做 checkpoint)
│
▼
阶段 4:并发与系统(Lecture 16–24 期间)
⑧ Shell Lab ★★★★☆ (进程 + 信号 + 作业控制)
⑨ Proxy Lab ★★★★☆ (socket + 线程 + 缓存 + 同步,综合度最高)
⑩ SFS Lab ★★★★☆ (并发文件系统,CMU 自加)
3.3 十条执行建议(踩过坑的人才知道)
- 先做 L0 热身。 它只有 2% 权重,但会帮你确认 gcc、make、gdb、Autolab 提交链路都通。
- Data Lab 不要抄答案。 网上答案唾手可得,但 Data Lab 的真正价值是逼你理解 补码与 IEEE 754 的位级结构;抄了它,Lecture 2 就白学了。
- Bomb Lab 是”gdb 训练营”。 用
objdump -d找到phase_1…phase_6, 对每个phase_N下断点,用x/s、x/d、info registers逐个推。 不要用strings直接找答案——那会让你什么都学不到。 - Attack Lab 先画栈帧再动手。 把
getbuf的栈帧、buf起始地址、 返回地址相对偏移量画清楚,剩下的就是填字节。ROP 部分(Phase 4/5)必须 先在.rodata里用objdump -d找 gadget。 - Cache Lab Part A 建议用时间戳数组实现 LRU,别用链表——trace 规模大时链表会慢。 Part B 的 32×32 用 8 个 8×8 分块 + 局部变量暂存;64×64 必须用 4×4 子块 +
B数组分 8 块的特殊分块法才能拿到满分。 - Malloc Lab 分两阶段做(对应课程的 L5a checkpoint / L5b final): 先做隐式空闲链表 + 立即合并保证正确性,再升级成分离空闲链表 + 显式链表 + 边界标记优化追求利用率。先用
mdriver跑通再优化,否则效率分数无从谈起。 - Shell Lab 的关键是”信号时序”。
waitpid的WNOHANG\|WUNTRACED、sigprocmask屏蔽SIGCHLD避免竞态、setpgid建立进程组——这三件事做对了, 作业控制就成了一半。 - Proxy Lab 先做”能用”,再做”并发”,最后做”缓存”。 顺序是: 迭代式代理 → 多线程(每连接一线程)→ 加读者-写者锁保护缓存 + LRU 淘汰。 把这三步混在一起做,会同时面对三个 bug。
- 每个 lab 第一步永远是读 README。 README 里写清了文件清单、
make目标、 提交要求、以及”哪些文件不能改”。改错文件是零分的常见原因。 - 利用官方 handout 自带的测试工具。 每个 lab 都有自己的 driver:
btest(Data)、mdriver(Malloc)、tracegen/test-csim/test-trans(Cache)、tsh参考实现与sdriver.pl(Shell)、driver.sh(Proxy)。 这些工具在 handout 里都给了,它们比任何第三方答案都可靠。
3.4 官方 lab 权重与截止日期(Fall 2026)
下表取自 Fall 2026 课程 Labs 页面,展示了这门课如何给”动手部分”分配 50% 的分数—— 权重最高的不是最难的 Malloc,而是 Data Lab(7%)、Malloc final(7%)、Shell(7%)三个, 它们恰好对应”位级理解”“内存管理”“并发控制”三大核心能力。
| 代号 | 名称 | 权重 | Grace Days | 发放 | 截止 | 代码评审登记 |
|---|---|---|---|---|---|---|
| L0 | C Programming | 2% | 1 | Tue Aug 25 | Tue Sep 01 | — |
| L1 | Data | 7% | 1 | Thu Aug 27 | Tue Sep 08 | Thu Sep 10 |
| L2 | Bomb | 6% | 1 | Thu Sep 03 | Tue Sep 15 | — |
| L3 | Attack | 4% | 1 | Tue Sep 15 | Thu Sep 24 | — |
| L4 | Cache | 5% | 2 | Thu Sep 24 | Thu Oct 08 | Sat Oct 10 |
| L5a | Malloc (checkpoint) | 4% | 2 | Thu Oct 08 | Tue Oct 27 | Thu Oct 29 |
| L5b | Malloc (final) | 7% | 2 | (同 L5a) | Tue Nov 03 | Thu Nov 05 |
| L6 | Shell | 7% | 2 | Tue Nov 03 | Thu Nov 12 | Sat Nov 14 |
| L7 | Proxy | 4% | 2 | Thu Nov 12 | Tue Nov 24 | Sun Nov 29 |
| L8 | SFS | 4% | 1 | Thu Nov 19 | Thu Dec 03 | — |
| 合计 | 50% |
代码评审(Code Review) 是 CMU 这门课的一大特色,自学时可以自己模拟:
- 风格评审(L4、L5a、L5b、L6、L7):与助教面谈代码风格,依据课程的 Style Guidelines。
- “帕森斯拼图”测试(L1、L4、L5b、L6、L7):10 分钟小测, 把打乱的代码片段拼回正确顺序并解释——考的是”你真的理解这段代码为什么这么写”。
自学建议:即使没人给你打分,也请对自己执行这两步。 把代码读一遍,问自己”这一行为什么必须在这儿”;把关键函数打乱重排,看能不能复原。 这比再多刷一道题有用。
3.5 如何获取这些 lab 的 handout
教材官网的 lab 页面对自学者免费开放 handout(只有解答(solution)需要教师账号):
| 获取方式 | 地址 |
|---|---|
| lab 列表与说明 | https://csapp.cs.cmu.edu/3e/labs.html |
| Data Lab 自学包 | https://csapp.cs.cmu.edu/3e/datalab-handout.tar |
| Bomb Lab 练习炸弹(已禁用评分服务器) | https://csapp.cs.cmu.edu/3e/bomb.tar |
Attack Lab 自学 targets(需用 -q 选项运行) | https://csapp.cs.cmu.edu/3e/target1.tar |
| Cache / Malloc / Shell / Proxy / Arch / Perf Lab 自学包 | 同一页面的 “Self-Study Handout” 链接 |
关于”网上答案”的严肃提醒。 课程主页在 CS 自学指南中有一句原话值得抄在这里: “这门课由于过于出名,全世界的码农争相学习,导致其 Project 的答案在网上几乎唾手可得。 但如果你真的想锻炼自己的代码能力,希望你不要借鉴任何第三方代码。” CSAPP 的 lab 之所以经典,是因为做的过程才是学习本身。抄答案等于把最值钱的部分扔了。
四、如何使用这份笔记
4.1 三种读法
| 你的情况 | 建议路径 |
|---|---|
| 零基础,从没碰过系统编程 | 先做 Bootcamp 1–3(本文档第二章 2.2)→ 读第 1–2 章 → 做 L0 + Data Lab → 再往下 |
| 有 C 基础,想系统补齐 | 按第 1–24 章顺序读,每读完一段就去做对应 lab(见第三章 3.2 的流水线) |
| 只想查某个专题 | 直接从讲次总表(2.1)跳到对应章;Lecture 9–10 查缓存、Lecture 11–14 查内存、Lecture 21–23 查并发 |
4.2 本笔记的章节结构
每一讲都严格采用 7 段式结构,便于你”学—练—查”:
- N.1 概述——这一讲要解决什么问题,在知识地图上的位置
- N.2 核心概念与底层机制图解——每个概念都有 ASCII 图(内存布局 / 位域 / 数据通路)
- N.3 代码示例与底层机制分析——完整可编译的代码 + 真实汇编 + 内存布局 + 验证命令
- N.4 实验关联——这一讲对应哪个 lab 的哪一部分,会在哪里踩坑
- N.5 常见错误与调试技巧——每条都给出可执行的具体命令
- N.6 关键要点——必须记住的结论与设计原则
- N.7 思考题(带答案)——含至少一道计算/推演题
4.3 一个学习节奏建议
CS 自学指南给这门课的估算是 150 小时(难度五星),其中:
- 读教材 + 看讲义:约 60 小时(教材 Ch.1–12,讲义 24 讲)
- 做 lab:约 90 小时(按第三章 3.1 的”建议耗时”累加,11 个 lab 合计约 140–280 小时, 自学者可只挑 6–7 个核心 lab,约 90–150 小时)
不要试图一周速通。 这门课的知识是”层层叠上去”的:不懂补码就读不懂汇编, 不懂栈帧就做不了 Attack Lab,不懂缓存就做不了 Malloc Lab 的性能优化。 每一层都要真的踩实。
五、资料来源与获取记录
本文档的技术内容全部来自公开可访问的官方材料,具体获取情况透明记录如下。
5.1 已获取的官方材料
| 类别 | 内容 | 数量/说明 |
|---|---|---|
| 课程主页 | https://www.cs.cmu.edu/~213/ 首页、Schedule、Labs、Assignments、Exams、Resources、Syllabus | Fall 2026 完整 |
| 讲座幻灯片 | Fall 2025 全部 24 讲 PDF(01-overview … 24-parallelism) | 完整,主素材 |
| 讲座幻灯片 | Fall 2026 已发布的 9 讲 PDF(至 09-memory-hierarchy) | 部分,用于对照 |
| Recitation 讲义 | 13 次 recitation 的 slides(含 handout 与答案版) | 完整 |
| Bootcamp 讲义 | Linux/Git、GDB、GCC、C 编程、Malloc、期末复习共 6 个 | 完整 |
| 课堂活动 | 机器级编程三套活动 + 链接活动 + GDB&汇编活动(含答案版) | 完整 |
| 教材官网 | https://csapp.cs.cmu.edu/3e/labs.html 11 个 lab 的 writeup(PDF)+ README + 自学 handout(tar) | 完整 |
| 教材官网 | 教师专区(Instructor Site)、lab 解答(solution) | 需要 CS:APP 教师账号,未获取 |
5.2 获取方式
所有材料通过脚本 csapp_data/fetch.sh 一次性抓取,随后用 csapp_data/pdf2txt.py (PyMuPDF)转换为纯文本,存放于:
csapp_data/
├── fetch.sh 抓取脚本(可重跑,幂等)
├── pdf2txt.py PDF → 文本转换脚本
├── html/ 课程页面 HTML 存档
├── pdf/ 74 份官方 PDF(讲座/recitation/bootcamp/活动/syllabus)
├── txt/ 转换后的纯文本(含每页页码标记),撰写笔记的素材
├── labs/ 11 个 lab 的 writeup PDF + README
└── handouts/ 11 个 lab 的自学 handout(已解包)
5.3 需要说明的边界
- lab 的解答(solution)不可得。 教材官网只对教师账号开放 solution, 本文档因此不提供任何 lab 答案,只提供官方 handout、任务说明与解题方法论。
- Fall 2026 学期尚未结束。 第 10 讲及以后的 Fall 2026 幻灯片还没发布, 本文档对应的讲义素材以 Fall 2025 完整版为准(两学期讲次与主题一致)。
- 教材原文不在本文档中。 CS:APP3e 是受版权保护的出版物,本文档不复制教材原文, 而是基于公开讲义重新组织、推导、举例并补充可运行代码。请自行获取正版教材对照阅读。
- 成绩数据来自官方页面。 2.1 表中的日期与 lab 时间线取自 Fall 2025 官方 schedule, 1.4 节的迟交政策与 1.3 节的考核比例取自 Fall 2026 官方页面。
- 代码都是实际验证过的。 本文档各章出现的 C 代码均在本地
gcc 12.2.0(-g -Wall -std=c11)下实际编译运行,汇编片段由gcc -Og -S/objdump -d真实生成后录入,调试与内存检查输出取自真实的gdb/valgrind/ AddressSanitizer 会话。
目录
- 写在前面:为什么要学 CSAPP
- 一、课程概览(Course Overview)
- 二、讲次总表
- 三、11 个官方 Lab 的清单与执行顺序
- 四、如何使用这份笔记
- 五、资料来源与获取记录
- 第二部分 · 分讲学习笔记
- Lecture 1 … Lecture 25(共 25 章,见讲次总表 2.1)
- 附录 A · CSAPP 核心概念与命令速查表