xv6 lab5 lazy page allocation
对于page fault,xv6采取保守的方式,也就是直接killed进程。但是在Linux存在着lazy allocation,copy-on-write fork,demand paging,memory mapped files这些功能
Eliminate allocation from sbrk()
Lazy allocation
Lazytests and Usertests
对于这句话就是修改
walkaddr
函数,因为内核解引用用户态的指针时,并不会通过页表硬件来访问,也就是说不会发生缺页异常,在内核态时是通过walkaddr来访问用户页表的,因此在这里也要对缺页的情况进行处理。
其他问题
- lab5 中需要考虑sbrk把进程空间扩大后,有可能还未把所扩大的空间映射到对应的物理地址,甚至是未写入页表,因为在sys_sbrk中,当n>=0时,并没有调用growproc(这个函数本来会映射物理空间与设置页表,growproc会调用uvmalloc完成这些操作
明明sbrk并只是单纯的增加了p->sz,没有设置页表,那么为什么是进入第二个if,解答如下:walk返回的是指向三级页表的PTE的指针,所以如果
sbrk
分配的地址较小,那么heap所处的页的虚拟地址会与.text
与.data
所处在的同一个三级页表,那么walk
返回的三级页表PTE就不会是0 - 这里写的不对,
p->sz
是一个uint64,那么如果
addr
是int,在转为64位的时候,会发生符号左移, - 为什么不精确?