之前考研的时候csapp的书有刷过5,6遍,所以对书本知识还算比较了解。恰逢最近在学c++的时候,顺带刷一下大名鼎鼎的csapp实验。
0. 环境准备最好准备一个纯净的Linux系统这里建议使用docker 构建一个centos或者 ubuntu系统
实验资料的下载
CS:APP3e, Bryant and O'Hallaron
docker上的环境搭建请参考下面的文章
CSAPP:Lab0-搭载环境
拉取centos系统
docker pull centos
建立目录挂载实现文件同步
docker container run -it -v /Users/xxxx/yourFilePath:/csapp --name=csapp_env centos /bin/bash
/Users/xxxx/yourFilePath 请替换成你自己想要进行同步的目录
:/csapp 也请替换成你自己想要命名的目录
这里的csapp目录就是和你本地目录同步的目录
同步完成之后可以发现在docker下的csapp目录和我们的yourFilePath文件实现了同步
出现类似上面的结果则为配置正确
配置编译环境
更新yum源
yum -y update
安装sudo
yum install sudo
安装c/c++编译环境
yum install make automake gcc gcc-c++ kernel-devel
安装gdb
yum install gdb
准备32位嵌入式c库
yum install glibc-devel.i686
阅读readme 完成配置
这里需要先进入刚才映射的文件目录csapp文件然后参考readme文件
完成上面的操作之后我们的配置就算完成了。
接下来我们可以在本机的编译器编写我们的代码。然后在docer中的虚拟容器上编译和运行我们的代码。✅
在编译器中编写
在docker容器中编译和运行
蓝色箭头为编译。红色箭头为运行
注意:每次更改bits.c文件后都要重新编译btest。如果需要检查单个函数的正确性,可以使用-f标志:
text $ ./btest -f bitXor
dlc程序可以检测我们有没有违规,如果运行没有输出则没有问题
text $ ./bits.c
注意每次关闭docker在下一次运行的时候需要先启动我们的centos。
先找到我们命名为csapp_env容器的容器id
然后docker start 容器ID启动我们的容器
输入以下命令进入到这个运行中的容器
docker exec -it 容器id /bin/bash
1. 实验开始 * IMPORTANT. TO AVOID GRADING SURPRISES: * 1. Use the dlc compiler to check that your solutions conform * to the coding rules. * 2. Use the BDD checker to formally verify that your solutions produce * the correct answers. */ 1.1 bitXor a^b= 1.(a|b)&(~a|~b) 2.~(~a&~b)&~(a&b) 3.(a&~b)|(~a&b)可以用这三种方式表示异或操作,具体的推导可以自行Google,参考离散数学我自己推了一下发现其实不难
主要是对德摩根律的应用
\[ \begin{align} A\bigoplus B & = \overline{\overline AB\cup A \overline B} \\ & = \overline{(A \cup \overline B)\cap (\overline A \cup B}) \\ & = ( \overline{(A \cup \overline B)\cap \overline A )\cup ( (A \cup \overline B)\cap B )}\\ & = \overline{(\overline A \overline B) \cup( A B)} \\ & =\overline{(\overline A \overline B)}\cap \overline{( A B)}\\ \end{align} \]