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位的时候,会发生符号左移,
  • 为什么不精确?
posted @ 2022-04-02 15:45  抿了抿嘴丶  阅读(122)  评论(0编辑  收藏  举报