⑴ PowerPC E500 MMU詳解
1. 什麼是MMU?
MMU 是 Memory Management Unit 的縮寫,中文名稱為 內存管理單元 。MMU是負責處理器(CPU)的內存訪問請求的計算機硬體,其功能包括虛擬地址到物理地址的轉換(即虛擬內存管理)、內存保護、緩存cache的控制等。
MMU是一個與軟體密切相關的硬體部件,也是運行linux等依賴MMU內存管理單元操作系統內核機制的最大部件之一。如果處理器沒有MMU,CPU內部執行單元產生的內存地址信號將直接通過地址匯流排發送到晶元引腳,被內存晶元接收,這就是 物理地址(physical address),簡稱PA 。英文physical代表物理的接觸,所以PA就是與內存晶元physically connected的匯流排上的信號。
如果MMU存在且啟用,CPU執行單元產生的地址信號在發送到內存晶元之前將被MMU截獲,這個地址信號稱為 虛擬地址(virtual address),簡稱VA ,MMU會負責把VA翻譯成另一個地址,然後發到內存晶元地址引腳上,即VA映射成PA。
2. PowerPC E500 MMU
PowerPC (Performance Optimization With Enhanced RISC – Performance Computing,有時簡稱PPC)是一種 精簡指令集(RISC)架構的中央處理器(CPU) ,其基本的設計源自IBM(國際商用機器公司)的POWER(Performance Optimized With Enhanced RISC)。
PowerPC晶元憑借其出色的性能和高度整合和技術先進特性在網路通信應用,工業控制應用,家用數字化,網路存儲領域,軍工領域,電力系統控制等都具有非常廣泛的應用。
PowerPC的E500是飛思卡爾(FreeScale)基於Power Architecture的32位微處理器核心。E500系列核心有三個版本,即 E500v1,E500v2的E500mc 。64位版本的E500mc演變為E5500核心,並於2010年推出。
PowerPC E500 核心(後簡稱「E500」)採用了兩級內存管理單元(MMU)體系結構。 L1-MMU、L2-MMU為該結構中的兩個硬體單元。 E500通過L1-MMU和L2-MMU,以及一些輔助寄存器和指令來實現虛實地址的轉換。E500v1核心是把32位有效地址轉換為32位物理地址(使用41位臨時虛擬地址);E500v2核心是把32位有效地址轉換為36位物理地址。
L1-MMU特性:
1. 兩個4條目的全關聯TLB數組(一個用於指令訪問,一個用於數據訪問支持9種(E500v1)或11種(E500v2)頁面大小,即I-L1VSP和D-L1VSP
2. 兩個64 entry, 4路set-associative TLB數組(一個用於指令訪問,一個用於數據訪問),僅支持4kbyte頁面,即I-L1TLB4K和D-L1TLB4K。
3. L1 MMU訪問與L1緩存訪問(地址轉換/L1緩存)並行訪問可以完全流水線化,這樣每個時鍾都可以完成一個載入/存儲。
4. 執行L1 TLB查找的指令訪問與數據訪問是並行的。
5. 所有L1 TLB條目都是駐留在L2 MMU中的TLB條目的一個適當子集。
6. 自動執行失效操作,以保持L2 TLB的一致性。
L2-MMU特性:
1. 16個條目,完全關聯的統一的L2 TLB數組(用於指令和數據訪問)TLB1支持9種(E500v1)或11種(E500v2)頁面大小,即TLB1,用於段式映射。
2. 256表項2-way (E500v1)或512-entry 4-way (E500v2)集關聯統一L2 TLB array (TLB0)僅支持4kbyte的頁面,即TLB0,用於進行頁式映射。
3.對 TLB miss異常的支持。
4. TLB1和TLB0由tlbre, tlbwe, tlbsx, tlbsync, tlbivax和mtspr指令進行管理。
5. 執行由當前核心tlbivax指令產生的TLB1和TLB0失效。支持TLB1和TLB0由其他核心執行的tlbivax指令導致的失效操作。
6. TLB1中實現的IPROT位防止了無效,從而保護關鍵表項(通過設置IPROT位來指定)不會失效。
2.1 Effective-to-Real Address Translation流程
Effective-to-Real Address Translation(虛擬地址到物理地址的翻譯)流程如下所示:
因為E500最小頁的大小是4 Kbytes,所以低12位通常被用做4K頁內的索引並且不需要進行翻譯。首先檢查L1 MMU(指令或數據)是否命中地址翻譯。如果沒有,翻譯請求將被轉發到(指令和數據)L2 MMU中進行處理。
E500v1核心和E500v2核心支持的頁大小可見下表,E500v2核心比E500v1核心多支持了1Gbyte和4Gbyte頁的大小。
2.2 MMU entry欄位
在TLB中,數據都是按行存放的,一行稱之為一個entry。一個entry包含了若干bit位下面是MMU entry的bit位含義描述:
V:用來表示當前entry是否有效。為0時表示無效,為1時表示有效。在系統reset之後,所有entry的V位都設為0。
TS:上面地址空間中的AS。為0表示地址空間0,為1表示地址空間1。
TID[0:7]:上面地址空間中的PID。TID為0時,忽略PID的比較。在Linux中,全為0。
EPN[0:19]:虛擬頁楨號。根據頁大小不同,有效的位數頁不同。
RPN[0:19]:物理頁楨號。
SIZE[0:3]:表示當前entry的頁大小。
PERMIS[0:5]:用於描述當前entry的訪問控制位。分別是UR,SR,UW,SW,UX,SX。分別表示用戶態和內核態的讀/寫/執行許可權。
WIMGE[0:4]:W表示當前entry是write through還是write back。I表示當前entry是否忽略Cache。M表示對此數據區的訪問需要進行存儲一致性處理。G表示對相應存儲區域進運行保護。E表示當前entry是小端還是大端。
X0,X1:描述一些額外屬性。
U[0:3]:自定義用途。
IPROT:當IPROT為1時,表示當前entry被保護。不能使用tlbivax指令無效該entry。只能用tlbwe指令清除。在E500中只有TLB1支持該位,在TLB0中,該位一直為0。
TLB相關指令、寄存器和異常如下表所示:
2.3 MMU相關寄存器
PID0-2寄存器: 用於保存當前進程的PID,該寄存器只有54-63位有效。
MMUCSR0寄存器: 用於使TLB0和TLB1的所有entry無效。該寄存器L2TLB0_FI位使無效TLB0的所有entry;L2TLB1_FI位使無效TLB1的所有entry。
MMUCFG寄存器: 用來保存當前MMU的配置信息,包括PID寄存器數量,大小,TLB的數量等。
TLB0CFG和TLB1CFG寄存器: 用於描述TLB0和TLB1的配置信息,包括entry數量,頁表大小等信息。
MAS輔助寄存器 (MAS0–MAS4, MAS6–MAS7,沒有實現MAS5),主要作用就是維護MMU中TLB的entry。
MAS0寄存器: 決定寫哪個TLB的哪個entry。TLBSEL欄位用於選擇要操作的TLB,0表示TLB0,1表示TLB1。ESEL欄位用於選擇TLB的entry。當使用TLB1 時,ESEL欄位中低4位有效,用於選擇TLB1中的entry。當使用TLB0時,ESEL中只有最低位有效,因為TLB0是兩路組相連。NV位用於確定如何替換TLB0中的entry。
MAS1-3中存放的各個欄位與TLB entry中的各個欄位一一對應。
MAS4寄存器
該寄存器主要用於存放當TLB miss異常發生時,對MAS0-3寄存器自動載入而使用的默認值,也就是說MAS4寄存器的內容是硬體寫入的。為了提高TLB miss異常的效率,在異常出現時,E500會用MAS4寄存器中的值,自動填寫MAS0-2寄存器中的一部分內容:
MAS0[TLBSEL] <- MAS4[TLBSELD]
MAS1[TID] <- MAS4[TIDSELD]
MAS1[TSIZE] <- MAS4[TSIZED]
MAS2[X0,X1] <- MAS4[X0D,X1D]
MAS2[WIMGE] <- MAS4[WD,ID,MD,GD,ED]
MAS6寄存器: 用於對TLB進行檢索,MAS6寄存器提供SPID0和SAS,也就是PID和AS欄位。
MAS7寄存器(只E500v2支持): 包含實現的RPN的高階地址位支持超過32位的物理地址。
2.4 TLB相關指令和實現
SkyEye,中文全稱天目全數字實時模擬軟體 ,是基於可視化建模的硬體行為級模擬平台,支持用戶通過拖拽的方式對硬體進行行為級別的模擬和建模。SkyEye支持PowerPC架構E500處理器的指令集模擬,為了支持運行包含MMU單元的操作系統(例如VxWorks、Linux等),需要實現對MMU的模擬功能,其中包含TLB(Translation Lookaside Buffer,轉換檢測緩沖區)相關的指令實現和MMU虛實翻譯過程。
與TLB相關的指令如下:
tlbre指令: tlbre指令是從L2 MMU中讀取單個TLB條目的各欄位內容,並寫入到MMU輔助(MAS)寄存器的相應欄位中。讀取的entry條目是由MAS0的TLBSEL、ESEL和MAS2寄存器的EPN欄位指定,在讀TLB1時,ESEL有效,EPN無效;在讀TLB0時,ESEL高2位有效,EPN有效。注意,對於E500v2,如果HID0[EN_MAS7_UPDATE] = 1, MAS7也被更新為TLB表項的物理地址。
tlbwe指令: 該指令是從MMU輔助寄存器(MAS)中提取各欄位內容並寫入到L2 MMU中的單個TLB條目中。寫入的entry條目是由MAS0的TLBSEL、ESEL和MAS2寄存器的EPN欄位指定,在寫TLB1時,ESEL有效,EPN無效;在寫TLB0時,ESEL高2位有效,EPN有效。注意,對於E500v2,MAS7中的RPN欄位也寫入到選定的TLB條目中 。
tlbsx指令: 指令格式為tlbsx RA,RB。指令作用是使用RA+RB的地址,配合MAS6寄存器對TLB進行查找,如果命中,則將結果放入MAS0-3寄存器。
指令實現:
tlbivax指令: TLB無效操作,這條指令將使所有與此計算出的虛擬地址相對應的TLB表項失效,同樣也會使其他處理器上TLB中包含的TBL表項失效。
根據有效地址EA的Bit61位決定是否是無效全部的entry,如果不是,計算出相對應的entry,然後設置entry->v = 0用於使表項失效。
tlbsync指令: 該指令用於同步對TLB entry的讀寫。主要用途是將tlbivax指令的更新entry廣播到系統匯流排上,用來同步其他處理器,該指令只在SMP系統中有效。
2.5 系統復位後的TLB初始狀態
復位後,L1和L2 MMU中的TLB表項全部失效,TLB1的第一個entry需要初始化賦值,如下所示:
參考文獻:
[1] PowerPC™ e500 Core Family Reference Manual.pdf
⑵ 什麼是MMU,TLB
MMU是Memory Management Unit的縮寫,中文名是內存管理單元,它是中央處理器(CPU)中用來管理虛擬存儲器、物理存儲器的控制線路,同時也負責虛擬地址映射為物理地址,以及提供硬體機制的內存訪問授權,多用戶多進程操作系統。
TLB(Translation Lookaside Buffer)傳輸後備緩沖器是一個內存管理單元用於改進虛擬地址到物理地址轉換速度的緩存。
TLB是一個小的,虛擬定址的緩存,其中每一行都保存著一個由單個PTE組成的塊。如果沒有TLB,則每次取數據都需要兩次訪問內存,即查頁表獲得物理地址和取數據。
⑶ 考題,快:什麼是虛擬存儲器它主要解決什麼問題
擴大存儲容量。
虛擬存儲器即虛擬內存,虛擬內存是計算機系統內存管理的一種技術。針對物理地址的直接映射的許多弊端,計算機的設計中就採取了一個虛擬化設計,就是虛擬內存。CPU通過發出虛擬地址,虛擬地址再通過MMU翻譯成物理地址,最後獲得數據。
(3)10mmu技術是什麼意思擴展閱讀:
注意事項:
基於主機的虛擬化存儲技術其就是位於第三層的虛擬化存儲技術管理軟體。在現實應用中,這個軟體通常是有操作系統下的邏輯卷管理軟體來實現。
如Windows操作系統下面的自動卷管理軟體。不過從筆者的經驗來看,還是採用操作系統自帶的卷管理軟體為好。在兼容性、性能上面都比較優越,而且還是的。通過這個虛擬層,可以將存儲設備組成邏輯磁碟與邏輯卷。
⑷ MMU和虛擬內存的問題
MMU就是干這個的,虛擬內存地址轉譯。
頁面是MMU用來管理內存單元的,x86硬體體系下提供2種頁面尺寸,4k和4M,而x64為4k和2M。大頁面轉譯速度快,但缺點是往往把代碼和數據放在同一頁中,無法起到保護。
進程的4G內存空間是內核創建進程時候給予的,默認情況下2G屬於內核空間,直接映射至內核,另外2G為用戶空間,這點在32位系統中基本屬於慣例,linux/unix某些版本可以支持8GB虛擬內存地址,而windows最多隻能開啟3GB,即內核壓縮至1GB。
默認採用4GB內存地址的原因是32位外部匯流排最多隻能定址4GB內存,實際可以是任意大小,但會帶來空間和速度上的損失,因而4GB對大多數情況而言是最佳選擇。
進程創建時系統會為其提供一個頁表,這個頁表是一個2級數據結構(超過4G則需要3級,/PAE啟動選項就會啟用3級頁表),其中512個頁表是內核負責維護,進程無法改變他,進程可以使用的是獨立的另512個。你應該已經知道,32位系統的內存定址是直接使用32位數據的,對於進程而言,這32位的數據並非實際內存地址,其中10位用來表示頁分組索引,每個進程都會維護這樣一個分組索引;而另10位用來表示頁索引,用來在分組中定位頁面,最後12位則是相對地址,之所以是12位是因為windows採用了4k的頁表,12位可以完全覆蓋。
也就是說,內存被分為1024組,每組內1024個頁,每頁4k,總共4GB。開啟PAE後情況稍稍有所變化,內存被分為2048組,每組內512個頁,每頁4k。系統維護512組,所以用戶進程得以獲得剩下的1536組共3GB。每個分組項是32位,4位元組長,PAE下是8位元組,每個頁是4位元組。所以總共是4M,你在這方面沒理解錯。不過進程只維護2M,另2M是內核維護的,進程只能去讀取而不能修改它。他位於虛擬控制項中屬於內核的那2G。
整個4GB內存至此就完全分配完畢了,標准情況下,用戶進程操作的只有2G,因此對於超過2GB內存的系統來說,進程無法使用全部內存,這也是pae和3gb的由來。
這么分配內存的根本原因是MMU,進程在運行中要用到實際物理頁面時候他對此頁面的實際地址是一無所知的,每個進程都擁有獨立的2GB內存空間和所有進程共享的2GB內核空間,從而最大限度的保護進程內存,防止寫其他進程的數據。這個2級的頁表結構是MMU可讀取的,PAE的第三級則是軟體的,因此PAE獲得了最大128G的內存空間,但犧牲了硬體級的速度。
無論有沒有虛擬內存,頁表都必須存在,因為cpu會直接讀取頁表結構來確定內存地址。如果使用了虛擬內存,那麼有可能操作一個頁面時會發現頁面不可用(無虛擬內存時這意味著out of memory,還有很多原因會導致頁面錯誤,這些是系統內核的中斷處理去負責),就會觸發一個頁面錯誤,這個頁面錯誤屬於硬體中斷,操作系統提供一個中斷處理函數,用來換頁,頁表的數據會自動被cpu讀取,並換入物理內存,這也是為什麼沒有MMU的系統根本不可能實現虛擬內存的原因,換頁是一個硬體中斷,軟體實現它的代價太過高昂。
關於ARM,沒有讀過文檔,但他的MMU並非一個固定包含的模塊,而是編號15的協處理器,你需要查看實際晶元製造商的data sheet來確定是否包含MMU,包含MMU的話(一般支持win ce就肯定有MMU,只有dos這種系統無需MMU),其處理模式應該類似於此,可能頁表的格式,或頁大小有些區別,但技術上來說是一樣的。對於沒有MMU的硬體,高級語言的動態內存分配幾乎無法實現,因為進程的堆棧在初始化時就固定了,且不可更改。ucLinux利用一個系統維護的內存池實現了動態內存分配,因此一般採用ucLinux的硬體都不帶MMU