Linux-Kernel

MMU 如何找出它應該翻譯的地址?

  • August 12, 2022

當我們嘗試從特定地址讀取/寫入一些數據時,我們必須知道第一頁目錄的儲存位置以及我們要轉換的地址。

至於第一個頁面目錄(據我所知linux使用4級分頁,所以第一個應該是PGD),而對於Intel - CR3register 將包含PGD的地址,但是虛擬地址儲存在哪裡?MMU 如何理解它應該準確地翻譯這個或那個地址?

UPD:我想我應該澄清我的問題並提供一些我如何看待的細節:

據我了解,當要翻譯一些虛擬地址時,我們有以下步驟:

  1. 檢查 TLB。
  2. 如果 TLB 命中,那麼我們有物理地址 (PA)
  3. 如果沒有,我們必須處理翻譯錯誤
  4. 在翻譯錯誤期間,我們必須遍歷軟體頁表才能找到 PA。
  5. 這裡不得不切換到核心模式。(順便說一句,我知道通常核心頁表和使用者頁表是一樣的,只是權限不同,有沒有辦法不切換到核心模式?)
  6. 然後我們將CR3寄存器設置為 PGD 地址(或另一個頂級頁面目錄)
  7. 現在我們的工作是通過這張桌子還是不走?如果軟體應該自己做,那麼我們知道某個 var 中的 VA(虛擬地址)並且可以在頁表中查找 PA ???或者這項工作在 MMU 上(或類似的),它將通過這些表,而 CR3 將知道 PGD 的位置,但它如何理解這是翻譯的地址?它是在某個寄存器中還是已經載入到記憶體中的某個地方?

感謝您的時間!

您列出的步驟不太正確;希望修復它可以讓您了解發生了什麼。

  1. CPU 嘗試訪問記憶體(例如讀取指令,或者因為目前指令訪問記憶體)——這就是虛擬地址的來源。
  2. 檢查 TLB。
  3. 如果 TLB 有一個虛擬地址條目,我們就得到了相應的物理地址。
  4. 否則,MMU 必須處理 TLB 未命中(這在 x86 上不是故障;它被計算在內但核心不知道它)。
  5. MMU 遍歷頁表,可能從儲存在CR3. 它從第 0 步就知道它需要解析的虛擬地址。
  6. 沒有切換到核心模式,這一切都由 MMU 處理(在 x86 上)。
  7. CR3並且必須在訪問記憶體之前設置頁表,這裡沒有任何更改。(參見對 pagewalk coherence 的深入分析。)

一些架構(我認為是 MIPS)在處理 TLB 未命中時*確實涉及核心;*在這種情況下,需要處理的虛擬地址在故障資訊中提供。

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