xv6 是 MIT 所做的教学用操作系统,在 cs 学生中久负盛名,本文将介绍如何如何一步一步在 centos 上编译安装 xv6

前提

  1. Linux 系统,本文使用的是 centos8、
  2. 至少 10g 的磁盘空间,编译依赖会占用较多磁盘空间
  3. 因 MIT 将 xv6 的基础架构从 x86,切换到 riscv,因此我们也需要 clone riscv 版 xv6 的代码,安装 riscv 的工具链

安装依赖

依赖目录

  1. riscv 工具链
  2. qemu
  3. xv6-riscv
  4. 其他依赖

安装 riscv 工具链

此处参考:https://blog.csdn.net/qq_35990574/article/details/110006307

安装前置依赖

yum install autoconf automake python3 libmpc-devel mpfr-devel gmp-devel gawk  bison flex texinfo patchutils gcc gcc-c++ zlib-devel expat-devel

clone 源码

git clone https://github.com/riscv/riscv-gnu-toolchain

Tip

此处因中国大陆网络原因,如此大的 git clone 很容易失败,因此采用上面博文的方案,一个一个手动下载。
几个 riscv-*子模块的 gitee 镜像地址:

Submodule 'riscv-binutils' (https://gitee.com/mirrors/riscv-binutils-gdb.git) registered for path 'riscv-binutils'
Submodule 'riscv-dejagnu' (https://gitee.com/mirrors/riscv-dejagnu.git) registered for path 'riscv-dejagnu'
Submodule 'riscv-gcc' (https://gitee.com/mirrors/riscv-gcc.git) registered for path 'riscv-gcc'
Submodule 'riscv-gdb' (https://gitee.com/mirrors/riscv-binutils-gdb.git) registered for path 'riscv-gdb'
Submodule 'riscv-glibc' (https://gitee.com/mirrors/riscv-glibc.git) registered for path 'riscv-glibc'
Submodule 'riscv-newlib' (https://gitee.com/mirrors/riscv-newlib.git) registered for path 'riscv-newlib'

一共有 7 个 submoule,先处理 riscv-**开头的几个
比如:riscv-newlib,在/…/riscv-gnu-toolchain 目录下

git clone --recursive https://gitee.com/mirrors/riscv-newlib.git
cd riscv-newlib
git reset --hard f289cef
 #//此七位数字参考github中riscv-gnu-toolchain源码中riscv-newlib后的数字

image.png
上面的 git reset 后面的 7 位代码,即为 github 仓库中,@后面的代码,自己填入
其他几个 riscv-*的模块参照此方法自行修改
PS:.riscv-binutils 与 riscv-gdb 来自于同一个仓库,且与本地要求的文件夹名称不同,需用命令指定本地名,riscv-gdb 同理。

git clone --recursive https://gitee.com/mirrors/riscv-binutils-gdb.git riscv-binutils

make

./configure --prefix=/opt/riscv
make

此处将会经历漫长的编译过程,且 cpu,内存的占用都会极大增加

测试

安装目录下的 bin 文件夹中有这些可执行文件,即代表编译成功

安装目录即前几步中的–prefix 参数

image.png

软连接

将此 bin 下的文件 软连接到/usr/bin 以便全局调用

编译安装 qemu

拉取源码

git clone https://gitlab.com/qemu-project/qemu.git
cd qemu
git submodule init
git submodule update --recursive

make

cd qemu
$ ./configure --target-list=riscv64-linux-user,riscv64-softmmu  --prefix=安装目录
make
make install

这里可能会有些报错

  1. 找不到 ninja
    1. yum -y install git automake gcc+ gcc-c++ libtool
    2. 安装 re2c
      1. git clone https://github.com/skvadrik/re2c.git re2c
      2. cd re2c
      3. mkdir -p m4
      4. ./autogen.sh && ./configure –prefix=/usr && make sudo make install
    3. 安装 ninja
      1. git clone git://github.com/ninja-build/ninja.git && cd ninja
      2. git checkout release
      3. ./configure.py –bootstrap 这里如果报 no python 则 whereis python3 后 ln -s 这个路径 到/usr/bin/python
      4. 安装完成后 软链接 ninja 可执行文件,到 /usr/bin
  2. glib-2.56 gthread-2.0 is required to compile
    1. dnf –enablerepo=powertools install libmount-devel
  3. ERROR: Dependency “pixman-1” not found, tried pkgconfig
    1. dnf install pixman-devel

测试

  1. cd 到上一步的安装目录/bin
  2. 内应有以下这些,其中 qemu-system-riscv64 最为重要

image.png

软链接

安装 xv6

拉取代码

git clone https://hub.fastgit.org/mit-pdos/xv6-riscv.git
cd xv6-riscv

编译启动

make qemu

若无错,则会成功进入 xv6
image.png
xv6 安装完成