# 在RISC-V开发板上开发自己的操作系统

## 环境搭建

* 实验平台：ubuntu
* 代码运行环境：qemu 7.0
* rust开发环境：RustRover(vim)/Clion

**Rust 开发环境配置**

首先安装 Rust 版本管理器 rustup 和 Rust 包管理器 cargo，这里我们用官方的安装脚本来安装：

```bash
curl https://sh.rustup.rs -sSf | sh
```

如果通过官方的脚本下载失败了，可以在浏览器的地址栏中输入 [https://sh.rustup.rs](https://sh.rustup.rs/) 来下载脚本，在本地运行即可。

如果官方的脚本在运行时出现了网络速度较慢的问题，可选地可以通过修改 rustup 的镜像地址（修改为中国科学技术大学的镜像服务器）来加速：

```bash
export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
curl https://sh.rustup.rs -sSf | sh
```

或者使用tuna源来加速 [参见 rustup 帮助](https://mirrors.tuna.tsinghua.edu.cn/help/rustup/)：

```bash
export RUSTUP_DIST_SERVER=https://mirrors.tuna.edu.cn/rustup
export RUSTUP_UPDATE_ROOT=https://mirrors.tuna.edu.cn/rustup/rustup
curl https://sh.rustup.rs -sSf | sh
```

或者也可以通过在运行前设置命令行中的科学上网代理来实现：

```bash
# e.g. clash 代理，请根据自身配置灵活调整下面的链接
export https_proxy=http://127.0.0.1:7890
export http_proxy=http://127.0.0.1:7890
export ftp_proxy=http://127.0.0.1:7890
```

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

```bash
source $HOME/.cargo/env
```

接下来，我们可以确认一下我们正确安装了 Rust 工具链：

```bash
rustc --version
```

可以看到当前安装的工具链的版本。

```bash
rustc 1.77.0-nightly (cb4d9a190 2024-01-30)
```

**警告**

目前用于操作系统实验开发的 rustc 编译器的版本不局限在 1.77.0 这样的数字上，你可以选择更新版本的 rustc 编译器。但注意只能用 rustc 的 nightly 类型的版本。

可通过如下命令安装 rustc 的 nightly 版本，并把该版本设置为 rustc 的缺省版本。

```
rustup install nightly
rustup default nightly
```

我们最好把软件包管理器 cargo 所用的软件包镜像地址 crates.io 也换成中国科学技术大学的镜像服务器来加速三方库的下载。我们打开（如果没有就新建） \~/.cargo/config 文件，并把内容修改为：

```
[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'ustc'
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"
```

同样，也可以使用tuna源 [参见 crates.io 帮助](https://mirrors.tuna.tsinghua.edu.cn/help/crates.io-index.git/)：

```
[source.crates-io]
replace-with = 'tuna'

[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"
```

接下来安装一些Rust相关的软件包

```
rustup target add riscv64gc-unknown-none-elf
cargo install cargo-binutils
rustup component add llvm-tools-preview
rustup component add rust-src
```

**警告**

如果你换了另外一个rustc编译器（必须是nightly版的），需要重新安装上述rustc所需软件包。

至于 Rust 开发环境，推荐RustRover或者 JetBrains Clion + Rust插件 或者 Visual Studio Code 搭配 rust-analyzer 和 RISC-V Support 插件。

**注解**

* JetBrains Clion是付费商业软件，但对于学生和教师，只要在 JetBrains 网站注册账号，可以享受一定期限（半年左右）的免费使用的福利。
* Visual Studio Code 是开源软件，不用付费就可使用。
* 当然，采用 VIM，Emacs 等传统的编辑器也是没有问题的。

### **QEMU 模拟器安装**

我们需要使用 QEMU 7.0 版本进行实验，低版本的 QEMU 可能导致框架代码不能正常运行。高版本的qemu需要更换rustsbi，后续会出文章。因此我们需要从源码手动编译安装 QEMU 模拟器软件。下面以 Ubuntu 24.04 LTS上的安装流程为例进行说明：

首先我们安装依赖包，获取 QEMU 源代码并手动编译：

```
# 安装编译所需的依赖包
sudo apt 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 pkg-config  libglib2.0-dev libpixman-1-dev libsdl2-dev \
              git tmux python3 python3-pip ninja-build
# 下载源码包
# 如果下载速度过慢可以使用我提供的百度网盘链接：https://pan.baidu.com/s/1dykndFzY73nqkPL2QXs32Q
# 提取码：jimc
wget https://download.qemu.org/qemu-7.0.0.tar.xz
# 解压
tar xvJf qemu-7.0.0.tar.xz
# 编译安装并配置 RISC-V 支持
cd qemu-7.0.0
./configure --target-list=riscv64-softmmu,riscv64-linux-user  # 如果要支持图形界面，可添加 " --enable-sdl" 参数
make -j$(nproc)
```

注意，上面的依赖包可能并不完全，比如在 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 包。

之后我们可以在同目录下 sudo make install 将 QEMU 安装到 /usr/local/bin 目录下，但这样经常会引起冲突。个人来说更习惯的做法是，编辑 \~/.bashrc 文件（如果使用的是默认的 bash 终端），在文件的末尾加入几行：

```
# 请注意，qemu-7.0.0 的父目录可以随着你的实际安装位置灵活调整
export PATH=$PATH:/path/to/qemu-7.0.0/build
```

随后即可在当前终端 source \~/.bashrc 更新系统路径，或者直接重启一个新的终端。

此时我们可以确认 QEMU 的版本：

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

<figure><img src="https://1162625277-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FztE2V8982Hhix6DGmMHJ%2Fuploads%2FdrrvQcH90N1esvpmebSt%2Fimage.png?alt=media&#x26;token=c8de5962-fd50-4e8d-ab97-08a6bbc1b920" alt=""><figcaption></figcaption></figure>

在其他缺少预编译 QEMU with RV64 软件包的Linux x86-64 环境（如openEuler操作系统）上，首先需要从 openEuler 社区维护的 QEMU 的 [riscv分支](https://gitee.com/src-openeuler/qemu/tree/riscv/) 下载 QEMU 源码，并直接通过 rpmbuild 进行构建。

**警告**

请尽量不要安装 qemu-kvm ，这可能会导致我们的框架无法正常运行。如果已经安装，可以考虑换用 Docker 。

另外，我们仅在 Qemu 7.0.0 版本上进行了测试，请尽量不要切换到其他版本。

### RISC-V k210开发板开发环境搭建

#### 安装kflash

<pre class="language-bash"><code class="lang-bash"># 安装pipx,避免使用pip安装要使用虚拟环境
sudo apt install pipx
# 安装kflash镜像刷写工具
<strong>sudo pipx install kflash
</strong></code></pre>

<figure><img src="https://1162625277-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FztE2V8982Hhix6DGmMHJ%2Fuploads%2FmYKyX0idNCLshqEM1Cpr%2Fimage.png?alt=media&#x26;token=937282de-33d0-46f2-b7aa-1c389821ce62" alt=""><figcaption></figcaption></figure>

让我们确保 kflash 的路径被添加到 PATH 中。以 root 权限运行：

```
sudo pipx ensurepath
```

<figure><img src="https://1162625277-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FztE2V8982Hhix6DGmMHJ%2Fuploads%2FT5I0Mwvrr0d62VZITnaf%2Fimage.png?alt=media&#x26;token=c90c5a5f-34bf-455f-b6d7-2aff5abd26b8" alt=""><figcaption></figcaption></figure>

每次使用kflash请使用完整路径，比如

```
sudo /root/.local/bin/kflash --version
```

<mark style="color:red;">注：请确保使用root权限安装kflash，否则后续会出错。</mark>

尝试一下烧录运行我们已经写好的一个bare mental app

{% file src="<https://1162625277-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FztE2V8982Hhix6DGmMHJ%2Fuploads%2FjbzDnlgG0bKNpve1p1vX%2FMyOs.bin?alt=media&token=1c9856a2-d0e3-49da-8711-97230747c77e>" %}

```bash
sudo /root/.local/bin/kflash -p /dev/ttyUSB0 -t MyOs.bin
```

<figure><img src="https://1162625277-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FztE2V8982Hhix6DGmMHJ%2Fuploads%2FoKXxQOagRQeIJI8MDnOe%2Fimage.png?alt=media&#x26;token=d57191b1-1873-434b-8500-ab5ed748e2ab" alt=""><figcaption></figcaption></figure>

这样就成功了，退出请按`ctrl+]`
