Eliminate allocation from sbrk() (easy)
删除对growproc()的调用
diff --git a/kernel/sysproc.c b/kernel/sysproc.c
index e8bcda9..a410cd5 100644
--- a/kernel/sysproc.c
+++ b/kernel/sysproc.c
@@ -47,8 +47,9 @@ sys_sbrk(void)
if(argint(0, &n) < 0)
return -1;
addr = myproc()->sz;
if(growproc(n) < 0)
return -1;
myproc()->sz += n;
// if(growproc(n) < 0)
// return -1;
return addr;
}
测试
bash
init: starting sh
$ echo hi
usertrap(): unexpected scause 0x000000000000000f pid=3
sepc=0x0000000000001272 stval=0x0000000000004008
panic: uvmunmap: not mapped
scause 寄存器的值为 0x000000000000000f, 即15
在RISC-V privileged instructions中图所示
15 对应 Store/AMO page fault
sepc 的值在 user/sh.asm 文件第2632行中可以找到对应汇编代码
1272: 01652423 sw s6,8(a0)
可以看到是一个 sw 指令, 用于向内存中写入 1 个字
上述修改使得没有实际分配物理内存, 引发 page fault