#language #docs #risc-v #kernel #assembly #computer #write

nightly bin+lib chyyuu/user_lib

基于 Rust/C 语言与 RISC-V 64/X86-32 的 OS 内核实验室

1 个不稳定版本

0.1.0 2020年5月11日

#85#docs

3,869 个星标 & 222 个关注者

GPL-3.0-or-later

115KB
3.5K SLoC

rCore-Tutorial-v3

rCore-Tutorial 第 3.6 版。查看 中文文档

rCore-Tutorial API 文档。查看 十个操作系统的 API 文档

如果您不了解 Rust 语言并想学习它,请访问 Rust 学习资源

官方 QQ 群号:735045051

新闻

  • 2022年6月23日:3.6.0 版本正在路上!现在我们直接在 chX 分支上更新代码,请定期检查是否有更新。

概览

此项目旨在展示如何从头开始用 Rust 编写一个在 RISC-V 平台上运行的 Unix-like OS,适合没有任何关于 计算机体系结构、汇编语言或操作系统 背景知识的 初学者

功能

  • 支持的平台:qemu-system-riscv64 模拟器或基于 Kendryte K210 SoC 的开发板,如 Maix Dock
  • 操作系统
    • 多个进程的并发,每个进程包含多个原生线程
    • 抢占式调度(循环调度算法)
    • 内核中的动态内存管理
    • 虚拟内存
    • 带有块缓存的简单文件系统
    • 用户空间中的交互式 shell
  • 只有 4K+ LoC
  • 详细的中文文档,尽管代码中缺少注释(目前尚无英文版本)

先决条件

安装Rust

查看官方指南

安装一些工具

$ rustup target add riscv64gc-unknown-none-elf
$ cargo install cargo-binutils --vers =0.3.3
$ rustup component add llvm-tools-preview
$ rustup component add rust-src

安装Qemu

在此,我们手动编译和安装Qemu 7.0.0。例如,在Ubuntu 18.04上

# install dependency packages
$ 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 git tmux python3 python3-pip
# download Qemu source code
$ wget https://download.qemu.org/qemu-7.0.0.tar.xz
# extract to qemu-7.0.0/
$ tar xvJf qemu-7.0.0.tar.xz
$ cd qemu-7.0.0
# build
$ ./configure --target-list=riscv64-softmmu,riscv64-linux-user
$ make -j$(nproc)

然后,将以下内容添加到~/.bashrc(请根据您的环境调整这些路径)

export PATH=$PATH:/home/shinbokuow/Downloads/built/qemu-7.0.0
export PATH=$PATH:/home/shinbokuow/Downloads/built/qemu-7.0.0/riscv64-softmmu
export PATH=$PATH:/home/shinbokuow/Downloads/built/qemu-7.0.0/riscv64-linux-user

最后,更新当前shell

$ source ~/.bashrc

现在我们可以检查Qemu的版本了

$ qemu-system-riscv64 --version
QEMU emulator version 7.0.0
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developers

安装RISC-V GNU嵌入式工具链(包括GDB)

根据您的平台从Sifive网站下载压缩文件(Ctrl+F 'toolchain')。

解压缩它并将根目录下'bin'目录的位置追加到$PATH

例如,我们可以检查GDB的版本

$ riscv64-unknown-elf-gdb --version
GNU gdb (SiFive GDB-Metal 10.1.0-2020.12.7) 10.1
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

安装串行工具(可选,如果您想在K210上运行)

$ pip3 install pyserial
$ sudo apt install python3-serial

运行我们的项目

Qemu

$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ make run

输出一些调试消息后,内核列出所有可用的应用程序并进入用户shell

/**** APPS ****
mpsc_sem
usertests
pipetest
forktest2
cat
initproc
race_adder_loop
threads_arg
race_adder_mutex_spin
race_adder_mutex_blocking
forktree
user_shell
huge_write
race_adder
race_adder_atomic
threads
stack_overflow
filetest_simple
forktest_simple
cmdline_args
run_pipe_test
forktest
matrix
exit
fantastic_text
sleep_simple
yield
hello_world
pipe_large_test
sleep
phil_din_mutex
**************/
Rust user shell
>> 

您可以运行任何应用程序,除了initprocuser_shell本身。要运行一个应用程序,只需输入其文件名并按回车键。推荐运行usertests,因为它可以运行多个应用程序。

Ctrl+a然后x退出Qemu。

K210

在第6章之前,您不需要SD卡

$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ make run BOARD=k210

从第6章开始,在运行内核之前,我们应该将SD卡插入PC,并手动将其文件系统镜像写入其中

$ cd rCore-Tutorial-v3/os
$ make sdcard

默认情况下,它将覆盖设备/dev/sdb,即SD卡,但您也可以提供另一个位置。例如,make sdcard SDCARD=/dev/sdc

之后,从PC上取出SD卡并将其插入K210的插槽中。将K210连接到PC,然后

$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ make run BOARD=k210

Ctrl+]从K210断开连接。

显示操作系统内核版本的运行时调试信息

ch9-log分支包含大量调试信息。您可以尝试运行rcore教程以了解操作系统内核的内部行为。

$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ git checkout ch9-log
$ make run
......
[rustsbi] RustSBI version 0.2.0-alpha.10, adapting to RISC-V SBI v0.3
.______       __    __      _______.___________.  _______..______   __
|   _  \     |  |  |  |    /       |           | /       ||   _  \ |  |
|  |_)  |    |  |  |  |   |   (----`---|  |----`|   (----`|  |_)  ||  |
|      /     |  |  |  |    \   \       |  |      \   \    |   _  < |  |
|  |\  \----.|  `--'  |.----)   |      |  |  .----)   |   |  |_)  ||  |
| _| `._____| \______/ |_______/       |__|  |_______/    |______/ |__|

[rustsbi] Implementation: RustSBI-QEMU Version 0.0.2
[rustsbi-dtb] Hart count: cluster0 with 1 cores
[rustsbi] misa: RV64ACDFIMSU
[rustsbi] mideleg: ssoft, stimer, sext (0x222)
[rustsbi] medeleg: ima, ia, bkpt, la, sa, uecall, ipage, lpage, spage (0xb1ab)
[rustsbi] pmp0: 0x10000000 ..= 0x10001fff (rw-)
[rustsbi] pmp1: 0x2000000 ..= 0x200ffff (rw-)
[rustsbi] pmp2: 0xc000000 ..= 0xc3fffff (rw-)
[rustsbi] pmp3: 0x80000000 ..= 0x8fffffff (rwx)
[rustsbi] enter supervisor 0x80200000
[KERN] rust_main() begin
[KERN] clear_bss() begin
[KERN] clear_bss() end
[KERN] mm::init() begin
[KERN] mm::init_heap() begin
[KERN] mm::init_heap() end
[KERN] mm::init_frame_allocator() begin
[KERN] mm::frame_allocator::lazy_static!FRAME_ALLOCATOR begin
......

Rustdoc

目前它只能帮助您查看代码,因为只有一小部分代码已被文档化。

您可以在os目录下使用cargo doc --no-deps --open打开os的doc html。

OS-API-DOCS

十操作系统的API文档

  1. Lib-OS API文档
  2. Batch-OS API文档
  3. MultiProg-OS API文档
  4. TimeSharing-OS API文档
  5. AddrSpace-OS API文档
  6. Process-OS API文档
  7. FileSystem-OS API文档
  8. IPC-OS API文档
  9. SyncMutex-OS API文档
  10. IODevice-OS API文档

工作中

我们的第一个版本3.6.0(第1-9章)已经发布,我们仍在对其进行工作。

  • 第9章:需要更多关于不同I/O设备的描述

以下是自3.5.0以来的更新

完成

  • 在运行不同平台上的项目之前自动清理和重新构建
  • 修复早期章节中的power系列应用程序,现在您可以在输出中找到模数
  • 使用 UPSafeCell 代替 RefCellspin::Mutex 来访问静态数据结构,并调整其 API 以防止一次借用两次(在 run_first_task 中提及 & .exclusive_access().task[0]
  • TaskContext 移入 TaskControlBlock 而不是在内核栈上原地恢复(自第3章起),消除了讨厌的 task_cx_ptr2
  • llvm_asm! 替换为 asm!
  • rcore-fs-fuse 生成的文件系统映像大小扩展到 128MiB
  • 添加一个名为 huge_write 的新测试,以评估文件系统性能(qemu~500KiB/s k210~50KiB/s)
  • 在涉及写操作的文件系统事务后,将所有块缓存刷新到磁盘
  • 在 SMP 章节之前,用 UPSafeCell 替换 spin::Mutex
  • 添加关于同步与互斥(仅限单核处理器)的新章节的代码
  • 错误修复:在 PageTable::unmap 中,我们应该调用 find_pte 而不是 find_pte_create
  • 明确:“在 find_pte 中检查第3级 PTE 的有效性,而不是在此函数外部检查” 不是一个错误
  • 第8章的代码:单核处理器上的同步
  • 交换第6章和第7章的代码
  • 在第7/8章支持信号机制(仅适用于单线程应用程序)
  • 添加 boards/ 目录并支持 rustdoc,例如,您可以使用 cargo doc --no-deps --open 来查看 crate 的文档
  • 第9章的代码:基于中断的设备驱动程序,包括 UART、块、键盘、鼠标和 GPU 设备
  • 在 GitHub 中添加 CI 自动测试和文档

待办(高优先级)

  • 审查文档,当前进度:8/9
  • 可选地使用旧的文件系统映像,而不总是重新构建映像
  • shell 功能改进(继续...)
  • 为每个非零进程退出代码提供一个独特且清晰的错误类型
  • 有效管理 mm 模块的错误处理
  • 添加更多操作系统功能,以了解操作系统概念和原则

待办(低优先级)

  • 重写实践文档并删除一些不合适的问题
  • 在 Rust 源代码级别提供流畅的调试体验
  • 使用官方工具格式化代码

Crates

我们将稍后添加它们。

依赖项

~3.5MB
~41K SLoC