XV6运行环境搭建

本文详细介绍了如何搭建XV6操作系统的运行环境,包括拉取XV6源码,安装RISC-V版本的GCC/binutils,解决makeqemu时遇到的问题,以及安装和配置QEMU以支持RISC-V架构。通过这些步骤,读者可以成功启动并运行XV6。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


XV6源码拉取

  • 获取实验室的xv6源代码并切换到util分支
$ git clone git://g.csail.mit.edu/xv6-labs-2020
Cloning into 'xv6-labs-2020'...
...
$ cd xv6-labs-2020
$ git checkout util
Branch 'util' set up to track remote branch 'util' from 'origin'.
Switched to a new branch 'util'

相关环境准备

安装 GCC/binutils

  • 如果没有提前搭建好运行环境,执行 make qemu 就会报错。
Error: Couldn't find a riscv64 version of GCC/binutils.
  • 根据报错信息,可以知道我们需要 riscv64 版本的 binutils。使用 apt search 命令搜索相关 packages。
apt search binutils  |grep binutils-riscv64
  • 找到 3 个相关的 packages.
    • binutils-riscv64-linux-gnu
    • binutils-riscv64-linux-gnu-dbg
    • binutils-riscv64-unknown-elf
  • 使用 apt install 命令安装上面三个 packages。
sudo apt install binutils-riscv64-linux-gnu
sudo apt install binutils-riscv64-linux-gnu-dbg
sudo apt install binutils-riscv64-unknown-elf
  • 安装成功后,执行 make qemu 命令,提示如下报错。
make: riscv64-unknown-elf-gcc: Command not found
  • riscv64-unknown-elf-gcc 可以当作是 gcc,但是是 riscv64 版本的。
sudo apt install gcc-10-riscv64-linux-gnu
  • 安装之后得到 riscv64-linux-gnu-gcc-10 文件,进入 /usr/bin 目录,建立软连接。
sudo ln -s riscv64-linux-gnu-gcc-10 riscv64-unknown-elf-gcc

安装 QEMU

  • 除了 GCC/Binutils 需要安装,xv6 需要 RISC-V 版本的 QEMU运行。
  • QEMU 是开源项目,代码托管在 GitHub 上,可以直接 git clone 下载。
git clone https://github.com/qemu/qemu.git

gitee镜像下载链接: git clone https://gitee.com/mirrors/qemu

更简单快速的方法可以下载qemu源码压缩包:

  • 使用 wget 命令下载 QEMU 的源代码压缩包。你可以从 QEMU 官方网站或其他可靠的源获取适用于 RISC-V 的 QEMU 版本。下面是一个示例命令,用于下载 QEMU 5.2.0 版本的 RISC-V 源代码:
wget https://download.qemu.org/qemu-5.2.0.tar.xz
  • 下载完成后,解压源代码压缩包。使用以下命令解压刚刚下载的压缩包:
tar -xf qemu-5.2.0.tar.xz
  • 进入解压后的 QEMU 目录,执行以下命令:
cd qemu-5.2.0

  • 下载到本地后,目录为 qemu,进入该文件夹。
mkdir build && cd build
../configure --target-list=riscv64-softmmu && make
  • 编译 QEMU,需要依赖其他 packages,如果电脑上缺少,则会报错。
ERROR: Cannot find Ninja
sudo apt install ninja-build
ERROR: pkg-config binary 'pkg-config' not found
sudo apt install pkg-config
ERROR: glib-2.56 gthread-2.0 is required to compile QEMU
sudo apt install libglib2.0-dev
../meson.build:840:11: ERROR: Dependency "pixman-1" not found, tried pkgconfig
sudo apt install libpixman-1-dev
No C++ compiler available; disabling C++ specific optional code
  • 这个提示是因为缺少 C++ 编译器,因为我电脑只装了 gcc,没有安装 g++,所以安装 g++ 即可。
sudo apt install g++
  • 然后继续执行 ../configure --target-list=riscv64-softmmu && make 即可。
  • xv6 的 Makefile 中指定了 QEMU 命令的名称 QEMU = qemu-system-riscv64,会自动在 PATH 环境变量中寻找命令,因此将编译好的二进制文件 qemu-system-riscv64 (位置在 qemu/build 目录)复制到 /usr/bin 目录中。
sudo cp qemu-system-riscv64 /usr/bin/

小结

xv6 需要依赖两个工具,一个是 GCC/Binutils,一个是 QEMU。

需要注意的是,这两个工具都需要是 RISC-V 版本的,因为 xv6 是依赖 RISC-V 指令集架构的。


启动XV6

  • 进入xv6-labs-2020安装目录
  • 构建并运行xv6
$ make qemu
riscv64-unknown-elf-gcc    -c -o kernel/entry.o kernel/entry.S
riscv64-unknown-elf-gcc -Wall -Werror -O -fno-omit-frame-pointer -ggdb -DSOL_UTIL -MD -mcmodel=medany -ffreestanding -fno-common -nostdlib -mno-relax -I. -fno-stack-protector -fno-pie -no-pie   -c -o kernel/start.o kernel/start.c
...  
riscv64-unknown-elf-ld -z max-page-size=4096 -N -e main -Ttext 0 -o user/_zombie user/zombie.o user/ulib.o user/usys.o user/printf.o user/umalloc.o
riscv64-unknown-elf-objdump -S user/_zombie > user/zombie.asm
riscv64-unknown-elf-objdump -t user/_zombie | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > user/zombie.sym
mkfs/mkfs fs.img README  user/xargstest.sh user/_cat user/_echo user/_forktest user/_grep user/_init user/_kill user/_ln user/_ls user/_mkdir user/_rm user/_sh user/_stressfs user/_usertests user/_grind user/_wc user/_zombie 
nmeta 46 (boot, super, log blocks 30 inode blocks 13, bitmap blocks 1) blocks 954 total 1000
balloc: first 591 blocks have been allocated
balloc: write bitmap block at sector 45
qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 3 -nographic -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0

xv6 kernel is booting

hart 2 starting
hart 1 starting
init: starting sh
$
  • 如果你在提示符下输入 ls,你会看到类似如下的输出:
$ ls
.              1 1 1024
..             1 1 1024
README         2 2 2059
xargstest.sh   2 3 93
cat            2 4 24256
echo           2 5 23080
forktest       2 6 13272
grep           2 7 27560
init           2 8 23816
kill           2 9 23024
ln             2 10 22880
ls             2 11 26448
mkdir          2 12 23176
rm             2 13 23160
sh             2 14 41976
stressfs       2 15 24016
usertests      2 16 148456
grind          2 17 38144
wc             2 18 25344
zombie         2 19 22408
console        3 20 0

这些是mkfs在初始文件系统中包含的文件;大多数是可以运行的程序。你刚刚跑了其中一个:ls。

xv6没有ps命令,但是如果您键入Ctrl-p,内核将打印每个进程的信息。如果现在尝试,您将看到两行:一行用于init,另一行用于sh。

退出 qemu : Ctrl-a x


参考

[xv6] xv6 的运行环境搭建

xv6中译教材

Linux云计算底层技术之一文读懂 Qemu 模拟器

MIT 6.S081 2020 操作系统 [中英文字幕]

### 如何在 Ubuntu 上搭建 xv6 开发环境 #### 准备工作 为了确保顺利搭建 xv6 环境,在开始之前需确认已安装并配置好必要的软件包。对于日常使用的 Linux 发行版,特别是基于 Debian 或 Ubuntu 的发行版,建议更换国内镜像源以加速下载速度[^4]。 #### 安装依赖项 更新 APT 源列表后,通过如下命令来获取构建 xv6 所必需的基础库和支持工具: ```bash sudo apt-get update && sudo apt-get upgrade -y sudo apt-get install git make gcc build-essential libncurses5-dev qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu gdb-multiarch ``` 上述指令不仅会安装 Git 和 Make 工具用于版本控制和项目管理,还会部署 RISC-V 架构下的 GCC 编译器以及 GDB 调试器等必要组件。 #### 更新编译工具链 由于默认提供的 `riscv64-linux-gnu-gcc` 版本可能较低,推荐按照特定指导完成更高版本的安装与切换操作: ```bash sudo apt install gcc-8-riscv64-linux-gnu sudo update-alternatives --install /usr/bin/riscv64-linux-gnu-gcc riscv64-linux-gnu-gcc /usr/bin/riscv64-linux-gnu-gcc-8 8 ``` 这一步骤可以有效解决因编译器版本过旧而导致的各种兼容性问题[^3]。 #### 获取并初始化 xv6 仓库 接着从 GitHub 下载最新的 xv6 内核源码,并进入对应的目录执行初始设置: ```bash git clone https://github.com/mit-pdos/xv6-riscv.git cd xv6-riscv/ make clean; make ``` 以上步骤能够帮助建立一个完整的 xv6 运行环境,包括但不限于内核编译、QEMU 配置等工作[^2]。 #### 启动 QEMU 并运行 xv6 最后利用 QEMU 来模拟硬件平台从而加载并测试刚编译好的 xv6 映像文件: ```bash qemu-system-riscv64 -machine virt -bios default -nographic -smp 4 -m 1G -kernel kernel/kernel.img -drive file/fs.img,if=none,id=x0,readonly=on -device virtio-blk-device,drive=x0 -netdev user,id=n0 -device virtio-net-device,netdev=n0 ``` 此命令将会启动一台支持多处理器架构且具备网络功能的虚拟机实例,进而允许开发者在其内部探索 xv6 的特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值