1.MMU簡介
MMU(Memory Management Unit),內(nèi)存管理單元,主要職責(zé):將虛擬地址映射為物理地址,提供硬件機制的內(nèi)存訪問權(quán)限檢查。
2.基本概念
虛擬地址(Virtual Address,VA),修改后的虛擬地址(Modified VA),物理地址(Phisical Address)
VA是CPU使用的地址,MVA是MMU、Caches使用的,他們的映射關(guān)系:
(1)cpu看到的是VA
(2)caches和MMU使用的是MVA,
(3)實際物理設(shè)設(shè)備使用的是PA。
3.地址轉(zhuǎn)換中的基本概念
地址的轉(zhuǎn)換就像是數(shù)學(xué)中映射,利用函數(shù)公式,多對1,就是多個虛擬地址對應(yīng)同一個物理地址。
這里地址轉(zhuǎn)換用的是頁表的方式。
(1)頁表
頁表是由一個個表項(Entry,又稱作描述符)組成的物理表,每個頁表項或是一個物理頁(一塊物理內(nèi)存,大小為1k,4k不等)的起始地址,或是一個二級頁表的地址(當(dāng)是一個二級頁表的地址時,又可以稱該頁表為頁描述符)。所有的頁表都用物理地址訪問。
(2)表項(描述符)的分類
依據(jù)描述符保存的內(nèi)容,可以分為兩類。
一類保存的是直接的物理頁或段的起始地址,如段描述符、大頁、小頁、極小頁描述符。
另一類保存的是二級頁表的物理地址,如粗頁表描述符,細(xì)頁表描述符。
(3)一級映射與二級映射
一級映射,是指以段(Section,大小1MB)的方式進(jìn)行轉(zhuǎn)換。
二級映射,是以頁的方式進(jìn)行轉(zhuǎn)換。ARM頁大小由三種:1k,4k,64k。
4.地址轉(zhuǎn)換的過程
(1)CPU發(fā)出一個VA,是怎么轉(zhuǎn)換為MVA的
這在上圖可以看到,是通過一個硬件電路轉(zhuǎn)換的。
在ARM9里面,如果VA<32M,利用進(jìn)程標(biāo)識號PID轉(zhuǎn)換得到MVA
過程如下:
if(VA < 32M)
MVA = VA | ( PID<<25 )
else
MVA = VA
只是上面的過程是由硬件實現(xiàn)的。
這樣為VA進(jìn)行了一級映射,為什么呢?在linux系統(tǒng)里,每個進(jìn)程的地址空間0-4G,0-3G是進(jìn)程獨有的,稱為用戶空間,3G-4G是系統(tǒng)的,稱為內(nèi)核空間,所有進(jìn)程共享。如果兩個進(jìn)程所用的VA有重疊,在切換進(jìn)程時,為了把重疊的VA映射到不同的PA上,需要重建頁表、使無效caches和TLBS。使用了MVA,使進(jìn)程在VA相同的情況下,使用不同的MVA,進(jìn)而PA也不同。這就是在VA與PA之間加上一次到MVA的映射的意義。
(2)MVA到PA的轉(zhuǎn)換
上面說了,虛擬地址到物理地址的轉(zhuǎn)換有兩種方式:公式映射+頁表轉(zhuǎn)換。
概念上面也介紹過了。
這里就進(jìn)行實際的轉(zhuǎn)換說明。
首先,給定一個MVA,要進(jìn)行轉(zhuǎn)換,先要找到一級頁表,怎么找?
有一個寄存器,TTB寄存器,頁表基地址寄存器,負(fù)責(zé)保存一級頁表的基地址,當(dāng)然是物理地址。
TTB寄存器是集成在CP15協(xié)處理器中的,
TTB的格式:
因此,一級頁表的地址是16k對齊的,因為[14:0]要求為0.
一級頁表的描述符格式:
一級頁表的表項,可以是個段描述符,粗頁表描述符或細(xì)頁表描述符。
共同點是,每個描述符都代表1MB的物理地址空間。
不同點:段描述符直接指向一個1MB地址空間,可以直接訪問;而頁表描述符,顧名思義,就是指向一個二級頁表,還需要另一次映射。
二級頁表的描述符格式:
二級頁表有兩種:粗頁表(Coarse Page Table )+細(xì)頁表( Fine Page Table)
粗頁表與細(xì)頁表的異同:粗頁表有最多256個表項,每個表項可表示4kb空間,如果表項是個大頁頁表描述符,則連續(xù)16個表項都表示同一個大頁描述符。
細(xì)頁表中每個表項代表1kb,指向一個極小頁;也可擴展成4k的小頁,64k的大頁。
頁表的結(jié)構(gòu)與格式就是這些了。。下面看轉(zhuǎn)換的具體過程
段地址轉(zhuǎn)換
大頁地址轉(zhuǎn)換
小頁的地址轉(zhuǎn)換
極小頁的地址轉(zhuǎn)換