Linux-Kernel
MMU 如何找出它應該翻譯的地址?
當我們嘗試從特定地址讀取/寫入一些數據時,我們必須知道第一頁目錄的儲存位置以及我們要轉換的地址。
至於第一個頁面目錄(據我所知linux使用4級分頁,所以第一個應該是
PGD
),而對於Intel -CR3
register 將包含PGD的地址,但是虛擬地址儲存在哪裡?MMU 如何理解它應該準確地翻譯這個或那個地址?UPD:我想我應該澄清我的問題並提供一些我如何看待的細節:
據我了解,當要翻譯一些虛擬地址時,我們有以下步驟:
- 檢查 TLB。
- 如果 TLB 命中,那麼我們有物理地址 (PA)
- 如果沒有,我們必須處理翻譯錯誤
- 在翻譯錯誤期間,我們必須遍歷軟體頁表才能找到 PA。
- 這裡不得不切換到核心模式。(順便說一句,我知道通常核心頁表和使用者頁表是一樣的,只是權限不同,有沒有辦法不切換到核心模式?)
- 然後我們將CR3寄存器設置為 PGD 地址(或另一個頂級頁面目錄)
- 現在我們的工作是通過這張桌子還是不走?如果軟體應該自己做,那麼我們知道某個 var 中的 VA(虛擬地址)並且可以在頁表中查找 PA ???或者這項工作在 MMU 上(或類似的),它將通過這些表,而 CR3 將知道 PGD 的位置,但它如何理解這是翻譯的地址?它是在某個寄存器中還是已經載入到記憶體中的某個地方?
感謝您的時間!
您列出的步驟不太正確;希望修復它可以讓您了解發生了什麼。
- CPU 嘗試訪問記憶體(例如讀取指令,或者因為目前指令訪問記憶體)——這就是虛擬地址的來源。
- 檢查 TLB。
- 如果 TLB 有一個虛擬地址條目,我們就得到了相應的物理地址。
- 否則,MMU 必須處理 TLB 未命中(這在 x86 上不是故障;它被計算在內但核心不知道它)。
- MMU 遍歷頁表,可能從儲存在
CR3
. 它從第 0 步就知道它需要解析的虛擬地址。- 沒有切換到核心模式,這一切都由 MMU 處理(在 x86 上)。
CR3
並且必須在訪問記憶體之前設置頁表,這裡沒有任何更改。(參見對 pagewalk coherence 的深入分析。)一些架構(我認為是 MIPS)在處理 TLB 未命中時*確實涉及核心;*在這種情況下,需要處理的虛擬地址在故障資訊中提供。