微處理器設計/虛擬記憶體

虛擬記憶體是一種計算機概念,其中主記憶體被分成一系列獨立的頁面。這些頁面可以作為單位在記憶體中移動,或者甚至可以移動到輔助儲存器,以便為主記憶體騰出空間以用於新資料。本質上,虛擬記憶體允許計算機使用比可用記憶體更多的 RAM。
如果一個簡單的虛擬==物理地址路徑足以滿足你的 CPU,你就不需要虛擬記憶體。
大多數處理器都具有非常簡單的地址路徑——地址位來自 PC 或其他一些程式設計師可見的暫存器,或者直接來自某些指令,並且它們直接應用於地址匯流排。
許多通用處理器都具有更復雜的地址路徑:使用者級程式執行時,就好像它們具有簡單的地址路徑一樣,但應用於地址匯流排的物理地址與程式設計師可見的地址有很大不同。這使得虛擬記憶體、記憶體保護和其他理想功能成為可能。
如果你的 CPU 需要這樣做,那麼你需要一些東西來將使用者可見的地址轉換為物理地址——要麼設計 CPU 連線到一些片外儲存器暫存器或 MMU(例如 8722 MMU 或 68851 MMU),要麼設計一個片上儲存器暫存器或 MMU。
你可能希望這樣做是為了
- 支援各種除錯工具,這些工具會捕獲對選定地址的讀或寫操作。
- 允許訪問比使用者級地址似乎支援的更多的 RAM(更寬的物理地址)(儲存器分段)
- 支援許多不同的程式同時在 RAM 中執行,但位於不同的物理 RAM 位置,即使它們都被編譯為在位置 0x300 執行。
- 允許程式使用正常的 LOAD 和 STORE 指令成功讀取和寫入一大塊資料,就好像它都在 RAM 中一樣,即使機器沒有那麼多的 RAM(分頁和虛擬記憶體)
- 支援一個“受保護的”監督級系統,它可以以全速執行有缺陷或惡意的使用者級程式碼,使其處於隔離的沙箱中,而不會損壞其他使用者級程式或監督系統本身——Popek 和 Goldberg 虛擬化、W xor X 記憶體保護等。
- 或者上述幾種情況的組合。
虛擬記憶體既可以在硬體中實現,也可以(在較小程度上)在軟體中實現,儘管許多現代實現都具有硬體和軟體元件。我們在這裡討論虛擬記憶體,因為許多現代 PC 和伺服器處理器都具有內建的虛擬記憶體功能。
分頁系統被設計為透明的,也就是說,在微處理器上執行的(使用者模式)程式不需要顯式地感知分頁機制才能正常執行。
許多處理器系統為頁面賦予某些限定符,以指定可以在頁面中儲存哪些型別的資料。例如,許多新處理器指定頁面是否包含指令或資料,以便資料頁面不能作為指令執行,而指令不能被資料寫入破壞(參見 W^X)。
虛擬記憶體的硬體部分稱為記憶體管理單元 (MMU)。大多數 MMU 的粒度為一個頁面。
一些 CPU 設計使用更細粒度的訪問控制來檢測和防止緩衝區溢位錯誤,這是一種常見的安全漏洞。[1]
記憶體地址對應於特定頁面,以及該頁面內的偏移量。如果一個頁面在 32 位計算機中為 212 位元組,那麼記憶體地址的前 20 位是頁面地址,而較低的 12 位是該頁面內資料的偏移量。在這種情況下,最上面的 20 位將與地址分離,並將被替換為該頁面的當前物理地址。如果頁面不存在於主記憶體中,處理器(或分頁軟體)將從輔助儲存器中檢索頁面,這會導致顯著的延遲。
頁面是記憶體的基本單位,通常為幾千位元組或更大。頁面可以在記憶體中移動到不同的位置,或者如果它沒有被使用,它可以經常移動到輔助儲存器。輔助儲存器中的區域通常稱為頁面檔案、“草稿板”或類似的名稱。
各種頁面的地址儲存在一個分頁表中。分頁表本身可以儲存在處理器內部的記憶體單元中,也可以駐留在主記憶體的專用區域中。
當處理器無法在頁表中找到頁面時,就會發生缺頁錯誤。
轉換後備緩衝器 (TLB) 是一種小型結構,類似於快取記憶體,它儲存最近使用頁面的地址。在 TLB 中查詢頁面比在頁表中搜索頁面快得多。當處理器在 TLB 中找不到特定頁面時,稱為“TLB 未命中”。當 TLB 未命中時,處理器將在頁表中查詢頁面。如果頁面也不在表中,則會發生缺頁錯誤。
請注意,即使 TLB 可以被認為是一種快取記憶體,它快取了儲存在主記憶體中的頁表的一部分,但它是一個與指令快取記憶體或資料快取記憶體物理上分離的結構,並且具有那些快取記憶體中沒有的幾個特性。
TLB 中的 SRAM 可以被看作完全由 TLB 條目組成。TLB 中的 TLB 條目的格式由 TLB 硬體固定。分頁監督程式——作業系統的一部分——通常在主記憶體中維護一個頁表,該頁表以與 TLB 條目完全相同的格式儲存頁表條目。每個 TLB 條目都包含
- 頁面的虛擬地址(類似於快取記憶體中的“標記”)
- 頁面的物理地址(類似於快取記憶體中的“資料”)
雖然不是必需的,但一些 TLB 硬體在 TLB 中具有許多其他可選的控制和保護欄位和標誌,包括
- 不可執行位(NX 位),用於實現 W^X(“寫入 XOR 執行”)
- “髒位”(也稱為“修改位”),在每次寫入該頁面的 STORE 時都會設定,並且通常在修改後的頁面被寫入備份儲存器時清除。
- 可寫位,用於實現 PaX,有時由作業系統清除然後設定,以實現寫時複製 (COW)
- 物理頁面所屬的虛擬地址空間(在單地址空間作業系統 上不需要)
- 監督位
- 關於哪些 TLB 條目最近或最常被使用統計資訊,用於決定在從主記憶體載入新的 TLB 條目時丟棄哪個 TLB 條目
- 關於哪些頁面最近或最常被使用統計資訊,用於支援 LRU 或更復雜的頁面替換演算法,這些演算法決定在作業系統需要將備份儲存器中的其他頁面載入到物理記憶體時,當前在主記憶體中的哪個頁面“換出”到備份儲存器
頁表條目可能包含不會複製到 TLB 條目的其他每頁欄位,例如
- “固定位”(又稱“固定標誌”),表示頁面必須保留在主記憶體中——分頁監督程式將分頁監督程式可執行程式碼本身、用於輔助儲存裝置的裝置驅動程式(頁面被交換到這些裝置上)、中斷處理程式可執行程式碼標記為固定頁面。一些資料緩衝區在裝置在 CPU 外部讀取或寫入這些緩衝區(直接記憶體訪問和 I/O 通道硬體)期間也處於固定狀態。
- “存在”位(當特定虛擬頁面當前不存在於物理主記憶體中時清除)
- Thomas W. Barr、Alan L. Cox、Scott Rixner。"Translation Caching: Skip, Don’t Walk (the Page Table)"。描述了英特爾 x86-64 MMU 快取、AMD 頁面行走快取、其他 3 種 MMU 快取安排,並比較了它們的效能。
- B. Jacob 和 T. Mudge。"Virtual memory in contemporary microprocessors". IEEE Micro 1998 年 7 月。
- ↑ Albert Kwon, Udit Dhawan, Jonathan M. Smith, Thomas F. Knight, Jr. 和 André DeHon。 "低脂肪指標:緊湊編碼和高效門級實現用於空間安全和基於能力的安全性的胖指標"。2013 年。