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