forked from LearningOS/template-2024a-rcore
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Alkaild_Lu
committed
Nov 9, 2024
1 parent
05036db
commit 7f388a2
Showing
1 changed file
with
65 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
|
||
# 2024-autumn-rCore-ch4 | ||
|
||
## 编程作业 | ||
|
||
**对于前一个章节的sys_task_info和sys_get_time两个函数,主要就是把虚拟地址转换为物理地址,加了一个translated_struct_ptr函数在os/src/mm/page_table.rs里,然后在os/src/syscall/process.rs里调用。** | ||
|
||
**对于mmap和unmmap主要的两个函数在os/src/task/task.rs里,** | ||
|
||
**完成了当前进程的mmap和munmap。其中mmap直接调用了当前进程的memoryset里的insert_framed_area方法。unmmap则是在memoryset里加了一个delete_framed_area方法完成的。** | ||
|
||
## 简答作业 | ||
|
||
1. #### 页表项的数据结构抽象与类型定义 | ||
|
||
![../_images/sv39-pte.png](https://learningos.cn/rCore-Camp-Guide-2024A/_images/sv39-pte.png) | ||
|
||
**上图为 SV39 分页模式下的页表项,其中 [53:10] 这 44 位是物理页号,最低的 8 位 [7:0] 则是标志位,它们的含义如下:** | ||
|
||
|
||
* **仅当 V(Valid) 位为 1 时,页表项才是合法的;** | ||
* **R/W/X 分别控制索引到这个页表项的对应虚拟页面是否允许读/写/取指;** | ||
* **U 控制索引到这个页表项的对应虚拟页面是否在 CPU 处于 U 特权级的情况下是否被允许访问;** | ||
* **G 我们不理会;** | ||
* **A(Accessed) 记录自从页表项上的这一位被清零之后,页表项的对应虚拟页面是否被访问过;** | ||
* **D(Dirty) 则记录自从页表项上的这一位被清零之后,页表项的对应虚拟页表是否被修改过。** | ||
2. **缺页** | ||
|
||
* 1. **页面缺失异常**:页表项指向的页面在交换空间(swap)中,因此需要从磁盘中加载。 | ||
2. **页面未映射异常**:访问的虚拟地址在页表中没有映射到物理内存(页表项为空)。 | ||
* **`stval` (Store Trap Value Register)**:保存导致缺页的虚拟地址。 | ||
**`scause` (Supervisor Cause Register)**:指明缺页异常的原因(例如是否因为权限或页面不存在)。 | ||
**`sepc` (Supervisor Exception Program Counter)**:保存导致异常的指令地址,便于处理完缺页后恢复执行。 | ||
* **节省内存和提高性能**:仅在实际访问页面时分配内存,减少不必要的物理内存占用。 | ||
**提高加载效率**:避免立即加载大段内存,如代码段在磁盘中的位置保存,第一次访问时才加载,从而加快程序启动速度。 | ||
**降低内存碎片**:仅按需分配,减少对内存的大块划分需求,使内存管理更有效。 | ||
* **10GB为2560000页(每页4kb),一个页表项大小为8字节,一页可包含512个条目,需要2560000/512≈5000页,20MB。(一级二级可省略)** | ||
* **在内存分配时,不立即为用户进程分配物理页,而是仅分配虚拟地址空间,设置页表项为不可访问。当页面被访问时触发缺页异常,此时才进行实际的页面分配。** | ||
* **页表项标记为无效,可能会有一个 **`swapped` 位指示页面已被换出。 | ||
3. **双页表与单页表** | ||
|
||
* **不会更换页表。** | ||
* **加一位U/S,以限制在用户模式或者内核模式可访问。** | ||
* **单页表的优势包括:** | ||
* **减少内存开销**:不需要为用户态和内核态维护两套页表。 | ||
* **性能优化**:切换上下文时不必频繁更新页表地址寄存器。 | ||
* **实现简单**:单页表设计较为直接,省去双页表间的复杂管理逻辑。 | ||
* **在双页表设计中,以下情况下需要更换页表:** | ||
* **从用户态切换到内核态时,切换为内核页表。** | ||
* **进程切换时,需要切换为新进程的用户态页表。** | ||
|
||
# **荣誉准则** | ||
|
||
**警告** | ||
|
||
**请把填写了《你的说明》的下述内容拷贝到的到实验报告中。 否则,你的提交将视作无效,本次实验的成绩将按“0”分计。** | ||
|
||
1. **在完成本次实验的过程(含此前学习的过程)中,我曾分别与 ****以下各位** 就(与本次实验相关的)以下方面做过交流,还在代码中对应的位置以注释形式记录了具体的交流对象及内容: | ||
> *《你交流的对象说明》* | ||
> | ||
2. **此外,我也参考了 ****以下资料** ,还在代码中对应的位置以注释形式记录了具体的参考来源及内容: | ||
> *《你参考的资料说明》* | ||
> | ||
3. **我独立完成了本次实验除以上方面之外的所有工作,包括代码与文档。 我清楚地知道,从以上方面获得的信息在一定程度上降低了实验难度,可能会影响起评分。** | ||
4. **我从未使用过他人的代码,不管是原封不动地复制,还是经过了某些等价转换。 我未曾也不会向他人(含此后各届同学)复制或公开我的实验代码,我有义务妥善保管好它们。 我提交至本实验的评测系统的代码,均无意于破坏或妨碍任何计算机系统的正常运转。 我清楚地知道,以上情况均为本课程纪律所禁止,若违反,对应的实验成绩将按“-100”分计。** |