彩色科技|linux内核写时复制机制源代码解读( 四 )
主要分析相同的情况:
2282到2290 主要时对页计数的统计
2291 cache中刷新页
2292行 由vma的访问权限和新页的页描述符来构建页表项的值
2293行 设置页表项值属性为脏和可写(如果vma有可写属性 , 这个时候将页表项修改为了可写 , fork的时候修改为只读这个地方修改了回来)
2300行 将页表项原有的值清除 , 然后刷新地址发生缺页地址对应的tlb(这一行操作很重要)
2301行 将新的物理页添加到vma对应的匿名页的反向映射中
2303行 将新物理页添加到活跃或不可回收LRU链表中
2309 行将构建好的页表项值写入到页表项条目中 , 这个时候页表项修改才会生效 。
2334行 删除原来的页到虚拟页的反向映射 , 然后做了比较重要的一个操作为**atomic_add_negative(-1,2508if (!trylock_page(vmf->page)) {2509get_page(vmf->page);2510pte_unmap_unlock(vmf->pte, vmf->ptl);2511lock_page(vmf->page);2512vmf->pte = pte_offset_map_lock(vma->vm_mm, vmf->pmd,2513vmf->address,2514if (!pte_same(*vmf->pte, vmf->orig_pte)) {2515unlock_page(vmf->page);2516pte_unmap_unlock(vmf->pte, vmf->ptl);2517put_page(vmf->page);2518return 0;2519}2520put_page(vmf->page);2521}2522if (reuse_swap_page(vmf->page,2532}2533unlock_page(vmf->page);2534wp_page_reuse(vmf);2535return VM_FAULT_WRITE;2536}2537unlock_page(vmf->page);2538} else if (unlikely((vma->vm_flags2541}2506行 对于匿名页面且非KSM页
2522行 判断是否这个页面只被我所拥有(total_map_swapcount <= 0)
2534 调用wp_page_reuse处理(这是重点)
2195 /*2196* Handle write page faults for pages that can be reused in the current vma2197*2198* This can happen either due to the mapping being with the VM_SHARED flag,2199* or due to us being the last reference standing to the page. In either2200* case, all we need to do here is to mark the page as writable and update2201* any related book-keeping.2202*/2203 static inline void wp_page_reuse(struct vm_fault *vmf)2204__releases(vmf->ptl)2205 {2206struct vm_area_struct *vma = vmf->vma;2207struct page *page = vmf->page;2208pte_t entry;2209/*2210|* Clear the pages cpupid information as the existing2211|* information potentially belongs to a now completely2212|* unrelated process.2213|*/2214if (page)2215page_cpupid_xchg_last(page, (1 << LAST_CPUPID_SHIFT) - 1);22162217flush_cache_page(vma, vmf->address, pte_pfn(vmf->orig_pte));2218entry = pte_mkyoung(vmf->orig_pte);2219entry = maybe_mkwrite(pte_mkdirty(entry), vma);2220if (ptep_set_access_flags(vma, vmf->address, vmf->pte, entry, 1))2221update_mmu_cache(vma, vmf->address, vmf->pte);2222pte_unmap_unlock(vmf->pte, vmf->ptl);2223 }代码中可以清晰看到:
2218行 设置页被访问
2219行 设置页表项为脏 , 如果页所在的vma是可写属性则设置页表项值为可写
2220行 将设置好的页表项值写入到页表项条目中(真正设置好了页表项) , 注意arm64中在ptep_set_access_flags刷新了页对应的tlb 。
分析到这里 , 有关COW的机制已经全部分析完 , 当然这个过程涉及到了无数的技术细节 , 在此不再一一赘述 , 后面有机会会讨论到相关的内容 。
五 , 总结我们总结一下写时复制(COW)机制的整个过程:首先发生在父进程fork子进程的时候 , 父子进程会共享(此共享并不是我们通常所说的共享映射和私有映射 , 而是通过将页映射到每个进程页表形成共享)所有的私有可写的物理页 , 并将父子进程对应的页表项修改为只读 , 当有一方试图写共享的物理页 , 由于页表项属性是只读的会发生COW缺页异常 , 缺页异常处理程序会为写操作的一方分配新的物理页 , 并将原来共享的物理页内容拷贝到新页 , 然后建立新页的页表映射关系 , 这样写操作的进程就可以继续执行 , 不会影响另一方 , 父子进程对共享的私有页面访问就分道扬镳了 , 当共享的页面最终只有一个拥有者(即是其他映射页面到自己页表的进程都发生写时复制分配了新的物理页) , 这个时候如果拥有者进程想要写这个页就会重新使用这个页而不用分配新页 。
推荐阅读
- 所持股份|万兴科技:公司控股股东、实际控制人吴太兵质押150万股
- 发布公告|数量过半!博创科技:天通股份累计减持约150万股
- 英雄科技聊数码|蔡崇信有实力买下篮网,那身价3200亿的马云,能买下几支NBA球队
- 科技前沿阵地|涨疯了!海思安防芯片遭哄抬“围剿”
- 月影浓|吴亦凡机械造型走秀 垫肩披风搭银框眼镜科技感足
- 中国历史发展过程|中国历史发展过程.中国的科技史界过去半个多世纪
- 天津|桂发祥:不再持有昆汀科技股份
- 消费|减持!天通股份:减持博创科技约32万股
- 处罚|老周侃股:吉鑫科技大股东应补偿踩雷投资者
- 华中科技大学|杯具!超本科线95分,本科有路不走,却梦幻般碰瓷,撞开专科的门
