Linux

在 x86_64 Long 模式下執行 32 位程式碼時,Linux 核心如何安排頁表?

  • June 20, 2019

x86_64 架構允許在長模式下執行時本地執行 32 位程式碼。因此添加了一個稱為“兼容模式”的子模式。現在記憶體管理模式通過下表來計算物理地址:

PML4 (Linux: PGD) -> PDPT (Linux: PUD) -> PD (Linux: PMD) -> PT -> physical page

上面提到的每個表都包含 512 個大小為 64 位的條目,因此您需要 9 位作為每個表的索引和 12 位作為添加到從 PT 檢索的最後一個地址的偏移量。這總計為 48 位。現在似乎很清楚,您無法使用 32 位地址實現相同的目標。

其他人已經嘗試解釋這是如何完成的(此處此處),但在我看來這是不對的。那裡解釋說 PDPT 和 PD 每個只有一個條目,但這種行為會在我理解的方式上造成一些麻煩。

MMU 會從地址中取出最重要的 9 位來獲取 PDPT 的地址。現在在 PDPT 中只有一個條目,但 MMU 有一個嚴格的過程,並將從地址中取出接下來的 9 位作為索引。現在在 512 個案例中只有一個會選擇第一個條目。PD也存在同樣的問題。

這不是我看到的唯一問題。如前所述,32 位不足以進行完整的翻譯,因此必須以某種方式跳過某些表。

希望我能解釋我的問題,有人可以幫助我。

x86-64 中 Long Mode 的 Compatibility 子模式不影響分頁,其功能與 64 位 Long Mode 中相同。32 個隱含的零位被插入到饋入分頁單元的虛擬地址的位位置 63-32。您只需要設置將這些零位映射到有效值的頁表,就像您連結到的第一個問題中的答案所解釋的那樣。請參閱AMD64 架構程序員手冊第 1 卷:應用程序程式中的2.1.4.1 長模式記憶體管理(PDF)

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