內(nèi)存管理單元(Memory Management Unit)簡稱MMU 功能: ①負(fù)責(zé)虛擬地址到物理地址的映射 ②提供硬件機(jī)制的內(nèi)存訪問權(quán)限檢查。 Q:內(nèi)存訪問權(quán)限檢查什么意思? A:舉個(gè)例子,比如在我們Windows系統(tǒng)的PC中,在一個(gè)時(shí)間段需要依次運(yùn)行A,B,C三個(gè)應(yīng)用程序,這三個(gè)程序在我們的內(nèi)存地址中都有其相對應(yīng)的地址空間。當(dāng)我們在運(yùn)行A程序出現(xiàn)錯(cuò)誤或者有可能會破壞B程序時(shí),這時(shí)由于內(nèi)存訪問權(quán)限的存在就使得A程序無法訪問B程序所在的內(nèi)存地址空間,從而避免了由于一個(gè)程序的錯(cuò)誤而導(dǎo)致?lián)p壞其它內(nèi)存空間的程序,這就是內(nèi)存訪問權(quán)限的作用。 這里我們具體看MMU的第一個(gè)功能:地址映射。 S3C2440中相關(guān)的結(jié)構(gòu)分布如下圖: 假設(shè)CPU要讀/寫外部存儲器SDRAM中的某一內(nèi)存地址的數(shù)據(jù),這時(shí)候有兩條路可以選擇: 1.④⑤ 2.①②③ 如果選擇第一條路: CPU發(fā)出的地址就可以理解為物理地址,然后經(jīng)過存儲管理器確定SDRAM中相應(yīng)的行與列最后讀取具體的數(shù)據(jù)。 如果選擇第二條路: CPU發(fā)出的地址就可以理解為虛擬地址,經(jīng)過MMU后出來的就可以認(rèn)為是物理地址,然后經(jīng)過存儲管理器確定SDRAM中相應(yīng)的行與列最后讀取具體的數(shù)據(jù)。這里MMU的作用就是把虛擬地址映射為物理地址。 總結(jié):CPU本身不關(guān)心地址是物理地址或是虛擬地址,它只管發(fā)出這個(gè)地址,然后最后讀取數(shù)據(jù)。不關(guān)注這個(gè)過程具體怎么完成的,平時(shí)我們寫程序時(shí)的鏈接地址,在CPU這里并不去區(qū)分什么物理地址還是虛擬地址,在它看來不管是什么都只是一個(gè)地址而已。 虛擬地址(VA,Virtual Address)到物理地址(PA,Physical Address)的轉(zhuǎn)換過程: 這里我們只是簡單說一下,不需要太深究,因?yàn)檫@些都是由MMU中硬件完成的,如果想具體的了解可以參考韋東山老師寫的《嵌入式Linux應(yīng)用開發(fā)完全手冊》。 VA到PA一般有兩種方法:1.用一個(gè)確定的數(shù)學(xué)公式進(jìn)行轉(zhuǎn)換。 2.用表格存儲虛擬地址對應(yīng)的物理地址。這類表格稱為頁表(Page table),頁表由一個(gè)個(gè)條目(Entry)組成,每個(gè)條目存儲了一段虛擬地址對應(yīng)的物理地址及其訪問權(quán)限,或者是下一級頁表的地址。 mips使用的是第一種方法: VA=f(PA)=0xA0000000+PA,也就是PA=0xA0000000-VA。 我們學(xué)的ARM CPU用的是第二種方法,S3C2410/S3C2440最多會用到兩級頁表:①如果以段(Section,1MB)的方式進(jìn)行轉(zhuǎn)換時(shí)只用到一級頁表; ②以頁(Page)的方式進(jìn)行轉(zhuǎn)換時(shí)用到兩級頁表。這里的頁的大小有3種:大頁(64KB),小頁(4KB),極小頁(1KB)。條目也稱為“描述符(Descriptor)”,它有:段描述符、大頁描述符、小頁描述符、極小頁描述符,它們保存著段、大頁、小頁、極小頁的起始物理地址;粗頁表描述符、細(xì)頁表描述符,它們保存二級頁表的物理地址。 具體轉(zhuǎn)換過程: 1. 根據(jù)給定的虛擬地址找到一級頁表中的條目。 2. 如果此條目是段描述符,則返回物理地址,轉(zhuǎn)換結(jié)束,否則跳到3。 3. 如果此條目是二級頁表描述符,繼續(xù)利用虛擬地址在此二級頁表中找到下一個(gè)條目。 4. 如果第二個(gè)條目是頁描述符,則返回物理地址,轉(zhuǎn)換結(jié)束。 5. 其它情況出錯(cuò)。 舉個(gè)例子:我們用段的方式進(jìn)行轉(zhuǎn)換,由于ARM CPU是32位的,所以最大尋址范圍為2^32=4GB,也就是虛擬地址表示的范圍為0~4096MB,一個(gè)段為1MB,所以我們用的表格就是4096個(gè)1MB的段組成的,然后一個(gè)段保存著相應(yīng)的起始物理地址。 這里描述通過一級頁表形式的轉(zhuǎn)換過程圖: “TTB Base”代表一級頁表的地址。它的值存儲在協(xié)處理器CP15的寄存器C2(稱為頁表基址寄存器)。
一個(gè)段描述符為4個(gè)字節(jié)(32bit),那么4096個(gè)段占4096*4B=16KB,所以當(dāng)虛擬地址尋址范圍為0~4G時(shí),一個(gè)一級頁表的大小就為16KB。 由上可知一級頁表的地址必須是16KB對齊的,所以[14:0]都是0。0b100 0000 0000 0000=0x4000=16384=16*1024B=16KB。 上圖為一級頁表的描述符格式,低兩位0b10時(shí)表示為段描述符。由于這里我們直說關(guān)于段描述符的相關(guān)概念(也就是上圖中第三個(gè)格式),所以其它的就不說了,具體了解自己可以看書。 [31:21]: 稱為段基址(Section base address)。這個(gè)描述符低20位填充0后就是一塊1MB物理地址空間的起始地址。0b1 0000 0000 0000 0000 0000=0x10000=1048576=1024*1024B=1MB。 綜上:以段的方式進(jìn)行映射時(shí),虛擬地址MVA到物理地址PA的轉(zhuǎn)換過程如下: 1. 虛擬地址MVA。MVA[31:20]表示一級頁表索引,MVA[19:0]表示段內(nèi)陸址索引。 2. 頁表基地址寄存器。 3. 頁表基址寄存器[31:14]和MVA[31:20]組成一個(gè)低2位為0的32位地址,MMU利用這個(gè)地址找到段描述符。 4. 一級頁表中的一個(gè)32bit段描述符。 5. 段描述符的位[31:20]和MVA[19:0]構(gòu)成虛擬地址MVA對應(yīng)的物理地址PA。 |
|