第零章:实验环境配置

本节我们将完成环境配置并成功运行 rCore-Tutorial / uCore-Tutorial 。整个流程分为下面几个部分:

  • OS 环境配置

  • 开发环境配置
    • Rust 开发环境配置

    • C 开发环境配置

  • Qemu 模拟器安装

  • 试运行框架代码

如果你在环境配置中遇到了无法解决的问题,请在本节讨论区留言,我们会尽力提供帮助。

OS 环境配置

目前,实验主要支持 Ubuntu18.04/20.04 操作系统。使用 Windows10 和 macOS 的读者,可以安装一台 Ubuntu18.04 虚拟机 (如 VMware 或 VirtualBox) 或 Docker 进行实验。

Windows10 用户可以通过系统内置的 WSL2 虚拟机(请不要使用 WSL1)来安装 Ubuntu 18.04 / 20.04 。读者请自行在互联网上搜索相关安装教程,或 适用于 Linux 的 Windows 子系统安装指南 (Windows 10)

注解

Docker 开发环境

我们也提供 Docker 镜像用于熟悉 Docker 的同学使用。如果你不熟悉或者第一次听说,可以先参考 Docker 官网 进行安装。

感谢 dinghao188 和张汉东老师帮忙配置好的 Docker 开发环境,进入 Docker 开发环境之后不需要任何软件工具链的安装和配置,可以直接将 tutorial 运行起来,目前应该仅支持将 tutorial 运行在 Qemu 模拟器上。

使用方法如下(以 Ubuntu18.04 为例):

  1. 通过 su 切换到管理员账户 root

  2. rCore-Tutorial 根目录下 make docker 进入到 Docker 环境;

  3. 进入 Docker 之后,会发现当前处于根目录 / ,我们通过 cd mnt 将当前工作路径切换到 /mnt 目录;

  4. 通过 ls 可以发现 /mnt 目录下的内容和 rCore-Tutorial-v3 目录下的内容完全相同,接下来就可以在这个环境下运行 tutorial 了。例如 cd os && make run

使用 macOS 进行实验理论上也是可行的,但本章节仅介绍 Ubuntu 下的环境配置方案。

注解

经初步测试,使用 M1 芯片的 macOS 也可以运行本实验的框架,即我们的实验对平台的要求不是很高。但我们仍建议同学配置 Ubuntu 环境,以避免未知的环境问题。

开发环境配置

首先安装 Rust 版本管理器 rustup 和 Rust 包管理器 cargo,可以使用官方安装脚本:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

如果因网络问题通过命令行下载脚本失败了,可以在浏览器地址栏中输入 https://sh.rustup.rs 将脚本下载到本地运行。

或者使用字节跳动提供的镜像源:

curl --proto '=https' --tlsv1.2 -sSf https://rsproxy.cn/rustup-init.sh | sh

使用官方安装脚本时一些可能的加速安装的方式:

建议直接用字节跳动提供的安装脚本

export RUSTUP_DIST_SERVER="https://rsproxy.cn"
export RUSTUP_UPDATE_ROOT="https://rsproxy.cn/rustup"
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

安装中全程选择默认选项即可。

安装完成后,我们可以重新打开一个终端来让新设置的环境变量生效,可以手动将环境变量设置应用到当前终端, 只需输入以下命令:

source $HOME/.cargo/env

确认一下我们正确安装了 Rust 工具链:

# 这里以 nightly 为例,默认安装的应是 stable 版本
> rustc --version
rustc 1.57.0-nightly (97032a6df 2021-09-08)

最好把 Rust 包管理器 cargo 镜像地址 crates.io 也替换,来加速三方库的下载。 打开或新建 ~/.cargo/config 文件,并修改内容:

目前字节跳动提供的镜像体验真的很不错

[source.crates-io]
replace-with = 'rsproxy'

[source.rsproxy]
registry = "https://rsproxy.cn/crates.io-index"

# Optional
[registries.rsproxy]
index = "https://rsproxy.cn/crates.io-index"

[net]
git-fetch-with-cli = true

推荐 JetBrains Clion + Rust 插件或者 Visual Studio Code 搭配 rust-analyzer 和 RISC-V Support 插件进行代码阅读和开发。

注解

  • JetBrains Clion 是付费商业软件,但对于学生和教师,只要在 JetBrains 网站注册账号,可以享受一定期限(半年左右)的免费使用的福利。

  • Visual Studio Code 是开源软件。

  • 当然,采用 VIM,Emacs 等传统的编辑器也是没有问题的。

Qemu 模拟器安装

我们需要使用 Qemu 进行实验。你可以直接使用包管理工具进行安装:

apt 真的非常好用

apt install qemu

注意

在 18.04 和 20.04 中,apt 安装的版本都过老,无法使用,请参考下面的手动编译部分;

在 20.10 和 21.04 中,apt 安装的版本为 5+,应该可以使用。但系统我们并未做过测试。

下面讲解手动编译安装 Qemu。

本实验主要在 QEMU 5 上进行开发,而很多 Linux 发行版的软件包管理器默认软件源中的版本过低 (你也在上面包管理安装方法的注解中看到了),像 macOS 的又较新 (可能存在我们尚不知道的兼容性问题),因此从源码手动编译安装是非常靠谱的方法。

首先我们安装依赖包,获取 QEMU 的源代码并手动编译 (以下以 Ubuntu 系统为例,如果你使用 macOS 或其他 Linux 发行版,请参考 Linux 上使用 QEMUmacOS 上使用 QEMU):

# 有可能你使用的 Ubuntu 缺少基本的工具,如 make conf,可以先执行这一条。不过可以先尝试执行后面的,有问题再回到这一条:
sudo apt install autoconf automake autotools-dev build-essential bison flex tmux python3 curl wget

# 安装编译所需的依赖
sudo apt install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev libnfs-dev libiscsi-dev

# 下载源码
# 应该也可以换为 5.1.0 5.2.0 版本
wget https://download.qemu.org/qemu-5.0.0.tar.xz

# 解压
tar xvJf qemu-5.0.0.tar.xz

# 编译并安装 RISC-V 支持
cd qemu-5.0.0
./configure --target-list=riscv64-softmmu,riscv64-linux-user
make -j

注解

注意,上面的依赖包可能并不完全,比如在 Ubuntu 18.04 上:

  • 出现 ERROR: pkg-config binary 'pkg-config' not found 时,可以安装 pkg-config 包;

  • 出现 ERROR: glib-2.48 gthread-2.0 is required to compile QEMU 时,可以安装 libglib2.0-dev 包;

  • 出现 ERROR: pixman >= 0.21.8 not present 时,可以安装 libpixman-1-dev 包。

如果你想获得尽可能多的 QEMU 特性,可以安装这些包 (应该没有必要):

# all recommended additional packages for maximum code coverage can be installed like this
sudo apt install git-email
sudo apt install libaio-dev libbluetooth-dev libbrlapi-dev libbz2-dev
sudo apt install libcap-dev libcap-ng-dev libcurl4-gnutls-dev libgtk-3-dev
sudo apt install libibverbs-dev libjpeg8-dev libncurses5-dev libnuma-dev
sudo apt install librbd-dev librdmacm-dev
sudo apt install libsasl2-dev libsdl1.2-dev libseccomp-dev libsnappy-dev libssh2-1-dev
sudo apt install libvde-dev libvdeplug-dev libvte-2.90-dev libxen-dev liblzo2-dev
sudo apt install valgrind xfslibs-dev

之后我们可以在同目录下 sudo make install 将 QEMU 安装到 /usr/local/bin 目录下,但这样会引起冲突 (如和包管理工具安装的版本冲突)。可以考虑编辑 ~/.bashrc (或你使用的 shell 的配置文件),将编译好的 QEMU 添加到环境变量 PATH 中 (请根据你下载编译 QEMU 的位置更改下面几行的路径):

export PATH="/path/to/qemu-5.0.0:$PATH"
export PATH="/path/to/qemu-5.0.0/riscv64-softmmu:$PATH"
export PATH="/path/to/qemu-5.0.0/riscv64-linux-user:$PATH"

注解

事实上,当你编译完成后,应该可以把可执行文件 qemu-system-riscv64qemu-riscv64 从文件夹中复制出来,只添加这两个文件到环境变量中。其余文件可以删除以腾出空间。

随后即可在终端中 source ~/.bashrc 更新环境变量 PATH,或者重启一个新的终端。此时便可以确定 QEMU 的版本

qemu-system-riscv64 --version
qemu-riscv64 --version

试运行框架代码

git clone https://github.com/LearningOS/rCore-Tutorial-2021Autumn

只需在 os 目录下 make run 即可。在内核加载完毕之后,可以看到目前可用的应用程序。 usertests 打包了其中的很大一部分,我们可以运行它,只需输入在终端中输入它的名字即可。

之后,可以先按下 Ctrl+A ,再按下 X 来退出 Qemu。

注意

请务必执行 make run,这将为你安装一些上文没有提及的 Rust 包依赖。

如果卡在了

Updating git repository `https://github.com/rcore-os/riscv`

请通过更换 hosts 等方式解决科学上网问题,或者将 riscv 项目下载到本地,并修改 os/Cargo.toml 中的 riscv 包依赖路径

[dependencies]
riscv = { path = "YOUR riscv PATH", features = ["inline-asm"] }

恭喜你完成了实验环境的配置,可以开始阅读教程的正文部分了!

GDB 调试支持*

注意

使用 GDB debug 并不是必须的,你可以暂时跳过本小节。

如果你是使用 C 进行本实验,在完成相关环境配置后,你已经配置好了 gdb,不需要再看本小节。

os 目录下 make debug 可以调试我们的内核,这需要安装终端复用工具 tmux ,还需要基于 riscv64 平台的 gdb 调试器 riscv64-unknown-elf-gdb 。该调试器包含在 riscv64 gcc 工具链中,工具链的预编译版本可以在如下链接处下载:

解压后在 bin 目录下即可找到 riscv64-unknown-elf-gdb 以及另外一些常用工具 objcopy/objdump/readelf 等。

当然,你也可以使用非常方便的包管理工具!

apt 真的非常好用

apt install gcc-riscv64-unknown-elf

注解

在 18.04 中,apt 安装的版本是 7.4.0,可能会有版本过低的问题;

在 20.04 中,apt 安装的版本是 9.3.0,应该不会有问题;

在更新的 20.10 和 21.04 中,apt 安装的版本为 10 以上,应该不会有问题。