获取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年官方文档
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年官方文档
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
配置大体流程
- 卸载原先qemu
- clone qemu官方源代码,切换到stable 7.2 version
- configure
- 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) | ✅ (glibc 或 musl ) |
- 如果你在开发 Linux 用户空间应用(如普通软件)
→ 用riscv64-linux-gnu-gcc
或riscv64-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
- 作用:提供了一组基本的编译工具,包括
gcc
、g++
、make
等。 - xv6 相关性:
- xv6 使用
make
进行编译,依赖gcc
进行 C 语言编译。 build-essential
里包含make
,而 xv6 的 Makefile 需要make
来组织编译流程。
- xv6 使用
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 需要
总结
软件包 | 作用 | 在 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 相关组件的使用。