实验六:fork懒更新页表。 这次优化的内容是针对fork时内存复制的优化。在fork后,子进程很可能只用到了父进程中内存资源的一小部分,但是却完整地拷贝了父进程的内存,除那一小部分,剩下的资源都被浪费掉了,凭空增加了开销。 这就很不合理,我们结合提示想想应该怎么减少
修改fork函数中分配内存的代码,发现在uvmcopy函数中完成,在uvmcopy函数中删去分配内存相关的代码,修改为清除父进程内存的可写标记,设置COW标记,并将引用+1,子进程的页表指向父进程,PTE同样是不可写,修改后为: intuvmcopy(pagetable_told,pagetable_tnew, uint64 sz){pte_t*pte; uint64 pa, i; uint flags;f...
技术标签: 操作系统 xv6 copy on write 信号量 slab 目录 前言 1. xv6 hello world 程序 2. 调度时间片的修改 3. 信号量 4. slab 内核内存管理 5. copy on write 总结 前言 这绝对是我做过的最难的实验没有之一,好吧主要是自己菜,还好有助教师兄帮我,不然我到入土火化的那一天,我都玩不明白这个 xv...
需要对fork()函数进行修改,使其不对地址空间进行拷贝。而又因为fork()函数中调用vm.c中的uvmcopy()进行拷贝,因此修改uvmcopy()即可。 删除uvmcopy()函数中的kalloc函数,将子进程页表映射到父进程的物理地址,并去掉写标志位。 添加COW标识位,设置父进程的PTE_W为不可写,且为COW页。 不为...
虽然Copy-on-Write原理是很显而易见的,但是在具体实现中需要处理的细节特别多,经常会在莫名其妙的地方出现错误,再加上使用gdb调试内核本身就是一件不容易的事情,所以这个Copy-on-Write实验还是很有难度的。首…
xv6实验指导说明要求实现copy-on write(hard)的实验内容,不直接使用kalloc进行内存分配,而是通过修改页表的PTE(Page Table Entry)flag位来实现。实验思路分为几个关键步骤。在uvmcopy中,可以看到已有代码分配新页面并映射新页表。这里遵循实验指导,不分配kalloc,而是设置PTE的flag位,主要设置两个关键...
大多数操作系统对于页表的使用远比xv6要复杂;比如xv6没有满足硬盘映射到内存,写时复制(copy-on-write)fork,共享内存,懒分配页(lazily-allocated),自动拓展的栈。x86支持使用段进行地址翻译(见附录B),但是xv6只使用了一些通用技巧来实现像是proc这样每个CPU都有的变量,虽然在一个固定地址,但是却有不同的值(查看seg...
WP:(intel 80486以上的机器会有)该位是写保护位, write protection bit. 该位为1时,CPU会禁止用户特权级为0(超级用户)向read only page写入数据。可是复位的时候同意。这个标志位主要与 COW(copy on write)有关系. NE:number error 协处理器错误,为1时。启用x87协处理器的内部报告机制,假设是0,就是用PC形...
相信肯定有人会觉得在调用fork()中马上调用exec()是一种资源的浪费,因为子进程复制父进程的内存的内容就没意义了,这是 xv6 设计上的短板。所以在真实 OS 上,有人设计出来了COW(copy-on-write) fork函数。这个函数的机制是这样的: 首先创建子进程时,先不要复制全部的内存,而是将父进程的最后一级页表所有 PTE...
This repository will stop updating and migrate to the new version:xv6-labs-2020. Lab1 Utilities Lab2 Shell Lab3 Allocator Lab4 Lazy allocation Lab5 Copy on-write Lab6 Uthread and alarm Lab7 Lock Lab8 File system Lab9 mmap Lab10 network driver...