2012-11-15 52 views
2

如果父級正在與另一個進程共享某些頁面,並且將父級分叉。從我所知道的孩子複製頁面表,我們將頁面設置爲只讀,並進行寫時複製。但是,如果我們寫入錯誤,這將創建共享內存頁面的副本。 Linux內核如何避免這種情況?共享內存頁面和分支

+0

爲什麼會出錯? –

回答

4

內核知道哪些內存頁面是使用共享內存操作分配的。當一個孩子分叉時,這些頁面沒有標記爲寫時複製,因此它們將在所有過程中保持共享。

這記錄在vm_area_struct數據結構中,在vm_flags成員中。其中一個標誌是VM_SHARED。毫米/ memory.c包含以下功能確定是否頁應該轉換爲COW

static inline int is_cow_mapping(vm_flags_t flags) 
{ 
     return (flags & (VM_SHARED | VM_MAYWRITE)) == VM_MAYWRITE; 
} 

如果你想看到更多的關於這個標誌的設置和使用,去Linux Cross Reference和搜索VM_SHARED。

+0

什麼時候可以閱讀內核用來存儲這些數據結構?還有哪些網頁沒有標記爲只讀? – Bruce

+0

查看更新的答案。 – Barmar

+0

謝謝@Barmar! – Bruce