mit6.s081 lab5 lazy allocation

本文详述了如何从sbrk()中消除内存分配,处理页故障以实现懒分配,以及在用户测试中处理特殊情况。实验涉及在trap.c中对页故障的响应,修改sys_sbrk的行为,以及在fork、exec和read/write等系统调用中处理懒分配的内存。此外,还介绍了在进程堆基址、负sbrk参数、超出堆范围的页故障、fork时的内存复制等方面的问题解决策略。
摘要由CSDN通过智能技术生成
Eliminate allocation from sbrk()

这个exercise的主要工作是从目前的sbrk()实现中删除分配内存的部分,只增加process的sz。
具体步骤为在sys_sbrk中删除growproc的调用,但sz增加n

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

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

运行后输入命令echo hi会出现错误

init: starting sh
$ echo hi
usertrap(): unexpected scause 0x000000000000000f pid=3
            sepc=0x0000000000001258 stval=0x0000000000004008
va=0x0000000000004000 pte=0x0000000000000000
panic: uvmunmap: not mapped

其中"usertrap(): …"这段信息是从trap.c的trap handler中打印的,"stval=0x0…04008"说明stval这个虚拟地址导致了page fault

Lazy allocation

这个exercise的内容是修改trap.c中的内容对page fault进行处理,为之前sbrk但实际未分配物理内存的部分分配内存,这部分完成后将不会出现exercise 1中的panic信息。
page fault的判断可以通过检查r_scause()是否为13或者15来实现,在usertrap中针对page fault的情况需要对exercise 1中在sbrk删除的动作进行补充,也就是分配物理内容并建立va到pa的映射,但只针对在stack之上p->sz之下的那部分vm。除此之外,uvmunmap中针对pte对应物理页不存在的情况不应该发生panic,应该跳过正常执行。

....
void
usertrap(void)
{
....
  else 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值