CSAPP:Lab1 -DataLab 超详解

之前考研的时候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:Lab1 -DataLab 超详解

这里的csapp目录就是和你本地目录同步的目录

同步完成之后可以发现在docker下的csapp目录和我们的yourFilePath文件实现了同步

CSAPP:Lab1 -DataLab 超详解


CSAPP:Lab1 -DataLab 超详解


出现类似上面的结果则为配置正确

配置编译环境

更新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文件

shell To compile and run the btest program, type: unix> make btest unix> ./btest [optional cmd line args]

完成上面的操作之后我们的配置就算完成了。

接下来我们可以在本机的编译器编写我们的代码。然后在docer中的虚拟容器上编译和运行我们的代码。✅

在编译器中编写

CSAPP:Lab1 -DataLab 超详解

在docker容器中编译和运行

CSAPP:Lab1 -DataLab 超详解

蓝色箭头为编译。红色箭头为运行

注意:每次更改bits.c文件后都要重新编译btest。如果需要检查单个函数的正确性,可以使用-f标志:

text $ ./btest -f bitXor

dlc程序可以检测我们有没有违规,如果运行没有输出则没有问题

text $ ./bits.c

注意每次关闭docker在下一次运行的时候需要先启动我们的centos。

先找到我们命名为csapp_env容器的容器id

CSAPP:Lab1 -DataLab 超详解

然后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} \]

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxdpp.html