Lab 5

删除 sbrk的原调用,并添加 lazy allocated,也就是只增长(减小) p->sz,不做立即的页面分配。

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

  if(argint(0, &n) < 0)
    return -1;
  struct proc* p = myproc();
  uint64 sz = p->sz;
  addr = p->sz;

  if(n > 0) {
    p->sz += n;
  } else if(sz + n > 0) {
    // 这种情况是 n < 0,但n + sz > 0的情况,是合法的,需要减小页面
    sz = uvmdealloc(p->pagetable, sz, sz + n);
    p->sz = sz;
  } else {
    return -1;
  }
  return addr;
}

修改usertrap()来解决 sbrk()调用页错误的情况:也就是r_scause() == 13 || 15的情况

按照错误提示来修改 xv6即可:

  • 处理这种情形:进程从sbrk()向系统调用(如readwrite)传递有效地址,但尚未分配该地址的内存。

Last updated