# csapp-lab **Repository Path**: bernard5/csapp-lab ## Basic Information - **Project Name**: csapp-lab - **Description**: 深入理解计算机系统(CSAPP)配套实验 - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2022-12-24 - **Last Updated**: 2025-10-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # csapp-lab 这是我的《深入理解计算机系统》[配套实验](http://csapp.cs.cmu.edu/3e/labs.html)代码。 除了符合题目要求,并通过了全部的测试用例以外,我尽可能采用了优雅的实现和详细的注释。 ## data-lab 这个实验是对基础数字逻辑中的数据存储部分完成[高级语言上的实现](datalab/bits.c)。 在这个实验中,我基于纯位运算实现了基础的位运算本身(异或、逻辑非)、条件判断、浮点数转化等基础运算,同时关注代码效率和优雅简洁的实现。 相较于网上的其他实现,我充分考虑了undefined behavior,使代码在Clang和GCC上都能得到正确的结果。 收获:对计算机补码,二进制操作有深刻的认识,对浮点数存储方式有清晰的了解。 ## bomb-lab 这个实验是通过反汇编一个可执行文件,分析汇编代码来找到六个炸弹的密码。 完成实验需要熟悉基础的汇编知识,掌握GDB的使用以及一些编译的基础知识。 | 关卡 | 考察内容 | | :---: | :----------------------------------------------------------: | | 1 | 字符串常量的存储和传递方式 | | 2 | 数组、循环的汇编实现 | | 3 | switch-case的内存结构和汇编实现 | | 4 | 递归(二分搜索)的汇编实现 | | 5 | 栈破坏检测、循环汇编代码的分析 | | 6 | 结构体、链表在内存中的结构与汇编实现、多重循环汇编代码的分析 | | 隐藏 | 二叉树的内存结构和汇编使用 | 我完成了[详尽的说明文档](bomblab/README.md),包括对反汇编代码的注释、分析过程和解释以及`c-like`代码的转写,所有存在多解的题目都提供了多解。 ## attack-lab 这个实验要求进行五次攻击。攻击方式是Code Injection代码注入和Reeturn-oriented programming(ROP)。 在这个lab中,我提供了[详细的实验过程和思路解释](attacklab/readme.md)。 收获: - 知道当程序没有做缓冲区溢出安全时,黑客是如何攻击程序的。 - 知道编译器和操作系统如何增强程序的健壮性。 - 明白怎么编写更安全的程序。 - 明白x86-64构架下,程序是如何使用栈和参数传递。 - 能够站在更加底层的方面审视代码。 ## arch-lab 在这个实验中,我们得到了一个小的默认Y86-64数组复制函数和一个工作流水线Y86-64处理器设计,该处理器以每元素的周期数(CPE)来评价复制函数的性能。我们需要通过修改功能和处理器设计来最小化CPE。 这个实验分为三个部分:PartA,用y86汇编编写三个简单的程序;PartB,用第四章学的HCL语言增加一个iaddq指令;PartC是用y86写一个ncopy程序,为了提升程序运行速度,通过修改指令集和改善ncopy编码实现。 这使我对硬件和软件之间的交互和计算机的底层优化有了更深入的认识,我提供了[详细的实验过程](archlab/readme.md)。 ## cache-lab 在这个实验中,我们需要编写一个通用的缓存模拟器,然后优化一个小的矩阵转置函数,以最大限度地减少模拟缓存的失败命中次数。本实验使用`Valgrind`工具生成地址跟踪。 在这个实验中,我学习到了LRU策略和调度模拟器的实现,了解了cache的工作原理,可以写出让cache命中率更高的代码,我提供了[实验过程和代码](cachelab/readme.md)。 ## shlab Shell Lab 要求实现一个带有作业控制的 Unix Shell 程序,需要考虑基础的并发,进程控制以及信号和信号处理。 我实现了以下功能: ```bash eval:解析命令行 builtin_cmd:检测是否为内置命令quit、fg、bg、jobs do_bgfg:实现内置命令bg和fg waitfg:等待前台作业执行完成 sigchld_handler:处理SIGCHLD信号,即子进程停止或者终止 sigint_handler:处理SIGINT信号,即来自键盘的中断ctrl-c sigtstp_handler:处理SIGTSTP信号,即来自终端的停止信号 ``` 在这个实验中,我学习到了信号的使用,多进程的处理,管道的使用。 ## malloclab 在这个实验中,我们实现了C语言中的malloc、free和realloc。这个实验让我们清楚地了解数据的布局和组织,并评估空间和时间效率之间的不同权衡。 在这个实验中,我学习到了内存管理的知识,理解内存是如何为进程的分配空间的。 ## proxylab 在这个实验中,我们实现了一个带有并发、缓存特性的Web代理。这个实验将许多概念联系在一起,如字节排序、缓存、进程控制、信号、信号处理、文件I/O、并发和同步。 在这个实验中,我学习到了多线程编程的思想,实践了生产者-消费者模型和读者-写者模型。