linux核心執行fork時對寫時複製的設定
阿新 • • 發佈:2022-04-11
核心版本: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));
如果上面的顯示被自動換行了,可以點選程式碼右上角的全屏按鈕檢視