当我们实现完引用计数机制后,我们需要完成usertrap中的cowcopy操作: // defs.hintcowcheck(pagetable_t,uint64);uint64cowcopy(pagetable_t,uint64);// vm.cintcowcheck(pagetable_tpagetable,uint64va){if(va>=MAXVA)return0;pte_t*pte=walk(pagetable,va,0);if(pte==0)return0;if(((*pte)&PTE_V...
编写一个函数称为cowfault通过输入进程的页表与错误的虚拟地址便可以处理cow fork的缺页中断了。如果cowfault返回值为-1说明有非法参数,或是pte的设置错误,那么xv6会杀死对应的进程。返回值为0则是成功。 cowfault的执行流程 检测虚拟地址是否合法 通过walk获得缺页错误的虚拟地址pte,并检测pte的权限位。 生成物理地...
代码在github上。总体来说如果理解了COW机制的话,这个实验的完成也没有很复杂。 这一个实验是要完成COW(copy on write)fork。在原始的XV6中,fork函数是通过直接对进程的地址空间完整地复制一份来实现的。但是,拷贝整个地址空间是十分耗时的,并且在很多情况下,程序立
实验: Lab: COW 了解COW叉问题,一个进程调用fork后会创建与父进程相同的物理内存空间,并复制其内容,导致空间浪费。以shell程序为例,运行命令时会首先调用fork复制父进程,然后使用exec重新写入子进程的空间。COW叉通过解决普通fork的上述问题。实现惰性分配,先不创建物理页表而是进程,当进程需要使用这...
实现步骤还包括:kalloc函数将页面引用设置为1;fork时增加引用计数;kfree释放页面时检查引用计数,当大于1时减少引用计数后释放。完成引用计数机制后,用户陷阱函数中的cowcopy操作进行优化,检查页面flag是否为cow页面,执行相应的操作。在编码过程中,遇到严重问题:丢失页面。深入排查后发现逻辑错误,主要是...
21年好像没有懒分配,所以20年的lab6就成了21年的lab5 # cow实现 主要思想是增加一个标志位,一个引用标记。在中断处理时,进行懒复制,在write出错时再进行实际分配处理。 首先改uvmcopy,改原来标志位,将新的页也映射之前页的物理地址。 //kernel/riscv.h//增加cow定义definePTE_COW(1L<<8) ...
XV6学习(9)Lab cow: Copy-on-write fork 代码在github上。总体来说如果理解了COW机制的话,这个实验的完成也没有很复杂。 这一个实验是要完成COW(copy on write)fork。在原始的XV6中,fork函数是通过直接对进程的地址空间完整地复制一份来实现的。但是,拷贝整个地址空间是十分耗时的,并且在很多情况下,程序立即...
conf COW lab Oct 1, 2020 kernel implemented cow~ May 14, 2022 mkfs separate source into kernel/ user/ mkfs/ Jun 11, 2019 user Merge branch 'riscv' into cow Oct 2, 2020 .dir-locals.el Setting indent-tabs-mode nil everywhere is dangerous Sep 6, 2011 ...
首先是修改 uvcopy() 函数,在fork() 时会调用此函数进行父进程和子进程的页表复制。修改后,不再为子进程分配实际物理内存,只是将父进程的物理地址映射到子进程的虚拟地址空间中,同时设置“只读”标记,以及cow标记。 然后在子进程中,因为父子进程的共享内存页面设置为只读,当任何进程需要写这个页面时,便会触发15号...
相信肯定有人会觉得在调用fork()中马上调用exec()是一种资源的浪费,因为子进程复制父进程的内存的内容就没意义了,这是 xv6 设计上的短板。所以在真实 OS 上,有人设计出来了COW(copy-on-write) fork函数。这个函数的机制是这样的: 首先创建子进程时,先不要复制全部的内存,而是将父进程的最后一级页表所有 PTE...