泰晓科技 -- 聚焦 Linux - 追本溯源,见微知著!
网站地址:https://tinylab.org

全网首个嵌入式RISC-V Linux公开课已上线
请稍侯

在 QEMU 上运行 xv6

cola2003 创作于 2023/10/30

Author: cola2003 1952088712@qq.com Date: 2022/10/06 Revisor: Falcon falcon@tinylab.org Project: RISC-V Linux 内核剖析 Sponsor: SOPHGO Proposal: https://gitee.com/tinylab/riscv-linux/issues/I85LJT Environ: Linux Lab Disk

前言

xv6 是麻省理工学院开发的经典的教育性操作系统,适合学习操作系统原理和内核开发,它设计简洁,代码清晰,适合深入学习操作系统的内部机制。有助于理解实际操作系统的实现和原理,是学习操作系统的极佳选择。本文将带领大家搭建起 xv6 的 QEMU 实验环境,为进一步的学习与实验打下坚实的基础。

环境准备

这里需要准备的工具有:

  • RISC-V 交叉编译工具链
  • QEMU

如果确实是 Linux 新手或不喜欢无聊的安装过程,想节省这些编译各种工具的造轮子时间,更加专注于实验,可以使用我们泰晓社区的自研产品 泰晓 Linux 实验盘,在某宝检索 “泰晓 Linux” 即可选购。

制作交叉编译工具链

说明:如果采用泰晓 Linux 实验盘,该节的所有繁琐步骤可以完全省略,实验盘中的 Linux Lab 环境提供了完整的 RISC-V 交叉编译器。

笔者这里使用的环境是 Ubuntu20.04 LTS x86_64,工具链可以到 GitHub 官网下载源码然后进行编译。

git clone https://github.com/riscv-collab/riscv-gnu-toolchain.git
cd riscv-gnu-toolchain
git submodule update --init --recursive

但实际上我们并不建议这样做,因为 RISC-V 全套工具链太大了,而且因为是在 GitHub 上的缘故所以还需要翻墙,往往会卡在拉取子摸块的阶段,这些子模块包括:

  • riscv-qemu
  • riscv-newlib(100MB)
  • riscv-binutils(394MB)
  • riscv-gdb(394MB)
  • riscv-dejagnu(3MB)
  • riscv-glibc(155MB)
  • riscv-gcc (1.3GB)

为了解决这个问题,可以拉取码云上的 riscv-gnu-toolchain 镜像

git clone  https://gitee.com/mirrors/riscv-gnu-toolchain
cd riscv-gnu-toolchain

但是码云上的子模块地址仍然是 GitHub 的地址,所以要分别拉取其子摸块在码云上的镜像。

riscv-newlib:https://gitee.com/mirrors/riscv-newlib
riscv-binutils:https://gitee.com/mirrors/riscv-binutils-gdb
riscv-gdb:https://gitee.com/mirrors/riscv-binutils-gdb(riscv-gdb 和 riscv-binutils 为同一个仓库下的不同分支)
riscv-dejagnu:https://gitee.com/mirrors/riscv-dejagnu
riscv-glibc:https://gitee.com/mirrors/riscv-glibc
riscv-gcc:https://gitee.com/mirrors/riscv-gcc

进行子模块的拉取。

git clone https://gitee.com/mirrors/riscv-dejagnu
git clone -b riscv-gcc-10.2.0 https://gitee.com/mirrors/riscv-gcc
git clone -b riscv-glibc-2.29 https://gitee.com/mirrors/riscv-glibc
git clone https://gitee.com/mirrors/riscv-newlib
git clone -b riscv-binutils-2.35 https://gitee.com/mirrors/riscv-binutils-gdb  riscv-binutils
git clone -b fsf-gdb-10.1-with-sim https://gitee.com/mirrors/riscv-binutils-gdb  riscv-gdb

我们使用的是 64 位的工具,直接使用下面的命令即可默认生成 64 位的编译工具:

# 安装依赖库
sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev

# riscv64-unknown-elf-***
../configure --prefix=$RISCV
make -j4

# 安装至设定的 $RISCV 路径
make install
#所需时间较长,请耐心等待

最后在 ~/.bashrc 中添加环境变量,也可以使用 export,只是使用 export 环境变量的生效期只为当前终端。

# 在 ~/.bashrc 中添加
export RISCV=".your.path./riscv-gnu-toolchain"
export PATH=$PATH:$RISCV/bin

完成之后输入 riscv64-unknown-elf-gcc -v,若能出现类似如下的界面,则说明编译安装的工具链没有问题。

start-lab-disk

准备 QEMU

说明:如果采用泰晓 Linux 实验盘,该节的很多繁琐步骤可以完全省略,实验盘中的 Linux Lab 环境提供了完整的 RISC-V QEMU 模拟器,也可以通过一条 make qemu 轻松编译出 QEMU,详细用法可以查看 第四讲:QEMU 实验 - RISC-V Linux系统开发公开课

本次实验我们使用 qemu7.0.0,要下载 qemu-7.0.0.tar.xz,可以到 qemu 官网 上去下载,也可以使用下面的 wget 方式下载。

start-lab-disk

wget https://download.qemu.org/qemu-7.0.0.tar.xz
# 对其进行解压缩
tar -xf qemu-7.0.0.tar.xz
# 安装依赖
sudo apt-get install libglib2.0-dev ninja-build  build-essential zlib1g-dev pkg-config libglib2.0-dev  \
binutils-dev libboost-all-dev autoconf libtool libssl-dev  libpixman-1-dev libpython-dev  \
 virtualenv libmount-dev   libpixman-1-dev
# 然后按照步骤编译安装
./configure --target-list=riscv64-softmmu
make
sudo make install

准备 xv6 代码

克隆官网的代码,进入 xv6-riscv 目录,执行 make qemu

git clone https://github.com/mit-pdos/xv6-riscv.git
cd xv6-riscv && make qemu

start-lab-disk

可以看到我们已经进入 xv6 的 console 了。

使用泰晓实验盘

可以从 泰晓开源小店 选购一枚即插即跑的 Linux Lab Disk。它也叫 “泰晓 Linux 实验盘”,可以在淘宝手机 App 内搜索 “泰晓 Linux” 后购买。

泰晓 Linux 实验盘的具体使用方法见 Linux Lab Disk

按照使用方法进入之后界面如下。

start-lab-disk

双击 Linux Lab Shell 即可进入实验环境。

start-lab-disk

Linux Lab 里集成了绝大多数我们要用的工具链,具体支持的工具链参见桌面上的手册,输入 RISC-V 后使用 tab 自动补全功能,可以看到我们可以直接使用这些工具,QEMU 也是如此。

start-lab-disk

克隆 xv6 代码,进入 xv6-riscv 目录,执行 make qemu

git clone https://github.com/mit-pdos/xv6-riscv.git
cd xv6-riscv && make qemu

可以看到我们已经进入 xv6 的 console 了。

start-lab-disk

总结

本篇文章主要是带大家搭建起 xv6 的 QEMU 实验环境,并且尝试使用了我们泰晓社区的自研产品泰晓 Linux 实验盘,为我们进一步的学习打下了坚实的基础。

参考资料



Read Album:

Read Related:

Read Latest: