Linux-Kernel

4 級頁表中的 VA 到 PA 轉換如何只需要 4 次記憶體訪問

  • August 16, 2021

我正在學習頁表管理,我了解到這VA to PA translation需要 4 次記憶體訪問4-level page table(考慮到 TLB 未命中和頁遍歷記憶體中的未命中)。

但是,由於 Linux 使用follow_pagePTW 的函式,並且此函式在內部呼叫follow_page_mask. 這進一步呼叫p4d_offset,pud_offsetpgd_offset

所以,我這裡的問題是,例如,當pud_offset被呼叫時,它會返回一個PMD目錄的虛擬地址(我猜)並且要獲得PMD目錄的物理地址,再次需要執行PTW。

那麼,memory accessesfor address translation will 4 如何呢?不是超過4個嗎?

當人們說在 x86 上使用四級頁表進行虛擬到物理地址轉換時(最多)需要四次記憶體訪問,他們指的是 CPU(嚴格來說,MMU)必須做的工作來解碼線性地址並將其轉換為物理地址。

英特爾® 64 和 IA-32 架構軟體開發人員手冊第 3A 卷第 4.5 節詳細介紹了該過程。在具有 4KiB 頁面的四級模式下(最壞情況),線性地址的結構如下:

給定這樣的地址,如果需要完整的地址解碼,CPU 必須:

  • 使用基數CR3加上 PML4 值來查找相關的 PML4 條目(一次記憶體訪問)
  • 在 PML4 條目對應的 page-directory-pointer 表中,讀取目錄指針的條目(一次記憶體訪問)
  • 在頁面目錄中,讀取目錄的條目(一次記憶體訪問)
  • 在頁表中,讀取表的條目(一次記憶體訪問)

最後一次讀取的結果與線性地址的偏移部分相結合,在總共四次記憶體訪問之後給出了物理地址。

只有在發生缺頁時才會涉及核心;與理想情況下的 CPU 相比,它需要做更多的工作來處理這個問題。

引用自:https://unix.stackexchange.com/questions/664726