这个项目记录了我对《深入理解计算机系统》第三版官网配套实验的解答,部分实验附有解答文档。
-
Data Lab:已完善实验笔记
实现简单的逻辑函数、二进制补码和浮点函数,但必须使用 C 语言的一个高度受限的子集。例如,可能会要求仅用位级运算和直线代码(straightline code)来计算一个数的绝对值。该实验帮助学生理解 C 语言数据类型的位级表示和数据操作的位级行为。 -
Bomb Lab:已完善实验笔记
“二进制炸弹”是一个程序,以目标代码文件的形式提供给学生。运行时,它会提示用户键入 6 个不同的字符串。如果其中任何一个错误,炸弹就会“爆炸”,打印错误消息并将事件记录在打分服务器上。学生们必须通过反汇编和逆向程序,“拆除”他们自己独特的炸弹,以确定这 6 个字符串应该是什么。该实验教学生理解汇编语言,并迫使他们学习如何使用调试器(debugger)。它也很有趣。这是 CMU 本科生的一个传奇实验。 -
Attack Lab:已完善实验笔记
给一对唯一的自定义生成的 x86-64 二进制可执行文件,称为目标(targets),它们包含缓冲区溢出错误。一个目标存在代码注入攻击漏洞。另一个存在面向返回的编程(ROP,return-oriented programming)攻击漏洞。要求学生基于代码注入或 ROP,开发漏洞利用,修改目标的行为。该实验教学生堆栈的规则,以及编写有缓冲区溢出漏洞的代码的危险。 -
Cache Lab:已完善实验笔记
编写一个通用缓存模拟器,然后优化一个小矩阵转置内核,从而最小化模拟缓存上的未命中次数。这个实验室使用 Valgrind 工具来生成地址踪迹(address traces)。 -
Shell Lab: 实验笔记待补充...
通过作业控制(job control)实现他们自己的简单的 Unix shell 程序,包括 ctrl-c 和 ctrl-z 击键、fg、bg 和 jobs 命令。可以清楚地了解 Unix 的进程控制、信号和信号处理。 -
Malloc Lab:待补充
实现自己版本的 malloc、free 和 realloc。该实验让学生对数据布局和组织有一个清晰的理解,并要求他们评估空间和时间效率之间的不同权衡。我们最喜欢的实验之一。学生完成它后,将真正理解指针! -
Proxy Lab:实验笔记待补充...
实现一个并发缓存(concurrent caching)的 Web 代理,该代理位于学生的浏览器和其他万维网之间。该实验让学生接触到有趣的网络编程世界,并将课程中的许多概念联系在一起,例如字节序(byte ordering)、缓存、进程控制、信号、信号处理、文件 I/O、并发和同步。