2021 MIT6.S081 LAB5 copy-on write COW

本文详细介绍了在MIT6.S081实验五中如何为xv6操作系统实现Copy-on-Write (COW) 策略。通过修改PTE标志,避免了fork时的内存复制,只需将父进程的物理地址映射到子进程,并在页表中设置COW标识。同时,为了避免释放仍在使用的物理页导致的父进程崩溃,引入了一个引用计数系统。在usertrap()函数中处理COW异常,并将其应用到copyout()函数,确保用户空间的安全操作。
摘要由CSDN通过智能技术生成

实验五


原网址 Lab: Copy-on-Write Fork for xv6


Implement copy-on write

  1. PTE中FLAG的第8位和第9位没用到,因此可以用来标记一个页面是不是COW的页面,额外添加一个宏定义PTE_COW

  2. uvmcopy()是fork()时将父进程的页面拷贝到子进程页面的函数,为了实现COW,取消内存拷贝,只需要将父进程的物理地址映射到子进程中即可,另外注意取消PTE_W权限,添加PTE_COW权限。如果这一步成功,用LAB3中的vmprint()函数打印出父子进程的页表,除了TRAMPOLINE,其他应该是一样的。

  3. 另外,一些物理页不应该释放,比如说在完成映射之后,子进程先退出,但父进程还在运行,此时对于子进程来说,物理页用不到了,可以释放,但是一旦释放了,父进程就会崩溃。当时在这个问题上卡了好久。因此,需要额外定义一个整形数组,记录每个物理页被引用的次数。kalloc()函数中、子进程完成对父进程物理页的映射时,增加对一个物理页面的引用,kfree()中减少对一个物理页的引用,当一个物理页的引用次数为0时,才能free。这个整形数组可能在多个源文件中用到,用到时

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值