引言¶
本章导读¶
本章中内核将实现虚拟内存机制,这注定是一趟艰难的旅程。
实践体验¶
注解
基于github classroom的开发方式
基于github classroom,可方便建立开发用的git repository,并可基于github的 codespace (在线版ubuntu +vscode)在线开发使用。整个开发环境仅仅需要一个网络浏览器。
在网络浏览器中用自己的 github id 登录 github.com
接收 第二个实验(os4)的github classroom在线邀请 ,根据提示一路选择OK即可。
完成第二步后,你的第二个实验的 github repository 会被自动建立好,点击此github repository的链接,就可看到你要完成的第一个实验了。
在你的第二个实验的网页的中上部可以看到一个醒目的 code 绿色按钮,点击后,可以进一步看到 codespace 标签和醒目的 create codesapce on main 绿色按钮。请点击这个绿色按钮,就可以进入到在线的ubuntu +vscode环境中
再按照下面的环境安装提示在vscode的 console 中安装配置开发环境:rustc,qemu等工具。注:也可在vscode的 console 中执行
make codespaces_setenv来自动安装配置开发环境(执行``sudo``需要root权限,仅需要执行一次)。在vscode的 console 中执行 make setupclassroom_test4 (该命令仅执行一次)配置githubclassroom 自动评分功能。
然后就可以基于在线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 -------------------------------------------------------------------------------