课程实验

‼️ 学术诚信

独立完成实验是对自己最好的训练。在这一过程中,你可以从网上搜索或者向 AI 询问 API 的使用方式和示例、以及对相关概念和技术的介绍,但要主动避免去网上「搜索」和「参考」已有的代码实现、或者让 AI 来直接生成代码。

‼️ 实验分数

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

本学期的课程实验包括:

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

实验环境准备

完成实验需要准备一个可用的 Linux 系统 (我们推荐使用 Ubuntu 24.04,和 OJ 运行环境一致),并在其中安装包括编辑器、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 [TBD]
cd os-lab-2025fall

启动 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。

实验提交

TBD

答疑

实验处于建设阶段,手册、框架代码等可能存在问题,在实验中遇到任何与实验相关的问题,都欢迎向助教提问,直接在对应实验框架代码的 GitLab 仓库中提交 Issue 即可。但在提 Issue 前请先搜索是否有类似问题,避免重复提问,并注意提问的智慧

特别注意:

  1. 答疑的主要目的是解释实验手册描述不完善、或造成大家对实验需求理解有歧义的地方,而不是为你提供答案或陪你 debug,助教不是你的小黄鸭;
  2. 提问前请先自行思考,助教不会回答一切问题;
  3. 提问前请检查实验手册中是否已经明确说明过,不要提 “蠢问题”;
  4. 不要在 Issue 中粘贴自己的代码;
  5. 请理解什么是 STFW & RTFM。

好的提问示例:

  1. 实验 1 的手册中写的是 xxx,但是有两种理解方式,xxx 和 xxx,请问是 A 还是 B?(助教可能在写手册的时候没有考虑到有多种理解方式,提出你的理解)
  2. 实验 2 的某个要求是 xxx,但是我不太理解,能否给一个例子?(例子可以辅助你理解,而不是直接问这是什么意思,助教也不知道你哪里没理解)
  3. 这个测试用例我在本地测试可以通过 (请认真检查确定是通过的),但是提交不通过,可否给出 OJ 上的输出?(OJ 上使用自动化脚本,从标准输入输出传入测试用例,如果你没有正确处理标准输入输出,可能会有不同的表现,在本地终端测试难以发现)

不好的提问示例:

  1. 实验 1 没有看懂,助教可以给点提示吗?(哪里没看懂,看之后你有什么理解)
  2. 实验 2 的这个要求做不到,太难了 (为什么做不到,仅仅抱怨不解决任何问题)
  3. 实验环境怎么配/代码编译不成功/运行不了/某个 API 怎么用 (这些问题应该由搜索引擎/LLM解决)

实验截止时间

本学期每个实验会设置一个截止时间 (Soft Deadline),我们会在该截止时间后进行必要的代码查重、阅读实验报告、以及手工运行部分代码进行额外检查。在实验 Soft Deadline 之前完成至少一次完整提交 (包括代码和实验报告) 将获得一定加分。不同实验的截止时间会有重叠,大家注意安排好时间。

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


Table of contents