複製鏈接
請複製以下鏈接發送給好友

MMU

鎖定
MMU是Memory Management Unit的縮寫,中文名是內存管理單元,有時稱作分頁內存管理單元(英語:paged memory management unit,縮寫為PMMU)。它是一種負責處理中央處理器(CPU)的內存訪問請求的計算機硬件。它的功能包括虛擬地址物理地址的轉換(即虛擬內存管理)、內存保護、中央處理器高速緩存的控制,在較為簡單的計算機體系結構中,負責總線仲裁以及存儲體切換(bank switching,尤其是在8位的系統上)。
中文名
內存管理單元
外文名
Memory Management Unit
又    叫
分頁內存管理單元
負    責
虛擬地址映射為物理地址,以及提供硬件機制的內存訪問授權
屬    性
計算機硬件
相關概念
地址範圍

MMU歷史

許多年以前,當人們還在使用DOS或是更古老的操作系統的時候,計算機的內存還非常小,一般都是以K為單位進行計算,相應的,當時的程序規模也不大,所以內存容量雖然小,但還是可以容納當時的程序。但隨着圖形界面的興起還有用户需求的不斷增大,應用程序的規模也隨之膨脹起來,終於一個難題在程序員的面前,那就是應用程序太大以至於內存容納不下該程序,通常解決的辦法是把程序分割成許多稱為覆蓋塊(overlay)的片段。
覆蓋塊0首先運行,結束時他將調用另一個覆蓋塊。雖然覆蓋塊的交換是由OS完成的,但是必須先由程序員把程序先進行分割,這是一個費時費力的工作,而且相當枯燥。人們必須找到更好的辦法從根本上解決這個問題。不久人們找到了一個辦法,這就是虛擬存儲器(virtual memory)。虛擬存儲器的基本思想是程序,數據,堆棧的總的大小可以超過物理存儲器的大小,操作系統把當前使用的部分保留在內存中,而把其他未被使用的部分保存在磁盤上。比如對一個16MB的程序和一個內存只有4MB的機器,操作系統通過選擇,可以決定各個時刻將哪4M的內容保留在內存中,並在需要時在內存和磁盤間交換程序片段,這樣就可以把這個16M的程序運行在一個只具有4M內存機器上了。而這個16M的程序在運行前不必由程序員進行分割。

MMU簡介

內存管理單元通常應用在桌面型計算機或者服務器,通過虛擬存儲器使得計算機可以使用比實際的物理內存更多的存儲空間。同時,內存管理單元還對實際的物理內存進行分割和保護,使得每個軟件任務只能訪問其分配到的內存空間。如果某個任務試圖訪問其他任務的內存空間,內存管理單元將自動產生異常,保護其他任務的程序和數據不受破壞。概述圖顯示了一個典型的使用內存管理單元為多個任務劃分的內存映射圖。內存管理單元的這個機制是調試指針錯誤或數組下標越界等錯誤的非常強大的工具。 [1] 

MMU基本概念

MMU位於處理器內核和連接高速緩存以及物理存儲器總線之間。當處理器內核取指令或者存取數據的時候,都會提供一個有效地址(effective address),或者稱為邏輯地址虛擬地址。這個地址是可執行代碼在編譯的時候由鏈接器生成的。不同於開發嵌入式處理器系統的程序員,桌面型計算器的程序開發人員通常對硬件的物理配置信息所知甚少。將存儲器系統虛擬化,程序員就不需要了解存儲器的物理配置細節。當應用代碼需要使用存儲空間時,操作系統通過MMU為其分配合適的物理存儲空間。有效地址不需要和系統的實際硬件物理地址相匹配,而是通過MMU將有效地址映射成對應的物理地址,以訪問指令和數據。 [1] 
每條MMU匹配規則所對應的存儲器的大小定義為頁。頁的大小通常設定為不會對程序的性能造成顯著影響的最小的程序和代碼的長度。當暫時不使用物理內存的內容時,可將其保存到硬盤等外部存儲器裏,將其空間用於其他程序;當再次使用這部分內容時再從外部存儲器寫回到實際物理內存中。通過這種方法,系統就可以提供多於實際物理內存容量的“虛擬內存”。如果MMU定義的頁太大,那麼進行虛擬內存頁面替換所花費的時間就太長;如果頁太小,就會引起過於頻繁的頁面替換。通常最小的頁設定為4 KB。 [1] 
為了加快MMU規則匹配的處理過程,有效地址和實際物理地址的對應表通常保存在一塊單獨的高速緩存中,稱為對應查找表(Translation Lookaside Buffer,TLB),TLB和實際物理存儲器可以同時進行並行的訪問。有效地址的高位作為在TLB進行匹配查找的依據,而有效地址的低位作為頁面內的偏址。 [1] 
TLB可以包含很多個表項(entry),每個表項對應一個MMU的頁。操作系統或者應用啓動代碼必須正確的初始化TLB的所有表項。當應用程序提供的有效地址正好位於某個TLB表項制定的地址範圍內時,稱為產生了一次TLB命中;如果這個有效地址沒有位於任何一個TLB表項制定的地址範圍內,稱為一個TLB缺失,或者TLB未命中。TLB未命中往往發生在應用程序出現錯誤的時候,所以TLB未命中所引發的異常處理可以很有效的發現和調試這類錯誤。虛擬內存利用TLB未命中的異常來完成頁面交換,並根據交換的內容對應的調整TLB表項的參數。通常TLB表項還會指定一些存儲器讀寫的其他參數,只有當這些參數也和當前的存儲器讀寫的參數符合的時候,才能產生TLB命中。 [1] 

MMUMMU屬性

MMU符合Power體系結構的規範。TLB表項都是相連映射的,並且提供了額外的硬件來加速TLB未命中異常的處理。有幾條特殊的指令用於管理TLB表項。 [1] 

MMU頁面大小

TLB表項映射的存儲器範圍就是頁面。這個屬性具體包括: [1] 
①指定的有效映射地址。
②讀寫權限。
存儲器緩存的關係。 [1] 
MMU具有32個TLB表項,可以支持32個頁面。每個頁面的容量可以指定為4 KB,16 KB,64 KB,256 KB,1 MB,4 MB,16 MB,64 MB和256 MB。 [1] 
實際頁面地址 (RealPageNumber,RPN) 確定了頁面對應的起始物理地址。這個起始地址必須是頁面大小的整數倍,例如16 KB的頁面的起始地址必須位於0,16 KB,32 KB或48KB的邊界上。這樣,將頁面和MPC 5554 / 5553的實際物理地址對應起來的時候,就需要格外注意。 [1] 
實際上,存儲器分配表也考慮到了這一點,仔細地分配了每個片上模塊的起始地址和模塊地址空間,使得需要用到的TLB表項儘可能少。實際上,BAM代碼中只需要使用前5個TLB表項就可以覆蓋微處理器的全部地址空間。多個頁面也允許佔用相同的物理地址空間。 [1] 
圖1 多個TLB頁面使用相同的物理存儲區 圖1 多個TLB頁面使用相同的物理存儲區
例如,可以將片內的一段64KB的FLASH存儲器映射成一個64 KB的只讀頁面;另外將一段16 KB的讀寫頁面映射到這64 KB的起始地址。這樣,這64KB的地址空間實際上就被分成了48KB和16KB兩個部分,如圖1所示。雖然這兩個頁面有可能產生相同的物理地址,但是通過結合其他的頁面屬性可以避免多個頁面同時命中。注意讀寫權限並不能用來避免多頁面命中。 [1] 
在這種配置方式下,48 KB的只讀部分可以用於保存常數和表等固定數據,而16 KB的讀寫部分則可以用於模擬EEP-ROM存儲區。應用程序必須非常仔細的確認那些對48KB常數段進行操作的代碼不會錯誤的訪問到前面的16KB區域,因為在這種情況下MMU無法檢查對48KB區域的訪問越界。如果要實現對48 KB區域的訪問越界檢查,將一共需要使用4個TLB表項才能實現。使用3個TLB表項將這48 KB空間必須映射到3個獨立的16 KB頁面,並且和原來的16 KB頁面沒有任何重疊。 [1] 
圖2 映射實例 圖2 映射實例
通過配置TLB表項,也可以將全部的片內存儲器和I/O空間都映射成一個大的連續的虛擬地址空間。MPC 5554 / 5553 的I/O模塊的地址空間分散在整個4 GB尋址空間裏。圖2的例子裏,eTPU模塊的16 KB雙口共享RAM和片內的64 KB RAM被映射成了一個連續的80KB虛擬空間 [1] 
當然此時就不能再使用eTPU模塊了。通過配置TLB表項,也可以將應用中處理器需要頻繁訪問的外設的地址映射到那些可以使用更高效的尋址方式的頁面空間。例如將eMIOS模塊的地址空間映射到0地址開始的頁面,處理器就可以使用高效的立即數間接尋址,而不必使用複雜的寄存器間接尋址方式。 [1] 

MMUTS地址空間類型指示

根據Power體系規範的規定,有效地址還包含了兩個額外的位分別用於指明當前的有效地址是否是指令獲取操作和數據讀寫操作。對於指令操作,這個額外的位保存在MSR寄存器的IS位;對於數據操作,這個額外的位保存在MSR寄存器的DS位。這兩個位可以通過程序指令進行修改,但是當發生中斷的時候,MSR寄存器中的這兩個位都會被清除為0。 [1] 
當處理器進行指令獲取或數據讀寫操作時,IS和DS位會分別和TLB表項中保存的TS位進行比較,比較的結果將對是否產生TLB命中產生影響。 [1] 
由於在發生中斷時,MSR寄存器中IS和DS位都被清為0,所以對於中斷處理程序所在的頁面,其TS必須置為0.正常的應用程序所在的頁面的TS就需要置為1。 [1] 
使用地址空間類型指示可以將映射到同一段有效地址的多個程序模塊區分開來。例如可以將中斷服務程序放置在地址空間的前32KB,並且具有系統態運行的屬性;而應用程序的固定數據表也可以映射到這32 KB,具有普通態只讀的屬性。 [1] 

MMUTID TLB處理ID號

根據Power體系規範的規定,MMU還提供了PID(ProcessID)的特性。當TLB進行有效地址映射處理的時候,PID寄存器的值也和TLB表項中的TID值進行比較。不管是指令操作還是數據操作,都要進行PID和TID的比較。 [1] 
如果TID被設置為0值,那麼將忽略PID和TID比較的結果,也不會對TLB命中的處理產生影響。 [1] 
多個TLB表項對應相同的有效地址的情況,可以通過TID來進行區分。通過修改TID寄存器的值,可以很容易地在運行時切換存儲器.例如當應用程序運行時,通過NEXUS調試接口修改TID寄存器的值後,相同的有效地址所對應的數據將變成從另外--個物理存儲空間得到。這對於調試是非常有用的。 [1] 

MMUEPN、RPN有效頁面地址,實際頁面地址

在每個TLB表項中,必須滿足下面的條件才能正確進行有效地址的映射: [1] 
有效地址的特定位數的內容和TLB表項中有效頁面地址EPN相同。
●MSR寄存器的IS位(對於指令操作)或DS位(對於數據操作)和TLB表項中的TS位相同。
●PID寄存器的值和TLB表項中TID的值相同,或者TID的值為零。
圖3 有效TLB命中 圖3 有效TLB命中
圖3給出了有效TLB命中的邏輯處理結構圖。
對一個有效地址,如果沒有任何一個TLB表項滿足上述條件,就產生了一個TLB缺失,這可以引起一個指令或數據的TLB缺失異常。 [1] 
TLB表項中定義的頁大小決定了有效地址的多少個位的信息需要和TLB表項中的EPN進行比較。當TLB命中後,TLB表項中的RPN就替換了有效地址中的對應位,而構成實際的物理地址。 [1] 

MMU存儲器訪問權限

程序可以為每個虛擬頁面指定一定的訪問權限,包括是系統態還是普通態,是否允許讀、寫和運行指令。對於某些應用,這些訪問權限設定只能在系統復位後配置一次。 [1] 
例如,程序代碼所在區域被配置為只能運行,數據變量區被設置為讀寫非運行,數據常數區被配置為只讀非運行。對於另一些應用,這些訪問權限由操作系統根據應用程序的需要和系統運行的策略進行動態的修改。 [1] 
UX,SX,UW,SW,UR和SR訪問權限位用於設定一個虛擬頁面的訪問權限。這些位的具體描述如下: [1] 
●SR--系統態讀權限:在系統態下(MSR[PR=0]),允許進行存儲區讀操作和讀取形式的緩存管理操作。
●SW--系統態寫權限:在系統態下(MSR[PR=0]),允許進行存儲器寫操作和寫入形式的緩存管理操作。
●SX--系統態運行權限:在系統態下(MSR[PR= 0]) ,允許從存儲器獲取和執行指令。
●UR--普通態讀權限:在普通態下(MSR[PR=1]),允許進行存儲區讀操作和讀取形式的緩存管理操作。
●UW--普通態寫權限:在普通態下(MSR[PR= 1]),允許進行存儲器寫操作和寫入形式的緩存管理操作。
●UX--普通態運行權限:在普通態下(MSR[PR= 1]) ,允許從存儲器獲取和執行指令。
在地址比較和頁面屬性比較完成後,還需要檢查這些訪問權限設定。如果產生了權限衝突,會引發一個指令或數據存儲中斷(ISI或DSI)。 [1] 

MMU相關概念

  • 地址範圍
任何時候,計算機上都存在一個程序能夠產生的地址集合,我們稱之為地址範圍。 [2] 
地址範圍的大小由CPU的位數決定,例如一個32位的CPU,它的地址範圍是0~0xFFFFFFFF (4G),而對於一個64位的CPU,它的地址範圍為0~0xFFFFFFFFFFFFFFFF (16E)。這個範圍就是我們的程序能夠產生的地址範圍,我們把這個地址範圍稱為虛擬地址空間,該空間中的某一個地址我們稱之為虛擬地址。 [2] 
與虛擬地址空間和虛擬地址相對應的則是物理地址空間和物理地址,大多數時候我們的系統所具備的物理地址空間只是虛擬地址空間的一個子集。這裏舉一個最簡單的例子直觀地説明這兩者,對於一台內存為256M的32bit x86主機來説,它的虛擬地址空間範圍是0~0xFFFFFFFF(4G),而物理地址空間範圍是0x00000000 ~ 0x0FFFFFFF(256M)。 [2] 
  • 地址映射
在沒有使用虛擬存儲器的機器上,地址被直接送到內存總線上,使具有相同地址的物理存儲器被讀寫;而在使用了虛擬存儲器的情況下,虛擬地址不是被直接送到內存地址總線上,而是送到存儲器管理單元MMU,把虛擬地址映射為物理地址。
大多數使用虛擬存儲器的系統都使用一種稱為分頁(paging)機制。虛擬地址空間劃分成稱為頁(page)的單位,而相應的物理地址空間也被進行劃分,單位是頁幀(frame).頁和頁幀的大小必須相同。在這個例子中我們有一台可以生成32位地址的機器,它的虛擬地址範圍從0~0xFFFFFFFF(4G),而這台機器只有256M的物理地址,因此他可以運行4G的程序,但該程序不能一次性調入內存運行。這台機器必須有一個達到可以存放4G程序的外部存儲器(例如磁盤或是FLASH),以保證程序片段在需要時可以被調用。在這個例子中,頁的大小為4K,頁幀大小與頁相同——這點是必須保證的,因為內存和外圍存儲器之間的傳輸總是以頁為單位的。對應4G的虛擬地址和256M的物理存儲器,他們分別包含了1M個頁和64K個頁幀。 [2] 

MMU功能

1)將線性地址映射為物理地址
現代的多用户多進程操作系統,需要MMU,才能達到每個用户進程都擁有自己獨立的地址空間的目標。使用MMU,操作系統劃分出一段地址區域,在這塊地址區域中,每個進程看到的內容都不一定一樣。例如MICROSOFT WINDOWS操作系統將地址範圍4M-2G劃分為用户地址空間,進程A在地址0X400000(4M)映射了可執行文件,進程B同樣在地址0X400000(4M)映射了可執行文件,如果A進程讀地址0X400000,讀到的是A的可執行文件映射到RAM的內容,而進程B讀取地址0X400000時,則讀到的是B的可執行文件映射到RAM的內容。 [2] 
這就是MMU在當中進行地址轉換所起的作用。
2)提供硬件機制的內存訪問授權
多年以來,微處理器一直帶有片上存儲器管理單元(MMU),MMU能使單個軟件線程工作於硬件保護地址空間。但是在許多商用實時操作系統中,即使系統中含有這些硬件也沒采用MMU。 [2] 
當應用程序的所有線程共享同一存儲器空間時,任何一個線程將有意或無意地破壞其它線程的代碼、數據或堆棧。異常線程甚至可能破壞內核代碼或內部數據結構。例如線程中的指針錯誤就能輕易使整個系統崩潰,或至少導致系統工作異常。 [2] 
就安全性和可靠性而言,基於進程的實時操作系統(RTOS)的性能更為優越。為生成具有單獨地址空間的進程,RTOS只需要生成一些基於RAM的數據結構並使MMU加強對這些數據結構的保護。基本思路是在每個關聯轉換中“接入”一組新的邏輯地址。MMU利用當前映射,將在指令調用或數據讀寫過程中使用的邏輯地址映射為存儲器物理地址。MMU還標記對非法邏輯地址進行的訪問,這些非法邏輯地址並沒有映射到任何物理地址。 [2] 
這些進程雖然增加了利用查詢表訪問存儲器所固有的系統開銷,但其實現的效益很高。在進程邊界處,疏忽或錯誤操作將不會出現,用户接口線程中的缺陷並不會導致其它更關鍵線程的代碼或數據遭到破壞。在可靠性和安全性要求很高的複雜嵌入式系統中,仍然存在採無存儲器保護的操作系統的情況,這實在有些不可思議。 [2] 
採用MMU還有利於選擇性地將頁面映射或解映射到邏輯地址空間。物理存儲器頁面映射至邏輯空間,以保持當前進程的代碼,其餘頁面則用於數據映射。類似地,物理存儲器頁面通過映射可保持進程的線程堆棧。RTOS可以在每個線程堆棧解映射之後,很容易地保留邏輯地址所對應的頁面內容。這樣,如果任何線程分配的堆棧發生溢出,將產生硬件存儲器保護故障,內核將掛起該線程,而不使其破壞位於該地址空間中的其它重要存儲器區,如另一線程堆棧。這不僅在線程之間,還在同一地址空間之間增加了存儲器保護。 [2] 
存儲器保護(包括這類堆棧溢出檢測)在應用程序開發中通常非常有效。採用了存儲器保護,程序錯誤將產生異常並能被立即檢測,它由源代碼進行跟蹤。如果沒有存儲器保護,程序錯誤將導致一些細微的難以跟蹤的故障。實際上,由於在扁平存儲器模型中,RAM通常位於物理地址的零頁面,因此甚至NULL指針引用的解除都無法檢測到。 [2] 

MMU系列介紹

  • X86系列的MMU
INTEL出品的80386CPU或者更新的CPU中都集成有MMU. 可以提供32BIT共4G的地址空間 [3] 
X86 MMU提供的尋址模式有4K/2M/4M的PAGE模式(根據不同的CPU,提供不同的能力),此處提供的是大部分操作系統使用的4K分頁機制的描述,並且不提供ACCESS CHECK的部分。 [3] 
1.涉及的寄存器: [3] 
a) GDT
b) LDT
c) CR0
d) CR3
e) SEGMENT REGISTER
2.虛擬地址到物理地址的轉換步驟: [3] 
a) SEGMENT REGISTER作為GDT或者LDT的INDEX,取出對應的GDT/LDT ENTRY。
注意: SEGMENT是無法取消的,即使是FLAT模式下也是如此。 説FLAT模式下不使用SEGMENT REGISTER是錯誤的.。任意的RAM尋址指令中均有DEFAULT的SEGMENT假定。 [3] 
ENTRY格式
typedef struct
{
UINT16 limit_0_15;
UINT16 base_0_15;
UINT8 base_16_23;
UINT8 accessed : 1;
UINT8 readable : 1;
UINT8 conforming : 1;
UINT8 code_data : 1;
UINT8 app_system : 1;
UINT8 dpl : 2;
UINT8 present : 1;
UINT8 limit_16_19 : 4;
UINT8 unused : 1;
UINT8 always_0 : 1;
UINT8 seg_16_32 : 1;
UINT8 granularity : 1;
UINT8 base_24_31;
} CODE_SEG_DESCRIPTOR,*PCODE_SEG_DESCRIPTOR;
typedef struct
{
UINT16 limit_0_15;
UINT16 base_0_15;
UINT8 base_16_23;
UINT8 accessed : 1;
UINT8 writeable : 1;
UINT8 expanddown : 1;
UINT8 code_data : 1;
UINT8 app_system : 1;
UINT8 dpl : 2;
UINT8 present : 1;
UINT8 limit_16_19 : 4;
UINT8 unused : 1;
UINT8 always_0 : 1;
UINT8 seg_16_32 : 1;
UINT8 granularity : 1;
UINT8 base_24_31;
} DATA_SEG_DESCRIPTOR,*PDATA_SEG_DESCRIPTOR;
共有4種ENTRY格式,此處提供的是CODE SEGMENT和DATA SEGMENT的ENTRY格式. FLAT模式下的ENTRY在base_0_15,base_16_23處為0,而limit_0_15,limit_16_19處為0xfffff. granularity處為1。表名SEGMENT地址空間是從0到0XFFFFFFFF的4G的地址空間。 [3] 
b) 從SEGMENT處取出BASE ADDRESS 和LIMIT. 將要訪問的ADDRESS首先進行ACCESS CHECK,是否超出SEGMENT的限制。 [3] 
c) 將要訪問的ADDRESS+BASE ADDRESS,形成需要32BIT訪問的虛擬地址. 該地址被解釋成如下格式: [3] 
typedef struct
{
UINT32 offset :12;
UINT32 page_index :10;
UINT32 pdbr_index :10;
} VA,*LPVA;
d) pdbr_index作為CR3的INDEX,獲得到一個如下定義的數據結構 [3] 
typedef struct
{
UINT8 present :1;
UINT8 writable :1;
UINT8 supervisor :1;
UINT8 writethrough:1;
UINT8 cachedisable:1;
UINT8 accessed :1;
UINT8 reserved1 :1;
UINT8 pagesize :1;
UINT8 ignoreed :1;
UINT8 avl :3;
UINT8 ptadr_12_15 :4;
UINT16 ptadr_16_31;
}PDE,*LPPDE;
e) 從中取出PAGE TABLE的地址. 並且使用page_index作為INDEX,得到如下數據結構 [3] 
typedef struct
{
UINT8 present :1;
UINT8 writable :1;
UINT8 supervisor :1;
UINT8 writethrough:1;
UINT8 cachedisable:1;
UINT8 accessed :1;
UINT8 dirty :1;
UINT8 pta :1;
UINT8 global :1;
UINT8 avl :3;
UINT8 ptadr_12_15 :4;
UINT16 ptadr_16_31;
}PTE,*LPPTE;
f) 從PTE中獲得PAGE的真正物理地址的BASE ADDRESS. 此BASE ADDRESS表名了物理地址的.高20位. 加上虛擬地址的offset就是物理地址所在了.
  • ARM系列的MMU
ARM出品的CPU,MMU作為一個協處理器存在。根據不同的系列有不同搭配。需要查詢DATASHEET才可知道是否有MMU。如果有的話,一定是編號為15的協處理器。可以提供32BIT共4G的地址空間。 [3] 
ARM MMU提供的分頁機制有1K/4K/64K 3種模式,這裏介紹的是操作系統通常使用的4K模式。
涉及的寄存器,全部位於協處理器15。 [3] 
ARM cpu地址轉換涉及三種地址:虛擬地址(VA,Virtual Address),變換後的虛擬地址(MVA,Modified Virtual Address),物理地址(PA,Physical Address)。沒有啓動MMU時,CPU核心、cache、MMU、外設等所有部件使用的都是物理地址。啓動MMU後,CPU核心對外發出的是虛擬地址VA,VA被轉換為MVA供cache、MMU使用,並再次被轉換為PA,最後使用PA讀取實際設備。 [3] 
ARM沒有SEGMENT的寄存器,是真正的FLAT模式的CPU。給定一個ADDRESS,該地址可以被理解為如下數據結構: [3] 
typedef struct
{
UINT32 offset :12;
UINT32 page_index :8;
UINT32 pdbr_index :12;
} VA,*LPVA;
從MMU寄存器2中取出BIT14-31,pdbr_index就是這個表的索引,每個入口為4BYTE大小,結構為
typedef struct
{
UINT32 type :2; //always set to 01b
UINT32 writebackcacheable:1;
UINT32 writethroughcacheable:1;
UINT32 ignore :1; //set to 1b always
UINT32 domain :4;
UINT32 reserved :1; //set 0
UINT32 base_addr:22;
} PDE,*LPPDE;
獲得的PDE地址,獲得如下結構的ARRAY,用page_index作為索引,取出內容。
typedef struct
{
UINT32 type :2; //always set to 11b
UINT32 ignore :3; //set to 100b always
UINT32 domain :4;
UINT32 reserved :3; //set 0
UINT32 base_addr:20;
} PTE,*LPPTE;
從PTE中獲得的基地址和上offset,組成了物理地址 [3] 
PDE/PTE中其他的BIT,用於訪問控制。這邊講述的是一切正常,物理地址被正常組合出來的狀況。 [3] 
ARM/X86 MMU使用上的差異: [3] 
⒈X86始終是有SEGMENT的概念存在. 而ARM則沒有此概念(沒有SEGMENT REGISTER.).
⒉ARM有個DOMAIN的概念. 用於訪問授權. 這是X86所沒有的概念. 當通用OS嘗試同時適用於此2者的CPU上,一般會拋棄DOMAIN的使用。 [3] 

MMU工作機理

現代的內存管理單元是以頁的方式,分割虛擬地址空間(處理器使用的地址範圍)的;頁的大小是2的n次方,通常為幾KB(千字節)。地址尾部的n位(頁大小的2的次方數)作為頁內的偏移量保持不變。其餘的地址位(address)為(虛擬)頁號。 [4] 

MMU頁表條目

內存管理單元通常藉助一種叫做轉譯旁觀緩衝器(Translation Lookaside Buffer,縮寫為TLB)的相聯高速緩存(associative cache)來將虛擬頁號轉換為物理頁號。當後備緩衝器中沒有轉換記錄時,則使用一種較慢的機制,其中包括專用硬件(hardware-specific)的數據結構(Data structure)或軟件輔助手段。這個數據結構稱為分頁表,頁表中的數據就叫做分頁表項(page table entry,縮寫為PTE)。物理頁號結合頁偏移量便提供出了完整的物理地址。 [4] 
頁表或轉換後備緩衝器中數據項包括的信息有:
一、“髒位”(頁面重寫標誌位,dirty bit)——表示該頁是否被寫過。
二、“訪問位”(accessed bit)——表示該頁最後使用於何時,以便於最近最少使用頁面置換算法(least recently used page replacement algorithm)的實現。
三、哪種進程可以讀寫該頁的信息,例如用户模式(user mode)進程還是特權模式(supervisor mode)進程。
四、該頁是否應被高速緩衝的信息。 [4] 
有時,TLB或PTE會禁止對虛擬頁的訪問,這可能是因為沒有物理隨機存取存儲器(random access memory)與虛擬頁相關聯。如果是這種情況,MMU將向CPU發出頁錯誤(page fault)的信號。操作系統(operating system)將進行處理,也許會嘗試尋找RAM的空白幀,同時創建一個新的PTE將之映射到所請求的虛擬地址。如果沒有空閒的RAM,可能必須關閉一個已經存在的頁面,使用一些替換算法,將之保存到磁盤中(這被稱之為頁面調度(paging)。在一些MMU中,PTEs或者TLB也存在一些缺點,在這樣的情況下操作系統將必須釋放空間以供新的映射。 [4] 

MMU益處

有些情況下,頁錯誤的出現表示可能存在軟件錯誤,並能夠被應用內存管理單元的內存保護特性通過禁止出錯程序避免出現非法訪問其他程序內存。通常地, 操作系統會為每個程序分配虛擬內存地址。
此外,內存管理單元能夠減少程序的內存碎片化現象。當程序分配並釋放內存塊後,釋放的內存可能出現碎片化,從而導致最大的連續可用內存塊遠小於已分配內存總量。在虛擬內存實現後,虛擬內存可以映射多個不連續的物理內存區塊為一個連續區塊,而這種不連續分配機制得益於內存分頁。
參考資料
  • 1.    (美)索加,班諾拉.MPC5554 5553微處理器揭秘:北京航空航天大學出版社,2010.11:第47頁
  • 2.    羅鈞.嵌入式數字媒體處理器原理與開發 基於TI達芬奇DM8168系列:北京航空航天大學出版社,2016.06:第164頁
  • 3.    青島東合信息技術有限公司.CORTEX-M3開發技術及實踐:西安電子科技大學出版社,2013.07:第5頁
  • 4.    夏曉, 林正浩, 陸麗達. 內存管理單元的原理及電路設計[J]. 信息化研究, 2003(12).