軟髒PTEs¶
軟髒位是PTE上的一個位,用於跟蹤任務寫入了哪些頁面。為了進行此跟蹤,需要
清除任務PTEs中的軟髒位。
這透過向目標任務的
/proc/PID/clear_refs檔案寫入“4”來完成。等待一段時間。
從PTEs中讀取軟髒位。
這透過從
/proc/PID/pagemap讀取來完成。64位四字中的第55位是軟髒位。如果設定,則自步驟1以來相應的PTE已被寫入。
在內部,為了進行此跟蹤,當軟髒位被清除時,PTEs中的可寫位也會被清除。因此,在此之後,當任務嘗試修改某個虛擬地址的頁面時,會發生#PF(頁錯誤),核心會在相應的PTE上設定軟髒位。
請注意,儘管在清除軟髒位後,任務的所有地址空間都被標記為只讀(r/o),但在此之後發生的#PF(頁錯誤)處理速度很快。這是因為頁面仍然對映到物理記憶體,因此核心所做的只是發現這一事實,並在PTE上同時設定可寫位和軟髒位。
雖然在大多數情況下,透過#PF(頁錯誤)來跟蹤記憶體變化已經足夠,但仍然存在一種可能丟失軟髒位的情況——一個任務取消對映之前已對映的記憶體區域,然後在完全相同的位置對映一個新的區域。當呼叫unmap時,核心會內部清除PTE值,包括軟髒位。為了通知使用者空間應用程式此類記憶體區域的更新,核心總是將新的記憶體區域(和擴充套件的區域)標記為軟髒。
此功能被檢查點-恢復專案積極使用。您可以在http://criu.org找到更多詳細資訊。
-- Pavel Emelyanov,2013年4月9日