6.S081 Xv6 Lab 5: lazy page allocation

本文介绍了如何在Xv6操作系统中实现懒页面分配,删除sys_sbrk中的内存分配,并在缺页异常时进行延迟分配。通过修改usertrap()处理缺页错误,避免panic,并提供了测试和结果展示。
摘要由CSDN通过智能技术生成

Meaning Unknown's Head Image

Lab: xv6 lazy page allocation

https://pdos.csail.mit.edu/6.S081/2020/labs/lazy.html

新的 2020 版哦。

$ git fetch
$ git checkout lazy
$ make clean

Eliminate allocation from sbrk()

就是把 sys_sbrk 里的 growproc 调用删了,等用到的时候再去分配内存。如果是空间减小,要取消分配。

uint64
sys_sbrk(void)
{
   
  int addr;
  int n;
  struct proc *p = myproc();  //(+)

  if(argint(0, &n) < 0)
    return -1;
  addr = p->sz;  // old sz
  p->sz += n;
  if (n < 0) {
     // 空间减小: 取消分配
    uvmdealloc(p->pagetable, addr, p->sz);
  }
  return addr;
}

Lazy allocation

vm.c 里面实现惰性分配(莫忘在 defs.h 中声明函数):

#include "spinlock.h" //(+)
#include "proc.h"     //(+)

// lazy allocation memory va for proc p: handle page-fault.
// return allocated memory (pa), 0 for failed 
uint64 lazyalloc(struct proc * p, uint64 va){
   
  if(va >= p->sz || va < PGROUNDUP(p->trapframe->sp)){
   
    return 0;
  }
  char * mem;
  uint64 a = PGROUNDDOWN(va);
  mem = kalloc();
  if(mem == 0){
   
    return 0;
  }
  memset(mem, 0, PGSIZE);  
    if(mappages(p->pagetable, a, PGSIZE, (uint64
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值