Skip to content
This repository has been archived by the owner on Mar 29, 2021. It is now read-only.

zhangboyang/NEMU-testcase

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

# NEMU-testcase
zby's testcase of NEMU

ZBY 的 NEMU 测试用例

关于 NEMU:
    NEMU 是复旦大学计算机系统基础课的大作业,目的是实现一个简单的教学用 x86 虚拟机。
    复旦版是南大版的一个分叉项目 (fork),因为 NEMU 是南大的项目。
    复旦版:https://github.com/fdu-ics/programming-assignment
    南大版:https://github.com/nju-ics/ics2015

=======================================

高级测试用例:
    testcase/src 目录下含有测试用例,其中有一部分是手写的,另一部分是用数据结构作业自动生成的。
    其中一些运行时间会比较长,但不会超过三分钟。
    我的 GCC 版本为 4.8.4,其他版本不保证运行没有问题。

使用方法:
    将 testcase/src 目录下所有 .c 文件复制到你自己的 PA 对应目录下即可。


强烈建议对测试用例开启 -O2 编译优化:
    由于 kernel, game 都是开启 -O2 优化来编译的,开启优化后,编译器产生的代码会有很大的不同,
    因此强烈建议不开优化测一遍、开启优化再测一遍。
    具体的开启编译优化的步骤是:
    在 testcase/Makefile.part 的第一行,向 testcase_CFLAGS_EXTRA 中添加 -O2 选项。

一些测试用例的说明:
    LLneg.c
        需要 NEG 指令更新 CF 标志,否则会测试失败,详情请看代码内的注释。
    LLdiv.c
        用减法和移位实现的 long long 型除法,可以解决虚拟机中不能进行 long long 除法的问题。
        源项目:https://github.com/zhangboyang/LLdiv
    bad.c bad2.c
        始终 HIT BAD TRAP。用来测试 NEMU 能不能 HIT BAD TRAP。
        记得在交作业之前把它删掉以免引起误会。
    movzx_high.c movsx_high.c
        测试 MOVZX, MOVSX 中单字节寄存器的译码是否正确。
    memcmp.c
        由于某种幸运的原因,SHR 指令不更新 ZF 也能通过测试,详情请看代码内的注释。
    poj*.c la*.c
        用脚本自动生成的测试用例(见后)。来源是数据结构课作业。

=======================================

增强版的 trap.h:
    经过我修改的 trap.h 支持真机测试(见后),同时增加了 REALMACHINE_NOTSUITABLE 宏表明
    某一个测试样例不适合在真机上进行测试。
    如果你不愿意使用该 trap.h,可以删掉含有 REALMACHINE_NOTSUITABLE 的文件。
    注意:该文件并不是我创建的,而是从 NEMU 项目中的文件修改而来,因此该文件并不适用根目录下
    的 LICENSE 文件中的许可证内容。我只能按照 GitHub 默认的“允许fork”原则发布。

内嵌汇编的参考资料:
    有一些测试样例用到了内嵌汇编,用来测试指令级的行为。
    参考资料:http://www.cnblogs.com/taek/archive/2012/02/05/2338838.html

在真机上运行测试用例:
    在真机上运行测试用例可以检测测试用例的正确性,用 realtest.sh 脚本可以实现这一点。
    realtest.sh 的用法:
        ./realtest.sh : 测试 testcase/src 下的所有测试用例
        ./realtest.sh someprogram.c : 仅测试 testcase/src/someprogram.c

关于真机运行的细节:
    在真机运行测试用例时,如果直接运行会遇到访问违例的问题,可以通过 mmap 进行内存映射来解决。
    具体的代码在 realtest.c 中。

自动生成测试用例:
    testcasegen.sh 脚本可以用来自动生成测试用例。
    testcasegen.sh 的用法:
        ./testcasegen.sh path_to_some_c_src.c input_data.txt testcasename.c
        将以 input_data.txt 为输入数据,运行 path_to_some_c_src.c 中的程序并产生输出。
        并且将可以直接在 NEMU 中运行的 C 源代码文件命名为 testcasename.c 并拷贝到相应位置。
        输入数据和输出数据会内嵌在生成出来的 C 源代码文件中。
    输入的代码应该是类似 OJ 的输入输出形式,即用 scanf 读入数据,用 printf 输出数据。
    因为是自己手写的 printf 和 scanf,所以只支持简单的 %d %lld %s %c 格式符,
    *不*支持这些格式符的高级用法如 %1d %10s 等。除 printf 外还支持 puts putchar 进行输出。
    输入输出部分代码(即生成模板)在 testcase/naive-stdio-template.c 中。
    源项目:https://github.com/zhangboyang/naive-stdio

Releases

No releases published

Packages

No packages published

Languages