wsl2配置xv6全解(包括22.04Jammy)

发布于:2025-03-22 ⋅ 阅读:(17) ⋅ 点赞:(0)

获取xv6源代码

git clone https://github.com/mit-pdos/xv6-riscv.git
cd xv6-riscv #视下载后项目文件而定,可能在更多层中

下载好并正确进入OS源代码所在文件夹后,结构应该为

请添加图片描述

Ubuntu

20.04 Version

最终环境:QEMU 5.1+, GDB 8.3+, GCC, and Binutils.

安装指令

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

成功测试

# in the xv6 directory
$ make qemu
# ... lots of output ... 最终显示
init: starting sh
$

如果没有成功,可以检查下面环境

$ qemu-system-riscv64 --version
QEMU emulator version 5.1.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
...

参考MIT2021年官方文档

6.S081 / Fall 2021

24.04 Version

最终环境:RISC-V versions of QEMU 7.2+, GDB 8.3+, GCC, and Binutils.

安装指令

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

成功测试

# in the xv6 directory
$ make qemu
# ... lots of output ...
init: starting sh
$

如果没有成功,可以检查下面环境

$ 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
...

参考MIT2024年官方文档

6.1810 / Fall 2024

Ubuntu 22.04

有人又要说了,博主博主这不是CV官方文档吗。这也可以水一篇博客,强烈谴责!

也有人就要问了,主播主播,20.04和24.04版本的配置环境太没有含金量了,有没有什么又没有什么博客指引,也没有官方文档的版本?

有的,兄弟,有的。像这样的牢版本还有2(jiǔ)个……其中一个便是咱们的22.04,高贵的Jammy玩家

没有官方文档?

20年没有wsl版本,21~23年是20.04的天下,24年终于更新了……是24.04(Jammy玩家悬着的心还是死了)

不过以下指令还是要先执行的

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

配置大体流程

  1. 卸载原先qemu
  2. clone qemu官方源代码,切换到stable 7.2 version
  3. configure
  4. make 并 install

1. 卸载原本qemu(如果之前安装了)

22.04版本使用 apt install 直接安装的版本是 6.2.0
请添加图片描述

由于不知名原因,这个qemu并无法直接使用。会出现执行 make qemu 到一半卡住无反馈的情况

请添加图片描述

我当时还寻思着怎么启动个系统这么久……

此时有两个选择,一是使用老版本qemu(5.1),二是使用新版本qemu(7.2)。由于官方已更新,所以我们选择后者。

使用apt移除qemu

sudo apt remove --purge qemu qemu-system qemu-utils qemu-system-* -y

清理残留文件

sudo apt autoremove -y
sudo apt autoclean

检查是否仍然存在 QEMU

qemu-system-riscv64 --version

如果命令返回 “command not found”,说明 QEMU 已成功卸载。

2. clone qemu官方源代码,切换到stable 7.2 version

git clone https://gitlab.com/qemu-project/qemu.git
cd ./qemu
git checkout stable-7.2

注意:这里没有用到最新版(学都是学最新的,用都是用最老的~~~)

3. configure

cd qemu/
mkdir build
cd build/
../configure --target-list=x86_64-softmmu,riscv64-softmmu --enable-debug

注意这里我们只make了x86_64和riscv-64版本并且之后安装到/usr/local下。此时调用项目中可执行文件configure为make作准备。

出现 ERROR: Cannot find Ninja

执行命令

sudo apt install ninja-build

出现 ERROR: glib-2.56 gthread-2.0 is required to compile QEMU

执行命令

sudo apt install libglib2.0-dev

之后想要将qemu安装到/usr而非/usr/local下(不推荐,可能会和系统自带包管理器相冲突)

将原本configure指令替换为

../configure --target-list=x86_64-softmmu,riscv64-softmmu --enable-debug --prefix=/usr

成功configure之后显示
请添加图片描述
后面还有很多参数,没有截全

4. make 并 install

make -j$(nproc)
sudo make install

make过程可能会持续几分钟,因机而异

完成后尝试

qemu-system-riscv64 --version

如果正常输出则ok,如果没有找到则需要将 /usr/local 也添加到 PATH

尝试

 export PATH=/usr/local/bin:$PATH
 qemu-system-riscv64 --version

如果正常输出则将该路径添加到配置文件的PATH中

echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

如果,不出意外的话。此时回到 xv6-riscv 目录便可以执行 make qemu
请添加图片描述

5. 删除下载的qemu项目

如果之后不打算make其他架构的硬件模拟,此时便可以把下载的qemu源代码文件夹删除了

sudo rm -rf ./qemu

心酸历程

能不能用24.04的Qemu?

你可真是个小天才,借腹生子是吧!!!

警告:以下命令不要随便执行

sudo add-apt-repository ppa:jacob/virtualisation -y
sudo apt update
sudo apt install qemu-system-riscv64 -y

运行之后再去试试 make qemu ,结果能执行了!!!然后发现你的 gdb 就神奇的不见了……
请添加图片描述

原因就是你安装高版本的 qemu-system 时安装了覆盖一些依赖,此时便将冲突的gdb给卸载了。仔细检查 sudo apt install qemu-system-riscv64 -y 的输出日志可以发现信息

The following packages will be REMOVED:
  debhelper debugedit gdb gdb-multiarch ...

sad~~~天地好轮回,苍天饶过谁

这个教训告诉我们,以后在看到有哪篇博客里存在指令 apt *** -y-y 结尾,基本可以拖出去斩了(bushi)

后面就因为这个事情导致22.04版本的一些依赖变成了24.04,这个做法实在是个烂主意!

请添加图片描述

原以为22.04玩家已经是最牢的,没想到b站上还有更牢的18.04玩家(bushi)

立创泰山派训练营学习笔记–Ubuntu22.04.4 rootfs根文件系统制作-Linux SDK编译(二)

更多

三种riscv-gcc的应用场景与区别

编译器 适用场景 目标架构 典型应用 是否支持标准 C 库
riscv64-linux-gnu-gcc Linux 用户空间 riscv64-linux-gnu 编译 RISC-V Linux 应用程序 ✅ (glibc)
riscv64-unknown-elf-gcc 裸机 / RTOS / OS 内核 riscv64-unknown-elf 编译 xv6、U-Boot、裸机程序 ❌(无操作系统支持)
riscv64-unknown-linux-gnu-gcc Linux 用户空间 riscv64-unknown-linux-gnu 交叉编译 Linux 程序(可能使用 musl) ✅ (glibcmusl)
  • 如果你在开发 Linux 用户空间应用(如普通软件)
    → 用 riscv64-linux-gnu-gccriscv64-unknown-linux-gnu-gcc
  • 如果你在开发 RISC-V 操作系统或裸机程序(如 Bootloader、xv6
    → 用 riscv64-unknown-elf-gcc
  • 如果你不确定,但目标是在 RISC-V Linux 运行
    → 用 riscv64-linux-gnu-gcc

能不能在wsl下使用?

riscv64-linux-gnu-gcc

请添加图片描述

情况:可以编译成功但是无法执行

这个gcc最终编译的二进制文件针对的是RISCV架构,所以无法在一般的x86-64架构上直接执行。而xv6-riscv是通过qemu模拟riscv硬件才能够执行

riscv64-unknown-elf-gcc

请添加图片描述

情况:连编译都编译不过去了

riscv64-unknown-elf-gcc 针对的是裸机环境,那么包没有 <stdoi.h> 的。所以确实无法编译

riscv64-unknown-linux-gnu-gcc

没下……

配置环境项讲解

MIT的 apt-get install 命令安装了以下几个关键的软件包,主要用于在 WSL2 的 Ubuntu 22.04 上配置 xv6(一个 RISC-V 架构的类 Unix 操作系统)的开发和调试环境。


1. git

  • 作用:Git 版本控制系统,用于下载 xv6 源码,并进行代码管理(如克隆、提交和更新)。
  • xv6 相关性:从 GitHub 上克隆 xv6 源代码,例如:
    git clone https://github.com/mit-pdos/xv6-riscv.git
    

2. build-essential

  • 作用:提供了一组基本的编译工具,包括 gccg++make 等。
  • xv6 相关性
    • xv6 使用 make 进行编译,依赖 gcc 进行 C 语言编译。
    • build-essential 里包含 make,而 xv6 的 Makefile 需要 make 来组织编译流程。

3. gdb-multiarch

  • 作用:支持多架构的 GNU 调试器(GDB),可用于调试不同 CPU 指令集(如 x86、ARM、RISC-V 等)的程序。
  • xv6 相关性
    • xv6 运行在 RISC-V 上,因此需要一个支持 RISC-V 的 GDB 进行调试。
    • 可以用它远程调试 QEMU 模拟器运行的 xv6:
      gdb-multiarch
      (gdb) target remote localhost:1234
      

4. qemu-system-misc

  • 作用:QEMU 是一个通用的CPU 模拟器,qemu-system-misc 包含对多个架构的 QEMU 模拟支持。
  • xv6 相关性
    • xv6 需要 QEMU 来模拟 RISC-V 硬件环境
    • 通常用如下命令运行 xv6:
      make qemu
      

5. gcc-riscv64-linux-gnu

  • 作用:RISC-V 交叉编译器,可以编译 RISC-V 目标平台的代码
  • xv6 相关性
    • xv6 运行在 RISC-V 上,而你的开发环境是 x86_64,因此需要交叉编译器编译 RISC-V 代码。
    • 可以用它手动编译 xv6 代码:
      riscv64-linux-gnu-gcc -o hello hello.c
      

6. binutils-riscv64-linux-gnu

  • 作用:RISC-V 目标平台的 GNU binutils 工具集,包括 as(汇编器)、ld(链接器)等。
  • xv6 相关性
    • xv6 需要 as 来编译汇编代码。
    • ld 用于链接最终的 xv6 可执行文件。

总结

软件包 作用 在 xv6 中的用途
git 版本控制 克隆 xv6 源码
build-essential C/C++ 编译工具 编译 xv6
gdb-multiarch 多架构调试 调试 xv6
qemu-system-misc CPU 模拟器 运行 xv6
gcc-riscv64-linux-gnu 交叉编译 编译 RISC-V 代码
binutils-riscv64-linux-gnu 汇编/链接工具 处理 RISC-V 汇编和链接

自己安装的qemu和apt安装的有什么区别

1. 版本差异

apt 安装:Ubuntu 官方软件源提供的 QEMU 可能是稳定版,但版本较老/或太新,可能缺少一些新功能或优化。
自己编译:可以选择最新的源码,获取最新功能、修复的 bug 和性能优化。

2. 编译选项

apt 安装:使用的是 Ubuntu 维护者编译的二进制文件,默认开启了一些常见的功能,但可能未启用所有选项。
自己编译:可以根据需求启用或禁用特定功能,例如:

  • 仅编译支持特定架构(如 --target-list=riscv64-softmmu
  • 选择特定的加速选项(如 --enable-kvm--enable-tcg
  • 进行特定优化(如 --enable-lto 进行链接时优化)

3. 安装路径

apt 安装:QEMU 会被安装到系统路径(如 /usr/bin/qemu-system-*
自己编译
默认安装在 ·/usr/local/bin·,不会影响系统自带的 QEMU
可以自定义安装路径(如 ./configure --prefix=/opt/qemu
安装路径在 configure 之后的报告里有,如果保存了源代码build文件夹还可以执行 sudo make uninstall 进行卸载

4. 依赖管理

apt 安装:自动处理依赖关系,安装/卸载时不容易出问题。
自己编译:需要手动安装依赖(如 libglib2.0-dev、libpixman-1-dev),可能会遇到缺少库或不兼容的问题。

5. 更新与维护

apt 安装:系统更新时可以自动升级(sudo apt upgrade)。
自己编译:需要手动拉取源码并重新编译安装,维护成本更高。

6. 兼容性

apt 安装:官方软件源提供的版本经过测试,与 Ubuntu 其他软件兼容性较好。
自己编译:如果使用了非官方补丁或特定配置,可能会遇到不兼容问题,例如影响 gdb、libvirt、kvm 相关组件的使用。