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