操作系统实验报告 lab3
目录:
本次实验主要完成ucore内核对虚拟内存的管理工作。首先完成初始化虚拟内存管理机制,即需要设置好哪些页需要放在物理内存中,哪些页不需要放在物理内存中,而是可被换出到硬盘上,并涉及完善建立页表映射、页错误异常处理操作等函数实现。最后测试编写的代码有没有达到预期的效果。整体的实验不难,但需要掌握一些数据结构之间的关系,这样对理解虚拟内存管理有很大的帮助。
练习0 填写已有实验
将实验二代码补全至实验三
在这里了仍然采用meld工具直接进行比较,截图如下
图1 文件夹对比
总共需要修改的文件有三个
default_pmm.c
pmm.c
trap.c
将代码直接从lab2
复制至lab3
,修改完之后进入下面的实验
练习1 给未被映射的地址映射上物理页
完成 do_pgfault函数,给未被映射的地址映射上物理页。设置访问权限的时候要参考所在页面的VMA权限,同时需要注意映射物理页时需要操作内存控制结构指定的页表,而不是内核页表
1 问题分析:
当启动分页机制以后,如果一条指令或数据的虚拟地址所对应的物理页不在内存中,或者访问权限不够,那么就会产生页错误异常。其具体原因有以下三点:
- 页表项全为0——虚拟地址与物理地址未建立映射关系或已被撤销。
- 物理页面不在内存中——需要进行换页机制。
- 访问权限不够——应当报错。
当出现上面情况之一,那么就会产生页面page fault(#PF)异常。产生异常的线性地址存储在
CR2中,并且将是page fault的产生类型保存在 error code 中
2 结构体分析
vma_struct
每个进程只有一个mm_struct
结构,在每个进程的task_struct
结构体中,有一个指向该进程的结构。可以说,mm_struct
结构是对整个用户空间的描述。
struct vma_struct {
// the set of vma using the same PDT
struct mm_struct *vm_mm;
uintptr_t vm_start; // start addr of vma
uintptr_t vm_end; // end addr of vma
uint32_t vm_flags; // flags of vma
//linear list link which sorted by start addr of vma
list_entry_t list_link;
};
1.vm_start和