1. 程式人生 > 其它 >linux核心執行fork時對寫時複製的設定

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));

如果上面的顯示被自動換行了,可以點選程式碼右上角的全屏按鈕檢視