引言

本章导读

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

实践体验

注解

基于github classroom的开发方式

基于github classroom,可方便建立开发用的git repository,并可基于github的 codespace (在线版ubuntu +vscode)在线开发使用。整个开发环境仅仅需要一个网络浏览器。

  1. 在网络浏览器中用自己的 github id 登录 github.com

  2. 接收 第二个实验(os4)的github classroom在线邀请 ,根据提示一路选择OK即可。

  3. 完成第二步后,你的第二个实验的 github repository 会被自动建立好,点击此github repository的链接,就可看到你要完成的第一个实验了。

  4. 在你的第二个实验的网页的中上部可以看到一个醒目的 code 绿色按钮,点击后,可以进一步看到 codespace 标签和醒目的 create codesapce on main 绿色按钮。请点击这个绿色按钮,就可以进入到在线的ubuntu +vscode环境中

  5. 再按照下面的环境安装提示在vscode的 console 中安装配置开发环境:rustc,qemu等工具。注:也可在vscode的 console 中执行 make codespaces_setenv 来自动安装配置开发环境(执行``sudo``需要root权限,仅需要执行一次)。

  6. 在vscode的 console 中执行 make setupclassroom_test4 (该命令仅执行一次)配置githubclassroom 自动评分功能。

  7. 然后就可以基于在线vscode进行开发、运行、提交等完整的实验过程了。

上述的3,4,5步不是必须的,你也可以线下本地开发。

注:如果是本地的ubuntu中建立开发环境,可在shell中执行 make ubuntu_local_setenv 来自动安装配置开发环境(执行``sudo``需要root权限,仅需要执行一次)。

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

获取本章代码:

$ git clone ``gitaddr of github-classroom-build-lab2``
$ cd ``github-classroom-build-lab2``
$ make setupclassroom_test4  //注意:这一步很重要,是用于github classroom自动评测你的工作。这一步只需在首次克隆项目仓库时执行一次,以后一般就不用执行了,除非 .github/workflows/classroom.yml发生了变化。

注解

实验名称 :实验编号

  • lab0-0 : test1

  • lab0-1:test2

  • lab1:test3

  • lab2:test4

  • lab3:test5

  • lab4:test6

  • lab5:test8

在 qemu 模拟器上运行 lab2(os4)参考框架:

$ cd os4
$ make run

lab2(os4)参考框架:

 1├── os4
 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 os4
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 -------------------------------------------------------------------------------