课程实验

本课程的实验内容以及 Online Judge (OJ) 仍处于不断开发和完善过程中,若出现 OJ 无响应的情况,可以过一段时间后再重试。如果发现 OJ 返回分数和自己本地测试结果不符时不要焦虑,可以思考和分析问题来自于自己代码还是 OJ。关于 OJ 使用过程中遇到的 Bugs、以及对实验内容的相关建议可以随时反馈给助教。

学术诚信

‼️ 独立完成实验是对自己最好的训练。在这一过程中,你可以从网上搜索或者向 GPT 等 AI 模型询问 API 的使用方式和示例、以及对相关概念和技术的介绍,但要主动避免去网上「搜索」和「参考」已有的代码实现、或者让 AI 来帮你生成代码,当然更不允许直接复制别人的代码。违反学术诚信的行为将导致本门课程总评成绩为 0 分。

实验分数

‼️ 实验分数是课程总评成绩构成的一部分,没有提交实验将导致缺少相应分数。 对于完成全部实验需求确有困难的同学,可以仅提交完成部分需求的代码。为了促进学术诚信,提交完全为空的代码文件也将获得一定的诚信分数。

本学期的课程实验包括:

  • 编程实验 (基于 Linux): 利用操作系统提供的典型系统调用 (APIs) 来实现某些功能
  • 系统实验 (基于 xv6): 实现操作系统内核的某些功能

实验环境准备

完成实验需要准备一个可用的 Linux 系统 (我们推荐使用 Ubuntu 24.04),并在其中安装包括编辑器、gcc 等在内的必要软件。可采用的方式包括:

  • 物理机直接安装 Linux
  • Windows Subsystem for Linux (WSL)
  • 虚拟机安装 Linux (e.g., VirtualBox 等)

编程实验可以直接在上述 Linux 系统上完成。对于基于 xv6 的系统实验,请按照如下流程来设置。

实验环境安装和测试

我们的实验环境依赖 RISC-V 版本的 QEMU 7.2+, GDB 8.3+, GCCBinutils,运行如下命令来安装必要工具:

Debian 或 Ubuntu

sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu

Arch Linux

sudo pacman -S riscv64-linux-gnu-binutils riscv64-linux-gnu-gcc riscv64-linux-gnu-gdb qemu-emulators-full

WSL (Windows Subsystem for Linux):注意仅支持在 WSL2 上进行实验,不支持 WSL1。

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu

虚拟机 (VMware 或 VirtualBox):如果使用虚拟机,建议安装 Ubuntu 24.04 LTS,并按照 Ubuntu 上的安装方法进行安装。

其他操作系统:目前不建议在其他操作系统上进行实验,但你也可尝试自行解决可能存在的依赖问题。

在安装完成后,检查 QEMU 版本 (需要 7.2.0 以上)。如果显示如下信息,则表示安装成功:

$ qemu-system-riscv64 --version
QEMU emulator version 7.2.0

同时检查 gcc 版本,需要至少以下一条命令显示相似信息:

$ riscv64-linux-gnu-gcc --version
riscv64-linux-gnu-gcc (Debian 10.3.0-8) 10.3.0
...
$ riscv64-unknown-elf-gcc --version
riscv64-unknown-elf-gcc (GCC) 10.1.0
...
$ riscv64-unknown-linux-gnu-gcc --version
riscv64-unknown-linux-gnu-gcc (GCC) 10.1.0
...

启动 xv6

运行如下命令下载 xv6-riscv 代码 (需要在南大的 GitLab 上注册帐号):

git clone https://git.nju.edu.cn/oslab/os-lab-2024fall.git
cd xv6-riscv-2024fall

启动 xv6:

git checkout riscv
make qemu

如果出现以下内容,则表示启动成功:

...
xv6 kernel is booting

hart 2 starting
hart 1 starting
init: starting sh
$ 

使用快捷键 Ctrl+A,然后按 X 退出 xv6。

使用 gdb

在调试复杂的代码时,断点调试是非常有用的。我们强烈建议在开始编写代码之前,先学会使用 gdb 进行调试。 关于 gdb 的使用方法,可以参考 GDB 官方文档

对于 xv6,可以通过以下方式启动 gdb:

make qemu-gdb

此时,QEMU 会暂停并等待 gdb 连接。在另一个终端中,使用 gdb-multiarch (或者 riscv64-linux-gnu-gdbriscv64-unknown-elf-gdb) 连接到 QEMU。

实验提交

目前 OJ 服务器仅支持校园网环境访问,如果在校外请使用学校 VPN 连接。

我们为每位同学生成了一个 Token 并将通过邮件发送到各自的南大邮箱 (学号@smail.nju.edu.cn),请保存该 Token 并在每次实验提交时提供 (若没收到请单独联系助教)。

在完成每次实验后,按实验手册要求使用如下方式提交实验代码和实验报告 (由于实验截止后我们才会阅读实验报告,因此可以先仅提交代码进行测试,在实验截止前提交最终版实验报告即可)。

通过 Makefile 打包提交

注意在打包前 commit 需要提交的内容;同时注意合理使用 .gitignore,不要提交无关文件。

对于框架代码中有 Makefile 文件的实验,我们会在该文件中提供自动的代码打包和提交指令。你需要新建一个 conf/info.mk 文件,并将学号和 Token 添加到该文件中:

# conf/info.mk
SID=123456789
TOKEN=123456789abcdefg

在完成实验后,提交当前最新版本到本地仓库:

git add .
git commit -m [message]

执行以下命令打包实验代码,这会将当前分支最后一次 commit 内容自动打包为 学号.zip

make package

最后,执行以下命令提交实验代码到 OJ:

make submit

对于实验报告,需将实验报告命名为 学号.pdf,并放入代码根目录,随后可通过以下命令提交:

make report

手动提交

直接运行如下命令分别提交实验代码 (主要用于仅需提交一个 .c 文件的实验) 和实验报告:

# code
curl -F "token=[TOKEN]" -F "lab_num=[LAB ID]" -F "file=@[FILE NAME]" http://114.212.81.7:9999/upload_code 
# report
curl -F "token=[TOKEN]" -F "lab_num=[LAB ID]" -F "file=@[FILE NAME]" http://114.212.81.7:9999/upload_report

结果返回

如果提交成功,你会收到类似如下格式的返回信息:

{
  "sid": "学号"
  "name": "姓名"
  "submit index": "当前提交 ID"
  "message": "Code/Report file uploaded successfully"
}

实验代码将在我们的测试环境中进行检查、编译和运行。你可以通过以下命令获取测试结果和反馈信息 (例如,对未通过测试的补充说明):

curl "http://114.212.81.7:9999/download?token=[TOKEN]&lab_num=[LAB ID]"

实验结果将以类似如下的格式返回 (受限于可用资源,建议在提交几分钟后查看结果):

{
  "score": "最近一次提交得分"
  "submit index": "最近一次提交 ID"
  "highestscore": "历史最高得分"
  "message": "反馈信息"
}

此外,为了引导大家不要不假思索地将 OJ 当作 “默认” 存在的 Test Oracle 来使用 (不管对不对先提交,反正 OJ 会告诉我结果),我们会设置相应的 “冷却时间”,在每次提交后需要间隔一定时间才能进行下一次提交。

* 如果你发现提交到 OJ 上的某个测试用例总是不通过,并且你确信自己的实现没有问题,那有可能是 OJ 的问题。请及时联系助教。

* 代码执行所需时间比较久,提交后请等待一段时间再查看结果,但一般不会超过 15 分钟,如果超过 15 分钟还没有结果,请联系助教。

实验截止时间

本学期每个实验会设置一个截止时间 (Soft Deadline),我们会在该截止时间后进行必要的代码查重、阅读提交的实验报告、手工运行代码进行额外的检查、并最终结合 OJ 记录的分数来确定每次实验的最终得分 (不同实验的截止时间会有重叠,大家注意安排好时间)。

在实验 Soft Deadline 之前完成至少一次完整提交 (包括代码和实验报告) 将获得一定加分,完成选做实验也会有一定加分,加分上限可超过 100 分。

所有实验的最终截止时间 (Hard Deadline) 将在本学期末结束,在此之前均可提交更新版本的代码和报告。超过该截至时间后提交的实验将无法反应在最终成绩中。


Table of contents