MMU存在的意義
[導讀] 本文從記憶體管理的發展歷程角度層層遞進,介紹MMU的誕生背景,作業機制,而忽略了具體處理器的具體實作細節,將MMU的作業原理從概念上比較清晰的梳理了一遍,
MMU誕生之前:
在傳統的批處理系統如DOS系統,應用程式與作業系統在記憶體中的布局大致如下圖:
- 應用程式直接訪問物理記憶體,作業系統占用一部分記憶體區,
- 作業系統的職責是“加載”應用程式,“運行”或“卸載”應用程式,

如果我們一直是單任務處理,則不會有任何問題,也或者應用程式所需的記憶體總是非常小,則這種架構是不會有任何問題的,然而隨著計算機科學技術的發展,所需解決的問題越來越復雜,單任務批處理已不能滿足需求了,而且應用程式需要的記憶體量也越來越大,而且伴隨著多任務同時處理的需求,這種技術架構已然不能滿足需求了,早先的多任務處理系統是怎么運作的呢?
程式員將應用程式分段加載執行,但是分段是一個苦力活,而且死板枯燥,此時聰明的計算機科學家想到了好辦法,提出來虛擬記憶體的思想,程式所需的記憶體可以遠超物理記憶體的大小,將當前需要執行的留在記憶體中,而不需要執行的部分留在磁盤中,這樣同時就可以滿足多應用程式同時駐留記憶體能并發執行了,
從總體上而言,需要實作哪些大的策略呢?
- 所有的應用程式能同時駐留記憶體,并由作業系統調度并發執行,需要提供機制管理I/O重疊,CPU資源競爭訪問,
- 虛實記憶體映射及交換管理,可以將真實的物理記憶體,有可變或固定的磁區,分頁或者分段與虛擬記憶體建立交換映射關系,并且有效的管理這種映射,實作交換管理,
這樣,衍生而來的一些實作上的更具體的需求:
- 競爭訪問保護管理需求:需要嚴格的訪問保護,動態管理哪些記憶體頁/段或區,為哪些應用程式所用,這屬于資源的競爭訪問管理需求,
- 高效的翻譯轉換管理需求:需要實作快速高效的映射翻譯轉換,否則系統的運行效率將會低下,
- 高效的虛實記憶體交換需求:需要在實際的虛擬記憶體與物理記憶體進行記憶體頁/段交換程序中快速高效,
總之,在這樣的背景下,MMU應運而生,也由此可見,任何一項技術的發展壯大,都必然是需求驅動的,這是技術本身發展的客觀規律,
記憶體管理的好處
- 為編程提供方便統一的記憶體空間抽象,在應用開發而言,好似都完全擁有各自獨立的用戶記憶體空間的訪問權限,這樣隱藏了底層實作細節,提供了統一可移植用戶抽象,
- 以最小的開銷換取性能最大化,利用MMU管理記憶體肯定不如直接對記憶體進行訪問效率高,為什么需要用這樣的機制進行記憶體管理,是因為并發行程每個行程都擁有完整且相互獨立的記憶體空間,那么實際上記憶體是昂貴的,即使記憶體成本遠比從前便宜,但是應用行程對記憶體的尋求仍然無法在實際硬體中,設計足夠大的記憶體實作直接訪問,即使能滿足,CPU利用地址總線直接尋址空間也是有限的,
記憶體管理實作總體策略
從作業系統角度來看,虛擬記憶體的基本抽象由作業系統實作完成:
- 處理器記憶體空間不必與真實的所連接的物理記憶體空間一致,
- 當應用程式請求訪問記憶體時,作業系統將虛擬記憶體地址翻譯成物理記憶體地址,然后完成訪問,
從應用程式角度來看,應用程式(往往是行程)所使用的地址是虛擬記憶體地址,從概念上就如下示意圖所示,MMU在作業系統的控制下負責將虛擬記憶體實際翻譯成物理記憶體,

從而這樣的機制,虛擬記憶體使得應用程式不用將其全部內容都一次性駐留在記憶體中執行:
- 節省記憶體:很多應用程式都不必讓其全部內容一次性加載駐留在記憶體中,那么這樣的好處是顯而易見,即使硬體系統配置多大的記憶體,記憶體在系統中仍然是最為珍貴的資源,所以這種技術節省記憶體的好處是顯而易見的,
- 使得應用程式以及作業系統更具靈活性,
- 作業系統根據應用程式的動態運行時行為靈活的分配記憶體給應用程式,
- 使得應用程式可以使用比實際物理記憶體多或少的記憶體空間,
MMU 以及TLB
MMU(Memory Management Unit)記憶體管理單元:
- 一種硬體電路單元負責將虛擬記憶體地址轉換為物理記憶體地址
- 所有的記憶體訪問都將通過MMU進行轉換,除非沒有使能MMU,
TLB(Translation ?Lookaside ?Bu?er?)轉譯后備緩沖器*?: 本質上是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的作業機理的角度,還是不失為一篇淺顯易懂的文章,
文章出自微信公眾號:嵌入式客堆疊,更多內容,請關注本人公眾號,嚴禁商業使用,違法必究

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/24353.html
標籤:C
