MIT-6.s081-OS lab lazy: xv6 lazy page allocation

本文详细介绍了在XV6操作系统中实现懒惰页面分配的实验过程,包括修改sbrk以延迟物理内存分配,处理页表打印、消除sbrk分配、用户测试等挑战。实验涉及到页表、页故障处理、内存管理和虚拟内存等概念。
摘要由CSDN通过智能技术生成

代码:https://github.com/RedemptionC/xv6-riscv-6s081/tree/lazy

本实验要实现的是lazy allocation

很多时候,一个进程可能使用sbrk申请了大量的内存,但是其中的大部分并没有使用,造成了浪费

我们要做的是修改sbrk的实现,sbrk不分配物理内存,just remember which addresses are allocated

当进程第一次试图使用任何内存时,产生一个page fault,再让kernel分配内存,清零,映射

本实验涉及了第三章和第四章的内容,所以要看的还是挺多的

分析:因为我们没有实际分配内存(建立pte),所以用户程序访问对应地址时就会page fault,也就是一个来自用户空间的trap(异常)

根据第四章,page fault(trap)时,硬件会做这些事:

禁用中断(clear sie bit in sstatus)

把pc复制到sepc

保存当前mode到sstatus的spp bit

设置scause为trap的原因

设置模式为supervisor

把stvec的值设为pc(stvec保存trap handler的地址)

从pc执行(执行trap handler)

struct trapframe {
  /*   0 */ uint64 kernel_satp;   // kernel page table
  /*   8 */ uint64 kernel_sp;     // top of process's kernel stack
  /*  16 */ uint64 kernel_trap;   // usertrap()
  /*  24 */ uint64 epc;           // saved user program counter
  /*  32 */ uint64 kernel_hartid; // saved kernel tp

所以,page fault时,从uservec开始执行(trampoline.s),据书中所说,在进入用户空间之前,内核sscratch指向每个进程的trapframe,trapframe有空间用来保存寄存器的值,然后把一

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值