有沒有一種方法可以通過MAP_PRIVATE創建寫時複製映射,寫入一些數據(即弄髒某些頁面),然後放棄我的更改,沒有使用munmap並重新映射?目標是爲給定的映射保留相同的虛擬地址(如果我取消映射&然後再次映射相同的文件,則不保證會發生),但是一次性丟棄所有COW更改。丟棄髒寫時複製頁面
我的理解是,試圖通過提示地址來重新映射空間並使用MAP_FIXED標誌可能會產生這種效果;但是我不確定我對MAP_FIXED文檔的解釋是否正確,或者如果此行爲得到保證。
要從MMAP引用(2)文檔:
If the memory region specified by addr and len overlaps pages of any existing
mapping(s), then the overlapped part of the existing mapping(s) will be
discarded.
請問在這種情況下,「放棄」意味着任何COW頁面就會被扔掉,並從相應的頁面新的讀取將發生故障,反映更改在磁盤上?
非常有趣。因此,如果我1)在一個文件上創建一個MAP_PRIVATE映射,2)將它讀入頁面緩存,3)通過寫入該私有的COW映射,玷污一些頁面,4)用MAP_FIXED標誌重新映射mmap,覆蓋地址MAP_PRIVATE映射的空間,我應該保留底層文件的「真實」數據在頁面緩存中,以及拋棄我對COW「更改」的看法。這是非常方便的行爲。 – Bryce
布賴斯,是的;我相信文件中的原始數據應該重新出現;如果您要「查看」這些位置和「讀取」,您會看到相同的數據。 – Kaz