教程第二版,于 2020 年春季学期作为清华大学操作系统课程的新增可选实验,只支持 qemu-system-riscv64
的单核模式,且 syscall 支持较少。目前已经不再维护了。项目主页
教程第三版,在第二版基础上重构,在一定程度上进行了简化,让整个框架更加软工友好,特别是完善了内存的回收机制。有着比较详细的代码文档,但是也只支持 qemu-system-riscv64
的单核模式,syscall 支持较少。项目主页
本项目是正在开发中的教程第三版完善分支,同时支持 k210, qemu-system-riscv64
两个平台,底层的 SBI 实现基于RustSBI 最大程度上屏蔽了两个平台的不同。支持多核,增加了更多 syscall,且语义更加接近于传统 Unix,目前已经兼容 ucore 的大部分应用并尽可能兼容 linux-riscv64。目前的实现还有一些问题,在 k210
平台上跑的时候可能出现死循环的情况。项目主页
首先这里给出了包括 Rust/Qemu/虚拟机环境配置的相关说明,在配置完成之后,应该能够基于 Qemu 跑教程第三版的 master。
为了跑本项目,则需要一些额外的工具链:
- 当提示缺少
riscv64-unknown-elf-*
的时候,下载macOS 平台的预编译工具链或Ubuntu 平台的,安装之后添加到环境变量中。 - 当提示缺少
riscv64-linux-musl-*
,下载musl-libc 工具链,安装之后添加到环境变量中。
PC 需要通过串口与 K210 开发版通信,完成内核镜像烧写和运行时的交互。因此请确保当前 Python 环境安装了 pyserial 包且 miniterm 串口终端应当可用。
git clone https://github.com/wyfcyx/rCore-Tutorial.git
cd rCore-Tutorial
make run LOG=error
注意 LOG=<LOG_LEVEL>
表示 log 的控制级别。log 的重要程度从高到低依次为 error, warn, info, debug, trace,当设置为某个控制级别后只会打印重要程度不低于设置的控制级别的 log。正常运行的时候根据情况不同设置为 error, warn, info 之一即可,而不应设置为更低等级,否则会影响到 kernel 的行为。
内核启动起来之后需要稍等一会,等内核完成初始化之后,屏幕最下方会出现一行
>>
此时我们可以直接通过键盘输入程序的名字来运行程序。
在初始化过程中已经列出了所有的程序,以 r_
开头的是用 Rust 编写的用户程序(位于 user/rust 目录下),其他的则来自于 ucore(位于 user/ucore 目录下)。可以直接运行 r_usertests
来跑所有目前可用的测试。
我们可以先按下 Ctrl+A,再按下 X 来退出 Qemu 模拟器。
首先我们需要在 sdcard 中写入文件系统。将 microsd 卡放入读卡器中插入 PC,随后:
cd user
make sdcard SDCARD=/dev/sdb
其中 SDCARD
设置 microsd 块设备在当前 OS 中的位置,通常来说是 /dev/sdb。**注意不设置 SDCARD 的话,默认为 /dev/sdb,在写入前务必小心损坏其他磁盘!**目前这个操作在 wsl/wsl2 上似乎无法完成。
然后,在开发板断电的情况下将 microsd 插入进去。
接着我们用数据线连接 PC 和开发板并返回主目录:
make run BOARD=k210 LOG=error
运行起来之后和 Qemu 平台是一样的。我们可以通过 Ctrl+] 退出 Miniterm 串口终端。
# Prepare sdcard if you want to run on k210 platform
# Use SDCARD to configure sdcard location, it is /dev/sdb by default
cd user && make sdcard
# plug the sdcard in the k210 board and then run tutorial on k210 platform
make run BOARD=k210 LOG=error
# Run tutorial on qemu platform
make run
There are three simple user programs now, they are:
- r_hello_world;
- r_fantastic_text;
- r_notebook[user Ctrl + C to exit].
To execute a program, type its name in the shell and press enter. After it finishes, some statistics will be showed on the screen as well, which indicates that the program uses multicores.