From 2ffa2364147d7fd73a19a74b7e56fd2c5c14059e Mon Sep 17 00:00:00 2001 From: WangRunji Date: Thu, 12 Apr 2018 15:53:34 +0800 Subject: [PATCH] Add mid report --- docs/MidReport.md | 137 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 docs/MidReport.md diff --git a/docs/MidReport.md b/docs/MidReport.md new file mode 100644 index 0000000..9f5b955 --- /dev/null +++ b/docs/MidReport.md @@ -0,0 +1,137 @@ +# 方案设计文档——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优化 \ No newline at end of file