Linux-Kernel
fork 函式將兩個程序中的每個頁面標記為只讀?
我正在閱讀一本教科書,其中討論瞭如何
fork()
使用虛擬記憶體:噹噹前程序呼叫fork函式時,核心為新程序創建各種資料結構,並為其分配一個唯一的PID。要為新程序創建虛擬記憶體,它會創建目前程序的 mm_struct、區域結構和頁表的精確副本。它將兩個程序中的每個頁面標記為只讀,並將兩個程序中的每個區域結構標記為私有寫時複製
我不明白為什麼它需要將兩個程序中的每個頁面都標記為只讀。如果父程序中的每個頁面都是只讀的,那麼父程序將永遠無法修改一些未初始化的全域變數(在
.bss
部分中),那麼程序將如何執行呢?
如果父頁面映射是可寫的,那麼父程序所做的任何更改都將直接應用,並且由於物理頁面是共享的,它也對子程序可見。將這兩個映射設為只讀可確保任何程序所做的更改都保持私有。