操作系统ucore lab3实验报告

操作系统lab3实验报告

本次实验主要完成ucore内核对虚拟内存的管理工作。其总体设计思路还是比较简单,即首先完成初始化虚拟内存管理机制,即需要设置好哪些页需要放在物理内存中,哪些页不需要放在物理内存中,而是可被换出到硬盘上,并涉及完善建立页表映射、页错误异常处理操作等函数实现。然后就执行一组访存测试,看看我们建立的页表项是否能够正确完成虚实地址映射,是否正确描述了虚拟内存页在物理内存中还是在硬盘上,是否能够正确把虚拟内存页在物理内存和硬盘之间进行传递,是否正确实现了页面替换算法等。

练习0 填写已有实验

同样与lab2类似,我使用了名为meld的一款文件比对工具,直接比对lab2lab3两个文件夹,它就能把其中不相同的部分列举出来,然后比对进行修改即可。大致截图如下:

比对修改之后,大致罗列一下有以下文件需要我们进行修改:

default_pmm.c
pmm.c
trap.c

练习0主要要让我们修改补充的就是上述四个文件。直接在meld里面对比复制就行了。也没有什么技术含量。

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

本实验要求完成 do_pgfault函数,作用给未被映射的地址映射上物理页。
具体而言,当启动分页机制以后,如果一条指令或数据的虚拟地址所对应的物理页框不在内
存中或者访问的类型有错误(比如写一个只读页或用户态程序访问内核态的数据等),就会发生
页错误异常。产生页面异常的原因主要有:

  • 目标页面不存在(页表项全为0,即该线性地址与物理地址尚未建立映射或者已经撤销);
  • 相应的物理页面不在内存中(页表项非空,但Present标志位=0,比如在swap分区或磁盘文件上)
  • 访问权限不符合(此时页表项P标志=1,比如企图写只读页面).

当出现上面情况之一,那么就会产生页面page fault(#PF)异常。产生异常的线性地址存储在
CR2中,并且将是page fault的产生类型保存在 error code 中

那么我们的这个do_pgfault函数的思路就明显了。do_pgfault()函数从CR2寄存器中获取页错误异常的虚拟地址,根据error code来查找这个虚拟地址是否在某一个VMA的地址范围内,那么就给它分配一个物理页。
这里的VMA是描述应用程序对虚拟内存“需求”的变量,如下:

    struct vma_struct {  
        // the 
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值