实验三:虚拟内存管理
练习0:填写已有实验
参考实验二中的做法,使用meld
可以很快完成
练习1:给未被映射的地址映射上物理页
1.1 ucore虚拟内存机制
ucore的虚拟内存管理总体框架主要包含
完成初始化虚拟内存管理机制:IDE硬盘读写、缺页异常处理
设置虚拟页空间和物理页帧空间,表述不在物理内存中的“合法”虚拟页
完善建立页表映射、页访问异常处理操作等函数实现
基本构成下图中的结构
关键数据结构mm_struct
和vma_struct
定义在kern/mm/vmm.h
中,vma_struct
描述了应用程序对虚拟内存的需求,mm_struct
是一个比前者更高抽象层次的数据结构,表示包含了所有虚拟内存空间的共同属性
// the control struct for a set of vma using the same PDT
struct mm_struct {
list_entry_t mmap_list; // linear list link which sorted by start addr of vma
struct vma_struct *mmap_cache; // current accessed vma, used for speed purpose
pde_t *pgdir; // the PDT of these vma
int map_count; // the count of these vma
void *sm_priv; // the private data for swap manager
};
// the virtual continuous memory area(vma), [vm_start, vm_end),
// addr belong to a vma means vma.vm_start<= addr <vma.vm_end
struct vma_struct {
struct mm_struct *vm_mm; // the set of vma using the same PDT
uintptr_t vm_start; // start addr of vma
uintptr_t vm_end; // end addr of vma, not include the vm_end itself
uint32_t vm_flags; // flags of vma
list_entry_t list_link; // linear list link which sorted by start addr of vma
};
mmap_list
链接属于同一个页目录表的所有vma_struct
mmap_cache
指向当前正在使用的虚拟内存空间,基于局部性原理对链表查找加速pgdir
指向页目录表map_count
计数vma_struct
的个数sm_priv
指向用来记录访问情况的链表vm_mm
指向所属的mm_struct
vm_start
记录这个区域地址的起始vm_end
记录这个区域地址的结束vm_flags
标记区域属性,目前在vmm.h
中宏定义有VM_READ
、VM_WRITE
、VM_EXEC
三种标记list_link
根据地址从低到高链接了所有vma_struct
,链接的不同区域在虚拟内存空间是不相交的
1.2 Page Fault异常处理
在程序的执行过程中由于某种原因而使 CPU 无法最终访问到相应的物理内存单元,即无法完成从虚拟地址到物理地址映射时,CPU 会产生一次页访问异常,从而需要进行相应的页访问异常的中断服务例程。当相关处理完成后,页访问异常服务例程会返回到产生异常的指令处重新执行,使得应用软件可以继续正常运行下去。
具体而言,当启动分页机制以后,如果一条指令或数据的虚拟地址所对应的物理页框不在内存中或者访问的类型有错误(比如写一个只读页或用户态程序访问内核态的数据等),就会发生页访问异常。产生页访问异常的原因主要有:
- 目标页帧不存在(表现为页表项全为0,代码中的
*pdep==0
) - 相应的物理页帧不在内存中(表现为页表项非空,但是Present==0,需要进一步执行换页处理(练习3))
- 不满足访问要求(表现为Present==1,但是低权限程序访问高权限地址空间或是尝试写只允许读的页)
当出现缺页异常时,CPU会把产生异常的线性地址存储在CR2中,并且把表示一场类型的值errorCode保存在中断栈中,系统处理基本调用流程为trap->trap_dispatch->pgfault_handler->do_pgfault
,本实验的重点之一在于实现do_pgfault()
,代码如下
/* do_pgfault - interrupt handler to process the page fault execption
* @mm : the control struct for a set of vma using the same PDT
* @error_code : the error code recorded in trapframe->tf_err which is setted by x86 hardware
* @addr : the addr which causes a memory access exception, (the contents of the CR2 register)
*
* CALL GRAPH: trap--> trap_dispatch-->pgfault_handler-->do_pgfault
* The processor provi