深入理解计算机系统(CSAPP)
  • 本电子书信息
  • 出版信息
    • 出版者的话
    • 中文版序一
    • 中文版序二
    • 译者序
    • 前言
    • 关于作者
  • 第 1 章:计算机系统漫游
    • 1.1 信息就是位 + 上下文
    • 1.2 程序被其他程序翻译成不同的格式
    • 1.3 了解编译系统如何工作是大有益处的
    • 1.4 处理器读并解释储存在内存中的指令
    • 1.5 高速缓存至关重要
    • 1.6 存储设备形成层次结构
    • 1.7 操作系统管理硬件
    • 1.8 系统之间利用网络通信
    • 1.9 重要主题
    • 1.10 小结
  • 第一部分:程序结构和执行
    • 第 2 章:信息的表示和处理
      • 2.1 信息存储
      • 2.2 整数表示
      • 2.3 整数运算
      • 2.4 浮点数
      • 2.5 小结
      • 家庭作业
    • 第 3 章:程序的机器级表示
      • 3.1 历史观点
      • 3.2 程序编码
      • 3.3 数据格式
      • 3.4 访问信息
    • 第 4 章:处理器体系结构
    • 第 5 章:优化程序性能
    • 第 6 章:存储器层次结构
  • 第二部分:在系统上运行程序
    • 第 7 章:链接
      • 7.1 编译器驱动程序
      • 7.2 静态链接
      • 7.3 目标文件
      • 7.4 可重定位目标文件
      • 7.5 符号和符号表
      • 7.6 符号解析
      • 7.7 重定位
      • 7.8 可执行目标文件
      • 7.9 加载可执行目标文件
      • 7.10 动态链接共享库
      • 7.11 从应用程序中加载和链接共享库
      • 7.12 位置无关代码
      • 7.13 库打桩机制
      • 7.14 处理目标文件的工具
      • 7.15 小结
      • 家庭作业
    • 第 8 章:异常控制流
      • 8.1 异常
      • 8.2 进程
      • 8.3 系统调用错误处理
      • 8.4 进程控制
      • 8.5 信号
      • 8.6 非本地跳转
      • 8.7 操作进程的工具
      • 8.8 小结
      • 家庭作业
    • 第 9 章:虚拟内存
      • 9.1 物理和虚拟寻址
      • 9.2 地址空间
      • 9.3 虚拟内存作为缓存的工具
      • 9.4 虚拟内存作为内存管理的工具
      • 9.5 虚拟内存作为内存保护的工具
      • 9.6 地址翻译
      • 9.7 案例研究:Intel Core i7 / Linux 内存系统
      • 9.8 内存映射
      • 9.9 动态内存分配
      • 9.10 垃圾收集
      • 9.11 C 程序中常见的与内存有关的错误
      • 9.12 小结
      • 家庭作业
  • 第三部分:程序间的交互和通信
    • 第 10 章:系统级 I/O
      • 10.1 Unix I/O
      • 10.2 文件
      • 10.3 打开和关闭文件
      • 10.4 读和写文件
      • 10.5 用 RIO 包健壮地读写
      • 10.6 读取文件元数据
      • 10.7 读取目录内容
      • 10.8 共享文件
      • 10.9 I/O 重定向
      • 10.10 标准 I/O
      • 10.11 综合:我该使用哪些 I/O 函数?
      • 10.12 小结
      • 家庭作业
    • 第 11 章:网络编程
      • 11.1 客户端—服务器编程模型
      • 11.2 网络
      • 11.3 全球 IP 因特网
      • 11.4 套接字接口
      • 11.5 Web 服务器
      • 11.6 综合:TINY Web 服务器
      • 11.7 小结
      • 家庭作业
    • 第 12 章:并发编程
      • 12.1 基于进程的并发编程
      • 12.2 基于 I/O 多路复用的并发编程
      • 12.3 基于线程的并发编程
      • 12.4 多线程程序中的共享变量
      • 12.5 用信号量同步线程
      • 12.6 使用线程提高并行性
      • 12.7 其他并发问题
      • 12.8 小结
      • 家庭作业
  • 附录 A:错误处理
  • 参考文献
  • 实验
    • 实验总览
      • 常见问题
    • 实验 1:Data Lab
      • README(讲师版)
      • README(学生版)
      • Writeup
    • 实验 2:Bomb Lab
      • README(讲师版)
      • Writeup
    • 实验 3:Attack Lab
    • 实验 4:Architechture Lab
    • 实验 5:Cache Lab
    • 实验 6:Performance Lab
    • 实验 7:Shell Lab
    • 实验 8:Malloc Lab
    • 实验 9:Proxy Lab
由 GitBook 提供支持
在本页
  • 0. 文件
  • 1. 修改 bits.c 并检查它是否符合 dlc 的要求
  • 2. 使用 btest 测试
  • 3. 帮助程序
  1. 实验
  2. 实验 1:Data Lab

README(学生版)

CS:APP Data Lab

给学生的指导

你的目标是修改你的 bits.c 副本,以便它通过 btest 中的所有测试,并且不违反任何代码准则。

0. 文件

文件名

说明

Makefile

构建 btest、fshow 和 ishow

README

本文件

bits.c

你将要修改和提交的文件

bits.h

头文件

btest.c

btest 主程序

btest.h

用于构建 btest

decl.c

用于构建 btest

tests.c

用于构建 btest

tests-header.c

用于构建 btest

dlc*

规则检查编译器的二进制文件(data lab 编译器)

driver.pl*

使用 btest 和 dlc 来为 bits.c 自动评分的驱动程序

Driverhdrs.pm

头文件,用于可选的“击败教授”比赛

fshow.c

实用代码,用于检查浮点表示

ishow.c

实用代码,用于检查整数表示

1. 修改 bits.c 并检查它是否符合 dlc 的要求

重要:在你开始之前,请仔细阅读 bits.c 文件中的说明。说明中给出了代码规则,如果你想获得全部分数,你需要遵守它们。

使用 dlc 编译器(./dlc)自动检查 bits.c 版本是否符合编码准则:

如果代码没有问题,dlc 将以静默方式返回。否则,它会打印消息,标记出问题。使用 -e 参数运行 dlc:

unix> ./dlc -e bits.c

可让 dlc 打印每个函数使用的运算符数目。

一旦有了合法解答,你就可以使用 ./btest 程序测试它的正确性。

2. 使用 btest 测试

此目录中的 Makefile 使用附加代码编译 bits.c 版本,以创建名为 btest 的程序(或测试工具)。

要编译并运行 btest 程序,请键入:

unix> make btest
unix> ./btest [optional cmd line args]

每次更改 bits.c 程序时,都需要重新编译 btest。当从一个平台迁移到另一个平台时,你会想删除旧版本 btest 并生成一个新版本。使用以下命令:

unix> make clean
unix> make btest

Btest 通过在每个函数上运行数百万个测试用例来测试代码的正确性。它测试了大范围的边缘用例,比如整数谜题的 Tmin(最小有符号数) 和 0,浮点谜题的 0,无限大(inf),以及非规范化和规范化数字之间的边界。当 btest 检测到某个函数中的错误时,它会打印出失败的测试、不正确的结果和预期的结果,然后终止对该函数的测试。

以下是 btest 的命令行选项:

  unix> ./btest -h
  用法: ./btest [-hg] [-r <n>] [-f <name> [-1|-2|-3 <val>]*] [-T <time limit>]
    -1 <val>   指定第一个函数参数
    -2 <val>   指定第二个函数参数
    -3 <val>   指定第三个函数参数
    -f <name>  只测试指定名称的函数
    -g         格式化输出评分,不包含错误信息
    -h         打印该信息
    -r <n>     给所有问题统一的权重 n
    -T <lim>   设置超时限制为 lim

样例:

测试所有功能的正确性并打印出错误消息:

unix> ./btest

以紧凑的形式测试所有函数,不含错误消息:

unix> ./btest -g

测试函数 foo 的正确性:

unix> ./btest -f foo

使用特定参数测试函数 foo 的正确性:

unix> ./btest -f foo -1 27 -2 0xf

btest 不会检查你的代码是否符合代码准则,需使用 dlc。

3. 帮助程序

我们提供了 ishow 和 fshow 程序,分别帮助你破译整数和浮点表示。每个都以一个十进制或十六进制数作为参数。要构建它们,请键入:

unix> make

用法样例:

unix> ./ishow 0x27
Hex = 0x00000027,   Signed = 39,    Unsigned = 39

unix> ./ishow 27
Hex = 0x0000001b,   Signed = 27,    Unsigned = 27

unix> ./fshow 0x15213243
Floating point value 3.255334057e-26
Bit Representation 0x15213243, sign = 0, exponent = 0x2a, fraction = 0x213243
Normalized.  +1.2593463659 X 2^(-85)

linux> ./fshow 15213243
Floating point value 2.131829405e-38
Bit Representation 0x00e822bb, sign = 0, exponent = 0x01, fraction = 0x6822bb
Normalized.  +1.8135598898 X 2^(-126)
上一页README(讲师版)下一页Writeup

最后更新于4年前