Kernel

我真的不明白為什麼需要分頁中的目錄

  • October 30, 2019

多年來我一直試圖弄清楚這些東西,但每次我都不明白。我非常了解分頁、頁表和頁表目錄在 Linux 中是如何工作的,但我只是不明白為什麼實際上需要它們。

我們需要分頁和頁表級別(Linux 使用 4 個級別)的問題似乎是您無法同時載入所有記憶體。但是我們不能只載入選定數量的頁面和地址而不需要所有目錄嗎?

我知道我們需要了解某個幀在物理記憶體中的位置,但是為什麼我們不能直接檢索大頁表的某個子集呢?這會導致什麼問題?我知道如果我們不使用頁面+偏移量,整個事情就會太大了,但是目錄真的能解決任何問題嗎?

有很多關於不同系統如何劃分地址位以建構頁表級別的討論,但歸根結底,我們總是會有 32/64 位的條目。我們將無法解決更多問題(除了cr3像 PAE 這樣的寄存器技巧),拆分它們有什麼意義?最後,(我將簡化)“目錄 3,子目錄 5,第 7 頁,偏移量 2”比只說“地址 3572”更好嗎?

更糟糕的是,如果 CPU 沒有幫助我們(我猜它有內置電路可以在 1 個時鐘週期內完成所有程序?不太確定!)每次記憶體訪問時的目錄和子目錄,而不是直接檢索邏輯/物理記憶體映射然後訪問所需的地址?

具有多個級別的原因是為了節省空間。

考慮如果沒有多個級別會需要什麼。如果有 48 位地址空間(目前的 x86_64 cpu 沒有為您提供完整的 64 位),並且您使用的是 4k 字節的頁面大小(12 位),那麼您有 2 的 36 頁的冪。

如果您可以將映射資訊放入 64 位(8 字節),那麼您將需要 8 * 2**36 字節或 512Gb 的記憶體來保存轉換錶。

幾乎所有該表都將設置為表示“無效地址”的值。

通過多個級別,您可以減少轉換錶的空間需求。如果將 64 位地址空間拆分為 16/9/9/9/9/12 位,用於 current_unused/PML4/PDPT/PD/PT/address_in_page,則 PML4 表只需要 512 個條目,其中 510 可能是值表示“無效地址”,其餘 2 指向 PDPT 的 512 個條目的兩個數組。如果我們停在那裡,那麼我們將所需的空間從 236 個條目減少到大約 2 + 227 個條目,不到原始線性需求的 0.2%。當然不止於此,還有 3 個額外的級別,儘管它們往往不會帶來那麼大的節省。

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