linux内核执行fork时对写时复制的设置
内核版本:Linux-5.14
在linux内核执行fork完毕后,原先父进程中可写的区域在父子进程中都被设置为了CoW,即将pte中可写的比特清除了。
下面是调用流程:[kernel/fork.c]
sys_fork
-> kernel_clone
-> copy_process
-> copy_mm
-> dup_mm
-> dup_mmap
-> copy_page_range
-> copy_p4d_range
-> 如果时PUD巨型页:copy_huge_pud: 分别将父子的PUD页表项设置为写保护
-> pudp_set_wrprotect(src_mm, addr, src_pud);
-> set_pud_at(dst_mm, addr, dst_pud, pud_mkold(pud_wrprotect(pud)));
-> copy_pmd_range
-> 如果是PMD巨型页:copy_huge_pmd: 分别将父子的PMD页表项设置为写保护
-> pmdp_set_wrprotect(src_mm, addr, src_pmd);
-> set_pmd_at(dst_mm, addr, dst_pmd, pmd_mkold(pmd_wrprotect(pmd)));
-> copy_pte_range
-> copy_present_pte
-> 如果:is_cow_mapping(vm_flags) && pte_write(pte)
-> ptep_set_wrprotect(src_mm, addr, src_pte);
-> set_pte_at(dst_vma->vm_mm, addr, dst_pte, pte_wrprotect(pte));
如果上面的显示被自动换行了,可以点击代码右上角的全屏按钮查看