MMU 以及 TLB
MMU(Memory Management Unit)內存管理單元:
-
一種硬件電路單元負責將虛擬內存地址轉換為物理內存地址
-
所有的內存訪問都將通過 MMU 進行轉換,除非沒有使能 MMU。
TLB(Translation Lookaside Buffer)轉譯后備緩沖器: 本質上是 MMU 用於虛擬地址到物理地址轉換表的緩存
這樣一種架構,其最終運行時目的,是為主要滿足下面這樣運行需求:
多進程並發同時並發運行在實際物理內存空間中,而 MMU 充當了一個至關重要的虛擬內存到物理內存的橋梁作用。
那么,這種框架具體從高層級的概念上是怎么做到的呢?事實上,是將物理內存采用分片管理的策略來實現的,那么,從實現的角度將有兩種可選的策略:
固定大小分區機制
可變大小分區機制
固定大小區片機制
通過這樣一種概念上的策略,將物理內存分成固定等大小的片:
-
每一個片提供一個基地址
-
實際尋址,物理地址=某片基址+虛擬地址
-
片基址由操作系統在進程動態運行時動態加載
這種策略實現,其優勢在於簡易,切換快速。但是該策略也帶來明顯的劣勢:
-
內部碎片:一個進程不使用的分區中的內存對其他進程而言無法使用
-
一種分區大小並不能滿足所有應用進程所需。
可變大小分區機制
內存被划分為可變大小的區塊進行映射交換管理:
-
需要提供基址以及可變大小邊界,可變大小邊界用於越界保護。
-
實際尋址,物理地址=某片基址+虛擬地址
那么這種策略其優勢在於沒有內部內存碎片,分配剛好夠進程所需的大小。但是劣勢在於,在加載和卸載的動態過程中會產生碎片。
分頁機制
分頁機制采用在虛擬內存空間以及物理內存空間都使用固定大小的分區進行映射管理。
-
從應用程序(進程)角度看內存是連續的 0-N 的分頁的虛擬地址空間。
-
物理內存角度看,內存頁是分散在整個物理存儲中
-
這種映射關系對應用程序不可見,隱藏了實現細節。
分頁機制是如何尋址的呢?這里介紹的設計理念,具體的處理器實現各有細微差異:
-
虛擬地址包含了兩個部分:虛擬頁序號 VPN(virtual paging number)以及偏移量
-
虛擬頁序號 VPN是頁表(Page Table)的索引
-
頁表(Page Table)維護了頁框號(Page frame number PFN)
-
物理地址由PFN::Offset進行解析。
舉個栗子,如下圖所示:
還沒有查到具體的物理地址,憋急,再看一下完整解析示例:
如何管理頁表
對於 32 位地址空間而言,假定 4K 為分頁大小,則頁表的大小為 100MB,這對於頁表的查詢而言是一個很大的開銷。那么如何減小這種開銷呢?實際運行過程中發現,事實上只需要映射實際使用的很小一部分地址空間。那么在一級頁機制基礎上,延伸出多級頁表機制。
以二級分頁機制為例:
單級頁表已然有不小的開銷,查詢頁表以及取數,而二級分頁機制,因為需要查詢兩次頁表,則將這種開銷再加一倍。那么如何提高效率呢?其實前面提到一個概念一直還沒有深入描述 TLB,將翻譯工作由硬件緩存 cache,這就是 TLB 存在的意義。
-
TLB 將虛擬頁翻譯成 PTE,這個工作可在單周期指令完成。
-
TLB 由硬件實現
-
-
完全關聯緩存(並行查找所有條目)
-
緩存索引是虛擬頁碼
-
緩存內容是 PTE
-
則由 PTE+offset,可直接計算出物理地址
-
TLB 加載
誰負責加載 TLB 呢?這里可供選擇的有兩種策略:
-
由操作系統加載,操作系統找到對應的 PTE,而后加載到 TLB。格式比較靈活。
-
MMU 硬件負責,由操作系統維護頁表,MMU 直接訪問頁表,頁表格式嚴格依賴硬件設計格式。
總結一下
從計算機大致發展歷程來了解內存管理的大致發展策略,如何衍生出 MMU,以及固定分片管理、可變分片管理等不同機制的差異,最后衍生出單級分頁管理機制、多級分頁管理機制、TLB 的作用。從概念上相對比較易懂的角度描述了 MMU 的誕生、機制,而忽略了處理器的具體實現細節。作為從概念上更深入的理解 MMU 的工作機理的角度,還是不失為一篇淺顯易懂的文章。