Linux-Kernel
4 級頁表中的 VA 到 PA 轉換如何只需要 4 次記憶體訪問
我正在學習頁表管理,我了解到這
VA to PA translation
需要 4 次記憶體訪問4-level page table
(考慮到 TLB 未命中和頁遍歷記憶體中的未命中)。但是,由於 Linux 使用
follow_page
PTW 的函式,並且此函式在內部呼叫follow_page_mask
. 這進一步呼叫p4d_offset
,pud_offset
等pgd_offset
。所以,我這裡的問題是,例如,當
pud_offset
被呼叫時,它會返回一個PMD
目錄的虛擬地址(我猜)並且要獲得PMD
目錄的物理地址,再次需要執行PTW。那麼,
memory accesses
for address translation will 4 如何呢?不是超過4個嗎?
當人們說在 x86 上使用四級頁表進行虛擬到物理地址轉換時(最多)需要四次記憶體訪問,他們指的是 CPU(嚴格來說,MMU)必須做的工作來解碼線性地址並將其轉換為物理地址。
英特爾® 64 和 IA-32 架構軟體開發人員手冊第 3A 卷第 4.5 節詳細介紹了該過程。在具有 4KiB 頁面的四級模式下(最壞情況),線性地址的結構如下:
給定這樣的地址,如果需要完整的地址解碼,CPU 必須:
- 使用基數
CR3
加上 PML4 值來查找相關的 PML4 條目(一次記憶體訪問)- 在 PML4 條目對應的 page-directory-pointer 表中,讀取目錄指針的條目(一次記憶體訪問)
- 在頁面目錄中,讀取目錄的條目(一次記憶體訪問)
- 在頁表中,讀取表的條目(一次記憶體訪問)
最後一次讀取的結果與線性地址的偏移部分相結合,在總共四次記憶體訪問之後給出了物理地址。
只有在發生缺頁時才會涉及核心;與理想情況下的 CPU 相比,它需要做更多的工作來處理這個問題。