
在之前的文章中,我邀请大家和我一起旁听麻省理工学院的免费在线操作系统课程。这篇文章将详细介绍我为了在我的老旧服务器 Darkstar 上运行麻省理工学院的教学操作系统Xv6所做的准备工作。
当前版本的 Xv6 运行在RISC-V指令集上。因此,像我一样使用 Intel 架构机器的用户,需要Qemu 模拟器才能运行 Xv6。此外,由于每次我们学生修改代码后,Xv6 都需要几秒钟的重新编译时间,所以也需要RISC-V GNU 工具链。
Qemu 和 RISC-V GNU 工具链可以通过许多 Linux 发行版的软件包系统轻松安装。但我喜欢自己编译。此外,Darkstar 运行的是Slackware64-current 系统。Slackware的默认安装包里包含很多东西,但并不包含 Qemu 和 RISC-V GNU 工具链。
克姆
Darkstar 已经安装了编译好的最新版 Qemu 源代码,因为 Qemu 被用于运行虚拟机。但是,如果我们需要克隆并构建最新版 Qemu,步骤如下(参考Qemu.org ):
git clone https://gitlab.com/qemu-project/qemu.git
cd qemu
git submodule init
git submodule update --recursive
./configure
make
Qemu编译完成后,需要使用类似这样的命令进行安装:
make install
构建和安装 Qemu 需要 sudo 或 root 权限。
RISC-V GNU 工具链
安装工具链也需要 root 或 sudo 权限。编译工具链需要大量的磁盘空间来存放源代码。构建完成后,Darkstar 使用了:
root@darkstar:/usr/local/src# du -sh riscv-gnu-toolchain/
11G riscv-gnu-toolchain/
root@darkstar:/usr/local/src#
MIT和该工具链的 Github Readme 提供了软件包系统安装和 RISC-V GNU 工具链编译的分步说明。
以下是我在 Darkstar 上使用的步骤:
507 cd /usr
508 ls
509 ls -l local-revert.tgz
510 history | grep local-revert
511 tar cvzf local-revert.tgz local ## Maybe I can revert if needed. :)
512 ls -lh *rev*
513 cd local/src
514 ls
515 git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
516 cd riscv-gnu-toolchain/
517 ls
518 less README.md
519 ./configure --prefix=/usr/local
520 make -j 16
521 make install ## This step is not needed.
以下是工具链构建过程中 top(1) 的屏幕截图。Darkstar 正在运行,所有 16 个核心都在协同工作:

我还没弄明白的是,为什么不需要安装步骤:
root@darkstar:/local/src/riscv-gnu-toolchain# make install
make: Nothing to be done for 'install'.
root@darkstar:/usr/local/src/riscv-gnu-toolchain#
以下是 make 命令的部分输出。可以看到,在 make 过程中调用了 /usr/bin/ginstall:
/usr/bin/ginstall -c -m 644 ../.././riscv-gcc/gcc/wide-int.h /usr/local/lib/gcc/riscv64-unknown-elf/11.1.0/plugin/include/wide-int.h
/usr/bin/ginstall -c -m 644 ../.././riscv-gcc/gcc/xcoff.h /usr/local/lib/gcc/riscv64-unknown-elf/11.1.0/plugin/include/xcoff.h
/usr/bin/ginstall -c -m 644 ../.././riscv-gcc/gcc/xcoffout.h /usr/local/lib/gcc/riscv64-unknown-elf/11.1.0/plugin/include/xcoffout.h
/usr/bin/ginstall -c -m 644 b-header-vars /usr/local/lib/gcc/riscv64-unknown-elf/11.1.0/plugin/include/b-header-vars
make[3]: Leaving directory '/usr/local/src/riscv-gnu-toolchain/build-gcc-newlib-stage2/gcc'
make[2]: Leaving directory '/usr/local/src/riscv-gnu-toolchain/build-gcc-newlib-stage2'
make[1]: Leaving directory '/usr/local/src/riscv-gnu-toolchain/build-gcc-newlib-stage2'
mkdir -p stamps/ && touch stamps/build-gcc-newlib-stage2
乍一看,这个流程完全可以设计成无需安装步骤。但为什么呢?
我猜测可能创建了一些动态库。这些新创建的库或许根本无法测试,因为它们必须安装到使用这些库的二进制文件中预设的位置。
如果您知道为什么这里缺少通常的安装步骤,请给我一些提示。
Xv6操作系统
以下是我们以非特权用户身份在用户主目录中运行 Xv6 的设置:
495 git clone https://github.com/mit-pdos/xv6-riscv.git
496 cd xv6-riscv/
497 ls
498 cat README
499 make qemu
Xv6已经启动,准备就绪!:)
