
根據Bryant 和O'Hallaron 的(有點抽象的)類Linux 系統上的頁表模型,每個頁表條目(PTE) 都有一個地址字段,該字段保存三種值之一:(1) 物理地址(實際上是,虛擬頁映射到的頁號); (2) 長期儲存設備的等效位置識別碼-可以在其中找到頁面;或 (3) 0,表示未分配的頁。假設一個頁面已從長期儲存交換到主記憶體。在此帳戶中,核心將長期儲存位址(2)替換為實體位址(1)。現在假設實體記憶體中的同一頁需要被逐出,以便為其他頁換入騰出空間。謝謝。
答案1
PTE的代表虛擬的頁。正如您所說,當主記憶體中存在虛擬頁時,PTE 的位址欄位將保存實體頁幀號(PFN)。
每個身體的頁面有對應的struct page
.這有:
以下
flags
是:struct address_space *mapping;
對於頁面快取中的頁面(大多數系統上的大部分頁面),
mapping
指向存取備份頁面的檔案所需的資訊。但是,如果該頁面是匿名頁面(由交換支援的使用者空間記憶體),則將mapping
指向一個anon_vma
結構 [...]--將更多內容塞入結構頁面、LWN.net
然後,該page→index
欄位用於儲存swp_entry_t
匿名頁面的結構。 (對於頁面快取中的頁面,它保存檔案偏移量)。
swp_entry_t
保存交換設備的索引以及該交換設備內的位置。
有關其在 2004 年如何運作的具體細節可以在以下位置找到:了解 Linux 虛擬記憶體管理器 - 交換管理,梅爾·戈爾曼撰寫。
答案2
從你的問題中我並不完全清楚你是否在詢問mmap()
頁面快取中的 ped 文件、交換或被動映射文件,因此我將回答所有問題。
在非 mmap 情況下,逐出就是逐出:一旦頁面變得乾淨,就可以簡單地刪除它。當未由檔案支援的頁面從主記憶體中逐出時,通常不需要恢復任何位址,因為它們會在下次存取檔案時簡單地將頁面錯誤轉移到新的快取條目中。在交換情況下也會發生類似的情況:如果我們在交換中的某個頁面中出現故障,並且稍後必須逐出同一頁面,那麼我們可能會在下次給出一個新的交換地址並將其設置在PTE 中(或如果存在以下情況,則使用交換快取)該頁面存在並且是乾淨的)。
在 mmap 情況下,生命週期由系統呼叫控制mmap()
。該範圍明確映射到 上的虛擬記憶體的連續部分mmap()
,並且此映射的元資料(例如我們有引用計數的後備 FD、偏移量、大小等)儲存在相關的虛擬記憶體區域中(音樂管理協會) 。即使頁面被逐出,VMA 也會保留映射訊息,使內核能夠知道下次訪問時從哪裡出錯。
* 實際上,交換和一般分頁活動通常都不會發生在頁面級別,而是經常發生在某些較低的粒度上,例如交換集群或預讀批次。