對於"從內核空間建立進程沒有COW(寫時複製)「的理解

###關於寫時複製 父進程建立子進程以後,並非將本身的數據段、堆和棧徹底複製一份給子進程,而是將這些區域的訪問權限設置爲只讀,若是父進程或者子進程的中的任一個試圖修改這些區域,則內核將爲修改區域的那塊內存製做一個副本。在此以前,內核僅爲子進程分配虛擬地址,父子進程共享同一段物理地址。函數

可是在內核空間建立進程時沒有寫時複製。在mm/memory.c中,
copy_page_tables函數中有這樣一段代碼:this

if (this_page > LOW_MEM) {
 *from_page_table = this_page;
 this_page -= LOW_MEM;
 this_page >>= 12;
 mem_map[this_page]++;
}

LOW_MEM是1M,對於位於 1MB 如下的頁面,說明 是內核頁面,所以不須要對 mem_map[]進行設置。由於 mem_map[]僅用於管理主內存區中的頁面使用 狀況。所以,對於內核移動到任務 0 中而且調用 fork()建立任務 1 時(用於運行 init()),因爲此時複製的頁面還在內核區域,因此下面判斷中的語句不會執行。這就是在內核空間中建立進程時沒有寫時複製的緣由。code

相關文章
相關標籤/搜索