外观
CSAPP:从 C 程序走到机器与操作系统
这套资料围绕一个问题展开:你写下的 C 语句,怎样变成处理器执行的指令,怎样访问内存,又怎样与操作系统及其他执行流协作?学习完成后,应该能够用寄存器、地址、缓存、进程和同步关系解释程序行为,而不只依靠源码的表面含义。
课程锚点是 Computer Systems: A Programmer’s Perspective,第 3 版及其公开自学实验。这里的中文讲义、数字例子和 labs/csapp 代码均为原创教学材料;不包含教材全文、教师答案、Bomb/Attack 的第三方二进制,也不声称教学程序已经完成官方实验评分。
学习地图
| 顺序 | 章节 | 学完要能完成的事情 |
|---|---|---|
| 1 | 位表示与 C 的边界 | 区分位模式、解释方式与 C 语言定义;设计整数边界测试 |
| 2 | 机器代码与栈 | 从条件跳转、寻址和函数调用还原控制流;开展 Bomb/Attack 阅读 |
| 3 | 编译、链接与加载 | 定位未定义符号、重复定义和库顺序问题 |
| 4 | 缓存与局部性 | 手算命中与替换,读懂并修改 LRU 模拟器 |
| 5 | 异常控制流与进程 | 解释 fork/exec/wait,处理 SIGCHLD 与丢失唤醒 |
| 6 | 虚拟内存 | 区分页、缓存行与分配块,追踪地址翻译和缺页 |
| 7 | 动态内存分配 | 实现对齐、分裂、合并与堆一致性检查 |
| 8 | 并发与同步 | 用共享状态谓词设计互斥锁和条件变量 |
| 9 | 经典实验手册 | 按里程碑开展 Data/Bomb/Attack/Cache/Shell/Malloc |
| 10 | 调试与验证 | 把错误变成最小可复现输入,并用工具验证假设 |
| 11 | 综合复习 | 将源代码、内存、进程与性能联系起来 |
一条可执行的节奏是:先完成位表示、机器代码、链接;再交替阅读缓存、虚拟内存和分配器;最后完成进程与同步。每章先手算例子,再运行程序,再修改一个机制。进度以能否解释输出为标准,不以看完页数为标准。
开始运行
在线查看配套源码 · 下载 CSAPP 实验代码。下载后解包,下面命令中的目录按实际位置调整。
仓库根目录执行:
sh
make -C labs/csapp test
make -C labs/csapp sanitize需要 C11 编译器、POSIX 接口、Make 和 pthread;macOS 与 Linux 可编译这组原创程序。sanitize 会清理再用 AddressSanitizer 和 UndefinedBehaviorSanitizer 构建。恢复普通版本用 make -C labs/csapp clean,再运行 make -C labs/csapp test。
| 程序 | 观察对象 | 测试判据 |
|---|---|---|
bits | 字节序、位计数、旋转、溢出检查 | 极值与零移位断言 |
cache_sim | 组相联缓存与 LRU | 手工 trace 的精确 hit/miss/eviction |
allocator | 固定 arena 的隐式空闲链表 | 分裂、双向合并、4000 步碎片序列与载荷检查 |
process_demo | SIGCHLD 屏蔽及回收 | 子进程退出值 42,父进程正确回收 |
tiny_shell | 前台 fork/exec/wait | 外部命令、内建 cd、退出 |
sync_demo | 单槽生产者消费者 | 10000 个有序数据,和为 50005000 |
tiny_shell 不实现后台作业、管道、引号和完整终端作业控制。allocator 不替代系统 malloc。它们把关键机制保留在可读的程序里;扩展到官方实验所需的工作见实验手册。
平台边界与验证记录
2026-10-04,在本仓库的 macOS arm64、Apple clang 21.0.0 上,六个程序的普通构建与 ASan/UBSan 构建均通过 verify.sh。这只验证列出的教学程序和测试输入。官方 Linux x86-64 Bomb、Attack、Cache Lab handout 未在此环境运行,不能将这份记录理解为官方评分通过。
机器代码章节采用 Linux x86-64 System V ABI。Apple Silicon 默认生成 AArch64 指令,macOS 默认采用 Mach-O 文件格式;同一段 C 的逻辑仍可研究,但不能拿其寄存器名、反汇编或工具输出直接对应教材中的 ELF/x86-64 示例。正式开展原版实验时,准备独立 Linux x86-64 环境,并记录实际工具链。
版本与来源
官方入口:CS:APP3e 学生资源、自学实验目录。检索日期为 2026-10-04。目录标注版本:Data 2019-12-16、Bomb 2016-01-12、Attack 2016-01-11、Cache 2016-05-02、Shell 2003-07-28、Malloc 2014-09-02。它们不是“2025 年统一实验包”;不要把不同学校修改版的接口混在一起。
下载第三方 handout 后,先记录下载 URL、日期、SHA-256 和 README。该站没有为这些压缩包提供统一 Git 提交号,本仓库不虚构版本提交。章末的来源用于核对官方任务和接口;具体解释与实现是本站组织的学习路径。