ARM9學(xué)習(xí)筆記之——MMU
ARM9中的虛擬內(nèi)存是怎么實(shí)現(xiàn)的呢?以下是我的學(xué)習(xí)總結(jié)。
本文引用地址:http://2s4d.com/article/201611/318812.htmARM920T核是通過(guò)CP15來(lái)實(shí)現(xiàn)MMU機(jī)制的。
1. 關(guān)于地址
要知道虛擬內(nèi)存機(jī)制必須了解ARM9中的3種地址:VA(虛地址),MVA(修正后虛地址),PA(物理地址)
1)VA,是程序中的邏輯地址,0x00000000~0xFFFFFFFF。
2)MVA,由于多個(gè)進(jìn)程執(zhí)行,邏輯地址會(huì)重合。所以,跟據(jù)進(jìn)程號(hào)將邏輯地址分布到整個(gè)內(nèi)存中。MVA = (PID << 25) | VA
3)PA,MVA通過(guò)MMU轉(zhuǎn)換后的地址。
由2可知,地址位共32位,PID占7位,所以最多只能有 128 個(gè)進(jìn)程。而每個(gè)進(jìn)程可訪問(wèn)的地址位為25位,故只能分到 32MB 的地址空間。(注:不是物理內(nèi)存空間)
PID是存放在CP15協(xié)處理器的C13寄存器的高7位。
2. 關(guān)于虛擬內(nèi)存轉(zhuǎn)換
CP15從C2中獲得頁(yè)基址(TTB)。將 MVA 的高12位作為頁(yè)表索引值。獲得頁(yè)表項(xiàng):TTB [ MVA >> 20 ]。注意:頁(yè)表項(xiàng)是32位的。
從上可知,一個(gè)頁(yè)表最多有4096個(gè)頁(yè)表項(xiàng),也就是4K。那么,每個(gè)頁(yè)表項(xiàng)可以表示1MB的地址空間。
得來(lái)的項(xiàng)表項(xiàng)分三種:
1)段頁(yè)描述符,直接指向1MB的內(nèi)存空間。
2)粗頁(yè)描述符,有256個(gè)二級(jí)頁(yè)表項(xiàng),每個(gè)二級(jí)頁(yè)表項(xiàng)指向4KB的內(nèi)存空間。
3)細(xì)頁(yè)描述符,有1024個(gè)二級(jí)頁(yè)表項(xiàng),每個(gè)二級(jí)頁(yè)表項(xiàng)指向1KB的內(nèi)存空間。
## 粗頁(yè)描述符中存放的是粗頁(yè)表二級(jí)表的基址。將MVA的[19~12]位用來(lái)進(jìn)行二級(jí)頁(yè)表查尋。粗頁(yè)表二級(jí)表分兩種:
1)大頁(yè)描述符,一個(gè)描述符可以對(duì)應(yīng)64KB的內(nèi)存地址,但16個(gè)二級(jí)描述符對(duì)應(yīng)同一塊內(nèi)存。
2)小頁(yè)描述符,一個(gè)描述符只對(duì)應(yīng)4KB的內(nèi)存地址,每個(gè)二級(jí)描述符只對(duì)應(yīng)一塊內(nèi)存。
## 細(xì)頁(yè)描述符中存放的是細(xì)頁(yè)表二級(jí)表的基址。將MVA的[19~10],共計(jì)10位用于進(jìn)行二級(jí)頁(yè)表索引。二級(jí)頁(yè)表共1024個(gè)描述符。剩下的10位作為基址,可訪問(wèn)空間為1024B。
如下是內(nèi)存轉(zhuǎn)換圖:
思考:
通過(guò)上面的學(xué)習(xí),了解到ARM將4GB的地址訪問(wèn)空間分成128個(gè)32MB,每份供一個(gè)進(jìn)程使用。如此以來(lái),一個(gè)進(jìn)程的地址訪問(wèn)空間只有32MB。如進(jìn)程1的地址空間為[0x02000000~0x03FFFFFF]。如果超出這個(gè)范圍,地址訪問(wèn)就是非法的。
那ARM9在設(shè)計(jì)CP15時(shí)為什么不為每一個(gè)進(jìn)程指定一個(gè)單獨(dú)的頁(yè)表。這樣以來(lái),每個(gè)進(jìn)程就可以獨(dú)地?fù)碛?GB的地址空間。
如此以來(lái),進(jìn)程數(shù)就不再受限于128個(gè),可以多達(dá)1024個(gè)進(jìn)程。而每一個(gè)進(jìn)程的虛擬地址的空間可以擴(kuò)展到4GB。
評(píng)論