MIT6.828 Fall2018 笔记 - Homework 4: xv6 lazy page allocation

Homework: xv6 lazy page allocation

xv6的用户程序使用sbrk()系统调用向kernel请求堆内存

Part One: Eliminate allocation from sbrk()

int
sys_sbrk(void)
{
  int addr;
  int n;

  if(argint(0, &n) < 0)
    return -1;
  addr = myproc()->sz;
  myproc()->sz += n;
  // if(growproc(n) < 0)
  //  return -1;
  return addr;
}

运行:

init: starting sh
$ echo hi
pid 3 sh: trap 14 err 6 on cpu 1 eip 0x1168 addr 0x4004--kill proc
$

Part Two: Lazy allocation

先把vm.c中的mappages函数的static声明去掉,然后在trap.c中的trap函数中添加:

case T_PGFLT: {
    char* mem = kalloc();
    if (mem != 0) {
        memset(mem, 0, PGSIZE);
        extern int mappages(pde_t * pgdir, void* va, uint size, uint pa, int perm);
        if (mappages(myproc()->pgdir, (void*)PGROUNDDOWN(rcr2()), PGSIZE, V2P(mem), PTE_W | PTE_U) < 0) {
            kfree(mem);
        }
    } else {
        cprintf("trap(): kalloc out of memory\n");
    }
    break;
}

现在echo hi正常了

猜你喜欢

转载自www.cnblogs.com/zsmumu/p/12624048.html