fork()之父子進程頁表權限的設置

1 fork()系統調用

fork()系統調用用來生成子進程,而現有Linux系統運行在寫時拷貝的機制下,於是fork()函數在爲子進程建立內核中各種管理結構的時候,並沒有將真實的物理資源分配給子進程,而只是將父進程的物理資源共享給子進程,比如:fork()函數會將父進程的物理內存共享給子進程,即將父進程多級頁表的內容複製到子進程新建立的多級頁表中。然而在這種機制下,對於父進程中那些原本可讀可寫的頁,一旦被共享給子進程之後,兩個進程中任何一個對該物理頁內容進行了修改,將會影響另外一個進程的正常使用,於是,內核解決此問題的方法是:在將父進程的多級頁表複製到子進程的多級頁表中時,會將之前對於父進程來說可寫的物理頁對應的頁表項,在父子進程的多級頁表中都設置爲只讀,因此,一旦兩個進程中的任何一個對某個寫保護(只讀)的物理頁發生了寫操作,就會導致pagefault,相應的內核函數會處理並識別出這種寫時拷貝機制導致的錯誤,並複製該物理頁的內容到一個新的物理頁,並將新的物理頁鏈接到發生寫操作的進程的多級頁表中,最後恢復該物理頁對應表項的寫權限,恢復進程對該物理頁的寫操作,做到進程無感知的處理。

2 處理流程圖如下

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章