MCPcopy Index your code
hub / github.com/YdrMaster/rCore-Tutorial-in-single-workspace

github.com/YdrMaster/rCore-Tutorial-in-single-workspace @main

Chat with this repo
repository ↗ · DeepWiki ↗ · + Follow
767 symbols 1,909 edges 114 files 207 documented · 27%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

# 模块化的 rCore-Tutorial

CI issue license

  • 只需要维护一个分支!
  • 支持 Windows 直接调试!
  • 需要安装 Rust 环境和 Windows Qemu
  • 当然 Linux 也支持,其实就是跨平台

目录

宗旨

本项目目标是实现一个存在于单独仓库、单独分支的完整操作系统教程。

“一个操作系统教程”定义为由一系列章节组成的,用于学习操作系统的文本和代码资料。用户可按照自然的顺序阅读这些章节,逐步了解操作系统的发展史和原理性的技术细节。因此,在本文的后续部分,将用户称为学生,将使用过程称为学习。

我假设学生在学习本教程前对 Rust 语言有充分的了解,因为我希望在编写时尽量使用 Rust 带来的方便,不必受受众的掣肘。

我希望,学生在学习本教程时可以专注于 Rust 和操作系统本身。因此,教程不要求用户精通操作 git,git clone 只是获取教程的手段之一,与下载 zip 或从他人处拷贝没有本质区别(当然,版本管理总是有益的);并且会尽量跨平台,为此,可能需要在构建系统中增加一些平台相关的操作。

本教程并不期望在章节设置或教学内容上有所创新,也不是为了实验任何新的内核技术,rCore-Tutorial-v3 足够优秀。本项目仅关注教程的构建过程和学生的学习体验(换句话说,如果为了这两点,修改章节设置和教学内容也可以接受)。在此基础之上,我希望尽量使用 Rust 的机制减少“构造一个操作系统”的代码量,以及使得库构建规范化、可迁移。

史书的另一种形态

rCore-Tutorial-v3 的教材部分别出心裁地为每一章取了一种古生物的名字,将操作系统的发展史和动物的演化史联系起来,为常常枯燥的教材带来了新奇的趣味。随着每个章节,学生可以了解到一个现代内核,是如何从蒙昧年代一步步发展来的。

阅读教材会带来快乐——收获知识、进步的快乐;阅读历史也会带来快乐——带入那些天才人物、风云故事的快乐。然而,一旦将教材与一部真正的史书相比,就会发现我们似乎缺了什么。从古至今、由简至繁——这是一部编年史。编年史直白、清晰,利于建立概念,然而却不利于理解一个复杂的人物。对于操作系统来说,就是不利于理解一个真正的现代内核子系统的细节。子系统的功能常常限于相关其他子系统尚不存在而无法完整介绍;而增加一个子系统时,又需要修改以前的子系统来适应新部件的功能。复杂的系统,要么不得不多次修改,要么只能放在后面的章节,这导致教程书可以是极好的入门,但却无法常读常新。

幸好,历史已经告诉我们另外的选择。编年史是历史研究的重要工具,但堪称“史家之绝唱”的还是纪传体。每次将视角聚焦到一个重要的人物,将他的经历作为线索,往往使历史更丰满。或许我们需要另一部纪传体作品,通过无序的介绍内核的各个子模块,为离开了蹒跚学步的内核研究者带来一部更有效的工具书。这样一本工具书,必然天然需要模块化——模块就是章节本身。

本项目仍然聚焦一个更好的 Tutorial。但其模块化的经验有助于另外的作品。如果有这样一个项目,可以称为 rCore-Manual,它是一本手册,供操作系统研究者随时翻阅。正如 rCore-Tutorial 不需要介绍原始的 rCore,它们是 rCore 的精神续作。

协作政策

本项目不是、也无意成为相关工作的典范。如果你:

  • 认为项目的操作非常合适,欢迎共同开发;
  • 你不喜欢某些更新,请发起讨论,或从任何提交分叉;
  • 认同项目的目标但不认同其设计,可以创建己的仓库;

因此,本项目使用 WTFPL 开源,如果你不喜欢,可以改名字或在你的分叉里直接删除它,这都是它本身支持的。

另外,本项目具有实验性。这意味着它随时可能发生设计变更、破坏性重构、移动、废弃或删除。

运行系统

  • cargo qemu --ch <n>

在 qemu 运行第 n 章的[unoptimized + debuginfo]版的操作系统。

可选参数:

  • --lab 只对 ch1 有效,执行 ch1-lab
  • --features <features> 目前只有对 ch3 有效的 为 coop
  • --release :运行 [optimized] 版内核

编译系统

  • cargo make --ch <n>

编译第 n 章的[unoptimized + debuginfo]版的操作系统。

可选参数:

  • --lab 只对 ch1 有效,执行 ch1-lab
  • --features <features> 只有对 ch3 有效的 为 coop
  • --release 生成 [optimized] 版内核

清空系统

  • 只清空第 n 章的编译生成的文件:cargo clean -p ch<n>
  • 彻底清空所有章节/工具生成物:根目录下直接 cargo clean

设计稿和报告

进度

Extension points exported contracts — how you extend this code

PageManager (Interface)
物理页管理。 [5 implementers]
kernel-vm/src/lib.rs
Manage (Interface)
Manager trait [5 implementers]
task-manage/src/manager.rs
BlockDevice (Interface)
Trait for block devices which reads and writes data in the unit of blocks [4 implementers]
easy-fs/src/block_dev.rs
IO (Interface)
(no doc) [7 implementers]
syscall/src/kernel/mod.rs
Signal (Interface)
一个信号模块需要对外暴露的接口 [3 implementers]
signal/src/lib.rs
SlotKey (Interface)
插槽选项。 [3 implementers]
kernel-context/src/foreign/mod.rs
Mutex (Interface)
Mutex trait [1 implementers]
sync/src/mutex.rs
Console (Interface)
这个接口定义了向控制台“输出”这件事。
console/src/lib.rs

Core symbols most depended-on inside this repo

a
called by 52
kernel-context/src/lib.rs
lock
called by 49
sync/src/mutex.rs
iter
called by 39
linker/src/lib.rs
current
called by 34
task-manage/src/proc_manage.rs
translate
called by 32
kernel-vm/src/space/mod.rs
exit
called by 30
syscall/src/user.rs
call
called by 29
syscall/src/kernel/mod.rs
len
called by 27
linker/src/lib.rs

Shape

Method 467
Function 170
Class 102
Interface 19
Enum 9

Languages

Rust100%

Modules by API surface

syscall/src/kernel/mod.rs52 symbols
ch8/src/main.rs45 symbols
syscall/src/user.rs35 symbols
ch7/src/main.rs33 symbols
ch6/src/main.rs29 symbols
ch5/src/main.rs27 symbols
easy-fs/src/layout.rs24 symbols
ch4/src/main.rs22 symbols
task-manage/src/thread_manager.rs20 symbols
kernel-context/src/lib.rs17 symbols
kernel-context/src/foreign/mod.rs17 symbols
signal-impl/src/signal_set.rs14 symbols

For agents

$ claude mcp add rCore-Tutorial-in-single-workspace \
  -- python -m otcore.mcp_server <graph>