# 项目整体介绍

## 背景和历史

RustOS起源于清华大学操作系统课（2018春）的大实验。立项初衷是使用Rust语言移植ucore\_os\_lab，并利用Rust语言特性进行SMP多核优化。

同时进行的还有另外两个Rust小组，目标分别是实现LKM（内核可加载模块）及面向ARM的移植（基于CS140e）。考虑到OS的高耦合性，三组开发独立进行，目前尚未合并。

经过前期调研，我们选定《[Writing an OS in Rust](https://os.phil-opp.com/second-edition/)》系列博客作为起点，它包含一个简单的x86\_64内核，支持中断，并封装好了页表。

我们发扬革命乐观主义精神制定了开发计划，之后发现（近乎从零开始）重写OS的工作量远超预期。经过约两个月的爆肝，我们仅完成了大部分ucore\_os\_lab的移植工作，多核支持完全没有开始。

在接下来的计算机系统综合实验课（2018夏）上，我们又将RustOS移植到RISCV32I平台，并在我们自己造的[FPGA CPU](https://github.com/riscv-and-rust-and-decaf/riscv32i-cpu-chisel)上正常运行。感谢[张蔚和石振兴的工作](https://ring00.github.io/bbl-ucore/)，他们留下了丰富的文档，使得移植工作只用了两周。

转眼到了操作系统专题训练课（2018秋），接下来的历史将由大家共同书写！

## 目标和哲学

以下言论均为作者个人观点，欢迎读者共同探讨改进。

#### 兼容原版uCore

大量用户程序，直接拿来用。

#### 逻辑上独立的部分，尽量分离成模块

目前内核中三大模块：内存管理、进程管理、文件系统，都已经作为独立的crate存在。致力于让使用者：实现底层支持，享用高层功能。

#### 有现成的轮子，绝不自己造

借助Rust强大的包管理系统，我们可以方便地复用别人的代码。目前OS的如下功能，均由外部库完成：x86\_64和riscv底层支持，堆分配算法，ELF解析，自旋锁，日志……

## 已做的事 和 要填的坑

* [x] 模块化内存管理，进程管理
* [x] 支持rv32
* [x] 重构x86\_64 boot流程，使用[bootloader](https://github.com/rust-osdev/bootloader)和[bootimage](https://github.com/rust-osdev/bootimage)
* [x] !! 进程和文件系统的接合（目前ls等程序尚未实现）
* [ ] !! xv6 x86\_64 用户程序测试
* [ ] ! [内核可加载模块](https://github.com/ivanium/RustOS)的合并
* [ ] ! 按OS lab顺序进行拆分
* [x] ! 多核的启动：rv32，x86\_64
* [x] ! 多核支持和优化（参考sv6）
* [x] rv64支持（依赖于Rust for RV64编译器）
* [x] 无MMU支持（如RISCV M-Mode）
* [ ] 网络驱动
* [ ] 跟踪分析工具

## 相关链接和参考资料

* [OS大实验项目Wiki](http://os.cs.tsinghua.edu.cn/oscourse/OS2018spring/projects/g11)（仅内部访问）
* [计算机系统综合实验项目Wiki](http://os.cs.tsinghua.edu.cn/oscourse/csproject2018/group05)（仅内部访问）
* [Writing an OS in Rust](https://os.phil-opp.com/second-edition/)：从头开始用Rust写x86\_64内核，非常详尽的教程，强烈建议阅读。
* [rust-osdev](https://github.com/rust-osdev)：GitHub组织，由上述博客作者牵头维护。提供诸多用Rust编写OS所需的函数库和工具链。
* [CS140e](https://web.stanford.edu/class/cs140e/)：Stanford开设的实验性OS课程，使用Rust编写OS并在树莓派3上运行。
* [Redox](https://github.com/redox-os/redox)：完成度最高的Rust OS，支持GUI。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://rcore.gitbook.io/rust-os-docs/xiang-mu-zheng-ti-jie-shao.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
