You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
5.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 方案设计文档——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
* Dockertarcieri/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
* xv6ucore的起源项目非常精简但支持SMP。用来理解OS的整体运行机制。
* xv6 x86_64对比与xv6的不同参考其x86_64的实现。
* ucore_os_lab待移植的主体。
* ucore_plus参考其x86_64的实现。
* sv6参考其多核优化的实现。
### Rust与编写OS相关的平台特性
* 库:
* Rust提供标准库std和核心库corecore包含于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直接生成RustCorrode
* 在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的基础上进行开发。目前已经配置好了本地环境DockerTravis。
* 熟悉Rust语言和生态特性
实现了C语言绑定在线集成测试。
已经完成了一些OS底层驱动的移植VGASerialACPI
## 接下来需要做的工作
### 综述
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生成代码
* Week11SMP优化
* Week12SMP优化
* Week13SMP优化