引言

本章导读

本章中内核将实现虚拟内存机制,这注定是一趟艰难的旅程。

实践体验

本章应用运行起来效果与上一章基本一致。

获取本章代码:

$ git clone https://github.com/LearningOS/rCore-Camp-Code-2024A.git
$ cd rCore-Camp-Code-2024A
$ git checkout ch4
$ git clone https://github.com/LearningOS/rCore-Tutorial-Test-2024A.git user

或许你之前已经克隆过了仓库,只希望从远程仓库更新,而非再克隆一次:

$ cd rCore-Camp-Code-2024A
# 你可以将 upstream 改为你喜欢的名字
$ git remote add upstream https://github.com/LearningOS/rCore-Camp-Code-2024A.git
# 更新仓库信息
$ git fetch upstream
# 查看已添加的远程仓库;应该能看到已有一个 origin 和新添加的 upstream 仓库
$ git remote -v
# 根据需求选择以下一种操作即可
# 在本地新建一个与远程仓库对应的分支:
$ git checkout -b ch4 upstream/ch4
# 本地已有分支,从远程仓库更新:
$ git checkout ch4
$ git merge upstream/ch4
# 将更新推送到自己的远程仓库
$ git push origin ch4

在 qemu 模拟器上运行本章代码:

$ cd os
$ make run

本章代码树

 1├── os
 2│   ├── ...
 3│   └── src
 4│       ├── ...
 5│       ├── config.rs(修改:新增一些内存管理的相关配置)
 6│       ├── linker.ld(修改:将跳板页引入内存布局)
 7│       ├── loader.rs(修改:仅保留获取应用数量和数据的功能)
 8│       ├── main.rs(修改)
 9│       ├── mm(新增:内存管理的 mm 子模块)
10│       │   ├── address.rs(物理/虚拟 地址/页号的 Rust 抽象)
11│       │   ├── frame_allocator.rs(物理页帧分配器)
12│       │   ├── heap_allocator.rs(内核动态内存分配器)
13│       │   ├── memory_set.rs(引入地址空间 MemorySet 及逻辑段 MemoryArea 等)
14│       │   ├── mod.rs(定义了 mm 模块初始化方法 init)
15│       │   └── page_table.rs(多级页表抽象 PageTable 以及其他内容)
16│       ├── syscall
17│       │   ├── fs.rs(修改:基于地址空间的 sys_write 实现)
18│       │   ├── mod.rs
19│       │   └── process.rs
20│       ├── task
21│       │   ├── context.rs(修改:构造一个跳转到不同位置的初始任务上下文)
22│       │   ├── mod.rs(修改,详见文档)
23│       │   ├── switch.rs
24│       │   ├── switch.S
25│       │   └── task.rs(修改,详见文档)
26│       └── trap
27│           ├── context.rs(修改:在 Trap 上下文中加入了更多内容)
28│           ├── mod.rs(修改:基于地址空间修改了 Trap 机制,详见文档)
29│           └── trap.S(修改:基于地址空间修改了 Trap 上下文保存与恢复汇编代码)
30└── user
31    ├── build.py(编译时不再使用)
32    ├── ...
33    └── src
34        ├── linker.ld(修改:将所有应用放在各自地址空间中固定的位置)
35        └── ...
36
37 cloc os
38 -------------------------------------------------------------------------------
39 Language                     files          blank        comment           code
40 -------------------------------------------------------------------------------
41 Rust                            26            138             56           1526
42 Assembly                         3              3             26             86
43 make                             1             11              4             36
44 TOML                             1              2              1             13
45 -------------------------------------------------------------------------------
46 SUM:                            31            154             87           1661
47 -------------------------------------------------------------------------------