操作系统实验三实验报告

这篇博客详细介绍了ucore操作系统实验三的内容,包括虚拟内存管理的框架,特别是Page Fault异常处理机制的实现,以及FIFO页面替换算法的补充。通过实验,作者完成了初始化虚拟内存管理、处理页访问异常以及实现FIFO算法,确保了操作系统能够有效管理内存并应对页错误。
摘要由CSDN通过智能技术生成

实验三:虚拟内存管理


练习0:填写已有实验

参考实验二中的做法,使用meld可以很快完成

http://blog.csdn.net/jasonyuchen/article/details/76424857


练习1:给未被映射的地址映射上物理页

1.1 ucore虚拟内存机制

ucore的虚拟内存管理总体框架主要包含

  • 完成初始化虚拟内存管理机制:IDE硬盘读写、缺页异常处理

  • 设置虚拟页空间和物理页帧空间,表述不在物理内存中的“合法”虚拟页

  • 完善建立页表映射、页访问异常处理操作等函数实现

基本构成下图中的结构

这里写图片描述

关键数据结构mm_structvma_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_READVM_WRITEVM_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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值