Skip to content

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中图所示

pic

15 对应 Store/AMO page fault

sepc 的值在 user/sh.asm 文件第2632行中可以找到对应汇编代码

    1272:	01652423          	sw	s6,8(a0)

可以看到是一个 sw 指令, 用于向内存中写入 1 个字

上述修改使得没有实际分配物理内存, 引发 page fault