# 方案设计文档——RustOS

2018.04.12

王润基 朱书聪

## 选题概述

Rust是一门新兴的系统级编程语言。它引入了全新的内存管理模型，在无GC的环境下解决了C/C++中长期存在的内存安全问题。同时，它也支持不安全的底层操作，能和C语言方便交互。另一方面，它提供高级别的零开销抽象，拥有现代语言特性，能够胜任编写复杂逻辑。这些特性使得Rust非常适合编写OS。

因此我们的基础目标是和其它小组合作，将ucore用Rust重写，使之更加安全和模块化。

为了充分发挥Rust的语言特性，我们还希望OS支持对称多处理器（SMP）。众所周知，并发编程会带来数据竞争问题，给安全和效率造成很大挑战。而Rust的内存模型能够保证线程安全，适合解决这一问题。

所以我们进一步的目标是使用Commuter对OS的并行度进行测试，然后参考sv6进行SMP优化。

## 已经完成的调研工作

### Rust for RISCV

* RISCV-Rust-Toolchain：
  * Docker：tarcieri/riscv-rust-toolchain
  * 与之配合的开发环境：riscv-crates
  * 目前无法编译，还在开发中

鉴于这套工具链刚刚诞生，非常不稳定，坑太多，因此我们不再考虑移植到RISCV。

### RustOS

* 《Writing an OS in Rust》& blog_os：
  * 从零开始写RustOS的教程，平台x86_64
  * 目前实现了Boot，页式内存管理，中断管理
  * 已经读完了全部文章，能够在本机和Docker中编译运行
* Redox：
  * 完成度最高的RustOS，微内核架构，平台x86_64
  * 有GUI，有自己的FS，有用户程序开发环境
  * 正在阅读kernel代码，已经在Docker中完成编译

### 待移植/参考OS

* xv6：ucore的起源项目，非常精简，但支持SMP。用来理解OS的整体运行机制。
* xv6 x86_64：对比与xv6的不同，参考其x86_64的实现。
* ucore_os_lab：待移植的主体。
* ucore_plus：参考其x86_64的实现。
* sv6：参考其多核优化的实现。

### Rust与编写OS相关的平台特性

* 库：
  * Rust提供标准库std和核心库core，core包含于std
  * 写OS不能使用std，可以使用core，需用xargo代替cargo编译
  * core提供了最基础的语言特性支持，字符串格式化输出等基础函数，只需指定全局内存分配器，即可享用Vec/Box等大量内置数据结构
* 内联汇编：
  * 格式类似C语言
  * x86(_64)已经有封装好的库，无需手动编写
* Rust-C互操作：
  * C语言绑定：
    * bindgen工具：自动生成C模块的Rust接口
      * 默认依赖std库，但似乎可以手动替换类型去掉依赖
      * 已经尝试完成了对xv6的绑定
    * 直接导入符号
      * 写一个`build.rs`在build时同时编译C代码并链接
      * 已经写了一个样例集成到项目中了
  * C对Rust的绑定：
    * 通过简单的`extern "C"`+`no_mangle`即可完成
  * C直接生成Rust：Corrode
    * 在macOS上尝试构建失败
  * Port C to Rust 经验谈：
    * https://github.com/carols10cents/rust-out-your-c-talk
* 测试：
  * 对于使用std的项目，可以快速通过`cargo test`进行单元测试，`cargo bench`进行性能测试
  * 由于OS运行在qemu环境中，因此无法使用这个测试框架
  * 但可以运行集成测试（类似ucore），目前已经在Travis上配置完毕
  * 另一方面，可以把不依赖OS环境的模块提取成crate，就可以测试了
    * 例如Redox kernel就把stub_allocator和syscall模块提取出来
* 坑：
  * 除了经常过不了编译以外，还没遇到大坑。Rust大法好。

## 已经完成的编码工作

* 准备开发环境

  根据对RustOS的调研情况，我们计划直接在blog_os的基础上进行开发。目前已经配置好了本地环境，Docker，Travis。

* 熟悉Rust语言和生态特性

  实现了C语言绑定，在线集成测试。

  已经完成了一些OS底层驱动的移植（VGA，Serial，ACPI）。

## 接下来需要做的工作

### 综述

blog_os只实现了页式内存管理和中断，提供了一个RustOS的基础框架。在此基础上，针对ucore的每个lab，还需补全以下内容：

* **lab1：**

  * 修改虚拟地址的映射，使之与ucore匹配。
  * 补全底层驱动（键盘、串口、APIC），重点是能产生时钟中断。
    * 这部分大都是直接操作内存，可以直接链接C代码，以尽快跑起来，之后再用Rust重写。

* lab2/3：内存管理

  * 物理内存分配器目前只分配不回收，需要完善
  * 页式内存管理没有实现替换机制，需要实现

  *注：由于只是要完善，不影响后面的工作*

* **lab4/5/6：进程管理**

  * 进程管理和调度需要重新设计、整体移植

* lab7：同步互斥

  * 基本的同步机制Rust标准库已经提供

* **lab8：文件系统**

  * 对底层依赖不大，可以独立出去完成（参考Redox的FS）

支持SMP主要依赖进程管理模块，文件系统部分委托合作小组完成。

### 分工

* 王润基：主要负责前期ucore移植
* 朱书聪：主要负责后期SMP优化

### 计划

* Week7：完成底层硬件的移植，能跑lab1
* Week8：完善物理/虚拟内存管理，能跑lab2/3
* Week9：移植内核线程、用户进程、调度，能跑lab4/5/6
* Week10：支持SMP，配置Commuter生成代码
* Week11：SMP优化
* Week12：SMP优化
* Week13：SMP优化