Skip to content

a. Prof Level Manual

本文档是专业阶段的实验手册。

专业阶段的实验围绕着 G233 虚拟开发板展开,你需要按照 G233 Board Datasheet 手册给出的硬件参数,完成实验任务,从而帮助你更好的掌握 QEMU 建模,理解 QEMU 模拟器的工作原理。

温馨提示

关于硬件建模部分,你可以尝试用 Rust 来实现(QEMU 有基本框架);若想进一步挑战自我,也可以尝试用 Rust 模拟客户机指令(需要自己从零实现)。

环境搭建

第一步,以 Ubuntu 22.04 为例,介绍如何安装 QEMU 开发环境。

# 备份 sources.list 文件
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 启用 deb-src 源(将所有 deb 源对应的 deb-src 源解锁)
sudo sed -i '/^# deb-src /s/^# //' /etc/apt/sources.list
sudo apt-get update
sudo apt update && sudo apt build-dep qemu

# 创建工具链安装目录
sudo mkdir -p /opt/riscv

# 下载工具链压缩包
wget https://github.com/riscv-collab/riscv-gnu-toolchain/releases/download/2025.09.28/riscv64-elf-ubuntu-22.04-gcc-nightly-2025.09.28-nightly.tar.xz -O riscv-toolchain.tar.xz

# 解压到安装目录
sudo tar -xJf riscv-toolchain.tar.xz -C /opt/riscv --strip-components=1

# 设置权限
sudo chown -R $USER:$USER /opt/riscv
echo "/opt/riscv/bin" >> $GITHUB_PATH
export PATH=$PATH:/opt/riscv/bin/

riscv64-unknown-elf-gcc --version  # 验证编译器是否可用

# 安装 Rust 工具链
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable

# 验证 Rust 安装
rustup --version
rustc --version
cargo --version

提示

安装 QEMU 开发环境,请参考导学阶段的 Step0: 搭建 QEMU 开发环境

安装 RISC-V 的交叉编译工具链:下载地址,尽量选择最新的版本,要求安装 riscv64-unknown-elf- 类型。

安装 Rust,版本要求 >= 1.85,安装方法请参考 Rust 官方文档

第二步,点击这里,自动 fork 作业仓库到 GTOC 组织下面,该仓库会为你开通代码上传权限。

第三步,需要 clone 刚刚 fork 好的仓库到本地:

git clone git@github.com:gevico/learning-qemu-2025-<你的 github 用户名>.git

# 比如 github 用户名是 zevorn,那么命令如下:
# git clone git@github.com:gevico/learning-qemu-2025-zevorn.git

第四步,添加上游远程仓库,用于同步上游的代码变更:

git remote add upstream git@github.com:gevico/gevico-classroom-learning-qemu-2025-learning-qemu.git

同步上游代码变更的常用命令:

git pull upstream main --rebase

最后一步,配置编译选项:

cd qemu
./configure --target-list=riscv64-softmmu \
            --extra-cflags="-O0 -g3" \
            --cross-prefix-riscv64=riscv64-unknown-elf- \
            --enable-rust

执行时,如果看到以下输出,证明交叉编译工具链配置成功:

  ...
  Cross compilers
    riscv64                         : riscv64-unknown-elf-gcc
  ...

提交代码

所有实验的测题源码,均放在仓库根目录路径: tests/gevico/tcg/riscv64/

你需要熟读每个测题源码,理解每个测题的测试意图,并实现对应的 QEMU 建模功能(需要修改 QEMU 本体源码,非测题源码),文末会给出具体实验的介绍,辅助你阅读测题源码。

每次实验完成后,需要将你的代码提交到你的 fork 仓库中。

git add .
git commit -m "feat: subject..."
git push origin main

Note

请确保你的代码符合仓库的代码规范,包括代码格式、注释等。

测评验收

本地运行测题的方式:

make check-gevico-tcg

全部测题通过的情况下,你会看到如下输出:

  BUILD   riscv64-softmmu guest-tests
  RUN     riscv64-softmmu guest-tests
  TEST      1/10   test-board-g233 on riscv64
  TEST      2/10   test-insn-dma on riscv64
  TEST      3/10   test-insn-sort on riscv64
  TEST      4/10   test-insn-crush on riscv64
  TEST      5/10   test-insn-expand on riscv64
  ...

如果你想运行某个测例,比如 test-board-g233,可以使用如下命令:

make -C build/tests/gevico/tcg/riscv64-softmmu/  run-board-g233

Note

当你使用 make -C 指定了路径以后,你可以通过输入 run- 和 tab 键来查看可以运行的测题

如果你想调试某个测例,比如 test-board-g233,可以使用如下命令启用 QEMU 的远程调试功能:

make -C build/tests/gevico/tcg/riscv64-softmmu gdbstub-board-g233

同理,你也可以通过 gdbstub- 和 tab 键来查看可以远程调试的测例。

然后需要你本地另起一个终端,使用 riscv-elf-gdb 加载被调试客户机二进制程序,进行远程调试。

Note

你需要熟读 G233 Board Datasheet 和测题的源码,来理解每个实验的测试意图,这会极大地方便你调试,提高开发效率。

每道测题 10 分,一共 10 道测题,共计 100 分,评分将显示到训练营的专业阶段排行榜

实验介绍

为了方便设计测题,我们设计了一个虚拟板卡 G233,并且编写了 G233 Board Datasheet,用于描述 G233 板卡的硬件规格和功能。

该阶段涉及的所有实验的硬件参数,全部记录在 G233 Board Datasheet 中。熟读手册可以帮你更好的理解每个实验的测试意图。

所有实验的测题,均在 tests/gevico/tcg/riscv64/ 目录下,以 test- 开头的 .c 文件。

实验一 test-board-g233

源码路径: tests/gevico/tcg/riscv64/test-board-g233.c

该实验用于验证 G233 Board 是否正常工作。你需要在 QEMU 中模拟 G233 Board。

基本代码已经存放在 hw/riscv/g233.c 中,需要你进一步补全它。

实验二 test-insn-dma

源码路径: tests/gevico/tcg/riscv64/test-insn-dma.c

该实验用于验证 G233 Board 的 DMA 指令功能是否正常工作。你需要在 QEMU 中实现这条指令。

这条指令的详细描述在 G233 Board Datasheet 中。

实验三 test-insn-sort

源码路径: tests/gevico/tcg/riscv64/test-insn-sort.c

该实验用于验证 G233 Board 的 sort 指令功能是否正常工作。你需要在 QEMU 中实现这条指令。

这条指令的详细描述在 G233 Board Datasheet 中。

实验四 test-insn-crush

源码路径: tests/gevico/tcg/riscv64/test-insn-crush.c

该实验用于验证 G233 Board 的 crush 指令功能是否正常工作。你需要在 QEMU 中实现这条指令。

这条指令的详细描述在 G233 Board Datasheet 中。

实验五 test-insn-expand

源码路径: tests/gevico/tcg/riscv64/test-insn-expand.c

该实验用于验证 G233 Board 的 expand 指令功能是否正常工作。你需要在 QEMU 中实现这条指令。

这条指令的详细描述在 G233 Board Datasheet 中。

实验六 test-spi-jedec

源码路径: tests/gevico/tcg/riscv64/test-spi-jedec.c

该实验用于验证 G233 Board 的 SPI-JEDEC 功能是否正常工作。你需要在 QEMU 中实现这个外设。

这个外设的详细描述在 G233 Board Datasheet 中。

实验七 test-flash-read

源码路径: tests/gevico/tcg/riscv64/test-flash-read.c

该实验用于验证 G233 Board 的 flash-read 功能是否正常工作。你需要在 QEMU 中实现这个外设。

这个外设的详细描述在 G233 Board Datasheet 中。

实验八 test-flash-read-int

源码路径: tests/gevico/tcg/riscv64/test-flash-read-interrupt.c

该实验用于验证 G233 Board 的中断功能是否正常工作。你需要在 QEMU 中实现这个外设的中断功能。

这个中断对应的外设的详细描述在 G233 Board Datasheet 中。

实验九 TODO

[待更新]

实验十 TODO

[待更新]