xv6-riscv 开发环境搭建

本文介绍如何搭建 xv6-riscv 的开发环境。

简介

xv6 是 Dennis Ritchie 和 Ken Thompson 的 Unix Version 6 (v6) 的重新实现。xv6 的主要目的是作为 MIT 6.1810 的教学操作系统[1]

环境

我使用的系统环境:

  • Ubuntu 24.04.1 LTS

安装

我们需要安装相关交叉编译工具,以及 QEMU 以模拟 RISC-V 芯片。以下命令修改自 mmikaitis/xv6-tools-container/xv6-tools-container.def[2]

1
2
sudo apt update
sudo apt install -y build-essential gcc-riscv64-linux-gnu qemu-system-riscv64 gdb-multiarch

下载 xv6-riscv

1
2
git clone git@github.com:mit-pdos/xv6-riscv.git
cd xv6-riscv

编译和运行

1
2
make
make qemu

此时看到如下输出,说明编译和运行成功:

1
2
3
4
5
6
xv6 kernel is booting

hart 2 starting
hart 1 starting
init: starting sh
$

要退出 QEMU,可以按下 Ctrl + A,然后按下 X

QEMU 启动后无响应

我在搭建环境的时候遇到了 make qemu 启动后无响应的问题,最终查找到了这个 issue,相关的 PR 提供的解决方案是可用的。

经过我的尝试,将系统和 QEMU 更新到最新版本也可以解决问题。我最终使用的是 Ubuntu 24.04.1 LTSQEMU emulator version 8.2.2 (Debian 1:8.2.2+ds-0ubuntu1.2)

也可以下载编译安装新版 QEMU[3]

1
2
3
4
5
6
7
wget https://download.qemu.org/qemu-8.2.2.tar.xz
tar -xf qemu-8.2.2.tar.xz
cd qemu-8.2.2
./configure --disable-kvm --disable-werror --prefix=/usr/local --target-list="riscv64-softmmu"
make
sudo make install
cd ..

在编译 QEMU 时,可能需要安装 Ninja[4]

1
sudo apt install ninja-build

IDE 远程开发

项目位于远程 Linux 服务器上,如果我们希望在本地使用一个强大的 IDE 进行开发,而不是在服务器使用 vim 等文本编辑器,可以使用 Clion 通过 SSH 连接到服务器进行开发。

在 Clion 中创建 SSH 连接

选择项目路径和 IDE 版本

连接后即可和本地项目一样进行开发,在 terminal 中执行 make qemu 即可运行 xv6-riscv。

IDE 界面

代码分析

由于 Clion 一些奇怪的历史原因,无法良好地识别 Makefile 项目的文件结构。一开始会显示 “This file does not belong to any project target”,在标记目录为 “Project Sources and Headers” 之后,依然无法找到正确的头文件。

This file does not belong to any project target

Mark Directory as Project Sources and Headers

Cannot find directory in search paths

要解决该问题,我们只需要创建一个 CMakeLists.txt 文件,骗过 IDE,使其识别项目的文件结构。

1
2
3
4
5
6
7
8
9
10
11
12
13
cmake_minimum_required(VERSION 3.24)
project(xv6 C)

set(CMAKE_C_STANDARD 99)

include_directories(.)

add_executable(xv6
kernel
mkfs
user
kernel/main.c
)

请注意 include_directories(.) ,用于将指定目录添加到编译器用于搜索包含文件的目录中

关闭 Clion 并删除 .idea 目录,然后重新打开项目,选择 “Open as CMake Project”:

选择 Open as CMake Project

现在可以正常使用 IDE 的代码分析功能了

远程调试

首先将 GDB 端口映射到本地,添加远程调试配置:

查看端口号

远程调试配置

然后运行

1
make qemu-gdb

make qemu-gdb

启动后会等待,运行刚刚添加的远程调试,程序在断点处停止:

程序在断点停止

如果需要调试用户程序而不是内核,添加另一个远程调试:

用户程序调试

用户程序的断点

References

  1. mit-pdos. xv6-riscv. Archived on 2024-07-23. Retrieved 2024-10-15.
  2. xv6-tools-container.def. 2024-09-07. Archived on 2024-10-06. Retrieved 2024-10-15.
  3. rovast. qemu-system-riscv64 is not found in package qemu-system-misc. 2022-03-06. Archived on 2024-10-06. Retrieved 2024-10-24.
  4. Oleksii Chernykh. Pre built Ninja packages. 2024-04-09. Archived on 2024-10-06. Retrieved 2024-10-24.
  5. Zhang Yuxuan. 【99%环境搭建系列】xv6-riscv内核调试教程. 2022-03-19. Archived on 2024-10-06. Retrieved 2024-10-15.
  6. 钟万祥. xv6 Remote Debug using CLion. 2019-02-16. Archived on 2024-10-06. Retrieved 2024-10-17.

xv6-riscv 开发环境搭建
https://blog.zhanganzhi.com/zh-CN/2024/10/4036f0443a57/
作者
Andy Zhang
发布于
2024年10月15日
许可协议