intfork(void){inti,pid;structproc*np;structproc*p=myproc();// ...省略...// 从父进程复制用户内存到子进程if(uvmcopy(p->pagetable,np->pagetable,p->sz)<0){// 失败情况freeproc(np);release(&np->lock);return-1;}// 子进程的内存大小=父进程的内存大小np->sz=p->sz;// ...省略.....
intuvmcopy(pagetable_told,pagetable_tnew,uint64sz){pte_t*pte;uint64i,mask;uint64pte_flags;// sz是字节大小,页表是以PGSIZE为单位的for(i=0;i<sz;i+=PGSIZE){// 在sz以内的PTE应该都是映射过的,因此如果pte是0,表示没有映射,直接panicif((pte=walk(old,i,0))==0)panic("uvmcopy: pte sh...
Implement copy-on-write fork(困难) 在xv6中,我们实现一个copy-on-write fork. 修改uvmcopy uvmcopy函数主要是将父进程的用户空间拷贝到子进程的用户空间.我们需要修改这个函数,只是将子进程指向父进程的相同的物理页面,并将子进程和父进程的PTE设置为仅近包含可读权限(PTE_R)和记录这个PTE之前是否可写权限. int...
代码在github上。总体来说如果理解了COW机制的话,这个实验的完成也没有很复杂。 这一个实验是要完成COW(copy on write)fork。在原始的XV6中,fork函数是通过直接对进程的地址空间完整地复制一份来实现的。但是,拷贝整个地址空间是十分耗时的,并且在很多情况下,程序立
xv6实验指导说明要求实现copy-on write(hard)的实验内容,不直接使用kalloc进行内存分配,而是通过修改页表的PTE(Page Table Entry)flag位来实现。实验思路分为几个关键步骤。在uvmcopy中,可以看到已有代码分配新页面并映射新页表。这里遵循实验指导,不分配kalloc,而是设置PTE的flag位,主要设置两个关键...
目录 前言 1. xv6 hello world 程序 2. 调度时间片的修改 3. 信号量 4. slab 内核内存管理 5. copy on write 总结 前言 这绝对是我做过的最难的实验没有之一,好吧主要是自己菜,还好有助教师兄帮我,不然我到入土火化的那一天,我都玩不明白这个 xv 6 系统。。。 言归正传,什么是 xv 6 呢?一个 mi...
本篇博客是 6.S081课程的第五次Lab:Copy-on-Write Fork for xv6 的分析,这次Lab我认为还是比较有难度的,内容是实现fork时的写时复制,我们都知道fork系统调用创建一个新的子进程,这个子进程是父进程的复制,其地址空间和父进程完全一致,这意味着需要在fork时将父进程的页表复制一份,且将有效页表项指向的物理内存...
相信肯定有人会觉得在调用fork()中马上调用exec()是一种资源的浪费,因为子进程复制父进程的内存的内容就没意义了,这是 xv6 设计上的短板。所以在真实 OS 上,有人设计出来了COW(copy-on-write) fork函数。这个函数的机制是这样的: 首先创建子进程时,先不要复制全部的内存,而是将父进程的最后一级页表所有 PTE...
voidmain(){if(cpuid()==0){consoleinit();#if defined(LAB_PGTBL) || defined(LAB_LOCK)stats...
Cancel Create saved search Sign in Sign up Reseting focus {{ message }} Iuriak / OS-Xv6-Lab-2023 Public Notifications You must be signed in to change notification settings Fork 1 Star 18 同济大学操作系统课程实验 2023小学期项目 OS-XV6 18 stars ...