解析S3C2410 MMU(存儲器管理單元)
我們大致了解了MMU在我們的機(jī)器中扮演了什么角色以及它基本的工作內(nèi)容是什么,下面我們將舉例子說明它究竟是如何工作的(注意,本例中的MMU并無針對某種特定的機(jī)型,它是所有MMU工作的一個抽象)。
我們已經(jīng)知道,大多數(shù)使用虛擬存儲器的系統(tǒng)都使用一種稱為分頁(paging)的技術(shù),就象我們剛才所舉的例子,虛擬地址空間被分成大小相同的一組頁,每個頁有一個用來標(biāo)示它的頁號(這個頁號一般是它在該組中的索引,這點和C/C++中的數(shù)組相似)。在上面的例子中0~4K的頁號為0,4~8K的頁號為1,8~12K的頁號為2,以此類推。而虛擬地址(注意:是一個確定的地址,不是一個空間)被MMU分為2個部分,第一部分是頁號索引(page Index),第二部分則是相對該頁首地址的偏移量(offset). 。我們還是以剛才那個16位機(jī)器結(jié)合下圖進(jìn)行一個實例說明,該實例中,虛擬地址8196被送進(jìn)MMU,MMU把它映射成物理地址。16位的CPU總共能產(chǎn)生的地址范圍是0~64K,按每頁4K的大小計算,該空間必須被分成16個頁。而我們的虛擬地址第一部分所能夠表達(dá)的范圍也必須等于16(這樣才能索引到該頁組中的每一個頁),也就是說這個部分至少需要4個bit。一個頁的大小是4K(4096),也就是說偏移部分必須使用12個bit來表示(2^12= 4096,這樣才能訪問到一個頁中的所有地址),8196的二進(jìn)制碼如下圖所示:

該地址的頁號索引為0010(二進(jìn)制碼),既索引的頁為頁2,第二部分為000000000100(二進(jìn)制),偏移量為 4。頁2中的頁框號為6(頁2映射在頁框6,見上圖),我們看到頁框6的物理地址是24~28K。于是MMU計算出虛擬地址8196應(yīng)該被映射成物理地址 24580(頁框首地址+偏移量=24576+4=24580)。同樣的,若我們對虛擬地址1026進(jìn)行讀取,1026的二進(jìn)制碼為 0000010000000010,page index=0000=0,offset=010000000010=1026。頁號為0,該頁映射的頁框號為2,頁框2的物理地址范圍是 8192~12287,故MMU將虛擬地址1026映射為物理地址9218(頁框首地址+偏移量=8192+1026=9218)
以上就是MMU的工作過程。
下面我們針對s3c2410的MMU(注1)進(jìn)行講解。
S3c2410總共有4種內(nèi)存映射方式,分別是:
1.Fault (無映射)
2.Coarse Page (粗表)
3.Section (段)
4.Fine Page (細(xì)表)
我們以Section(段)進(jìn)行說明。
ARM920T是一個32bit的CPU,它的虛擬地址空間為2^32=4G。而在Section模式,這4G的虛擬空間被分成一個一個稱為段(Section)的單位(與我們上面講的頁在本質(zhì)上其實是一致的),每個段的長度是1M (而我們之前所使用的頁的長度是4K)。4G的虛擬內(nèi)存總共可以被分成4096個段(1M*4096=4G),因此我們必須用4096個描述符來對這組段進(jìn)行描述,每個描述符占用4個Byte,故這組描述符的大小為16KB (4K*4096),這4096個描述符構(gòu)為一個表格,我們稱其為Tralaton Table.

上圖是描述符的結(jié)構(gòu)
Section base address:段基地址(相當(dāng)于頁框號首地址)
AP: 訪問控制位Access Permission
Domain: 訪問控制寄存器的索引。Domain與AP配合使用,對訪問權(quán)限進(jìn)行檢查
C:當(dāng)C被置1時為write-through (WT)模式
B: 當(dāng)B被置1時為write-back (WB)模式
(C,B兩個位在同一時刻只能有一個被置1)
下面是s3c2410內(nèi)存映射后的一個示意圖:

我的s3c2410上配置的SDRSAM大小為64M,該SDRAM的物理地址范圍是0x3000 0000~0x33FF FFFF(屬于Bank 6),由于1個Section的大小是1M,所以該物理空間可以被分成64個物理段(頁框).
在Section模式下,送進(jìn)MMU的虛擬地址(注1)被分為兩部分(這點和我們上面舉的例子是一樣的),這兩部分為 Descriptor Index(相當(dāng)于上面例子的Page Index)和 Offset,descript index長度為12bit(2^12=4096,從這個關(guān)系式你能看出什么?:) ),Offset長度為20bit(2^20=1M,你又能看出什么?:)).觀察一下一個描述符(Descriptor)中的Section Base Address部分,它長度為12 bit,里面的值是該虛擬段(頁)映射成的物理段(頁框)的物理地址前12bit,由于每一個物理段的長度都是1M,所以物理段首地址的后20bit總是為0x00000(每個Section都是以1M對齊),確定一個物理地址的方法是 物理頁框基地址+虛擬地址中的偏移部分=Section Base Address20+Offset ,呵呵,可能你有點糊涂了,還是舉一個實際例子說明吧。假設(shè)現(xiàn)在執(zhí)行指令
MOV REG, 0x30000012
虛擬地址的二進(jìn)制碼為00110000 00000000 00000000 00010010
前 12位是Descriptor Index= 00110000 0000=768,故在Translation Table里面找到第768號描述符,該描述的Section Base Address=0x0300,也就是說描述符所描述的虛擬段(頁)所映射的物理段(頁框)的首地址為0x3000 0000(物理段(頁框)的基地址=Section Base Address左移20bit=0x030020=0x3000 0000),而Offset=000000 00000000 00010010=0x12,故虛擬地址0x30000012映射成的物理地址=0x3000 0000+0x12=0x3000 0012(物理頁框基地址+虛擬地址中的偏移)。你可能會問怎么這個虛擬地址和映射后的物理地址一樣?這是由我們定義的映射規(guī)則所決定的。在這個例子中我們定義的映射規(guī)則是把虛擬地址映射成和他相等的物理地址。我們這樣書寫映射關(guān)系的代碼:
void mem_mapping_linear(void)
{
unsigned long descriptor_index, section_base, sdram_base, sdram_size;
sdram_base=0x30000000;
sdram_size=0x 4000000;
for (section _base= sdram_base,descriptor_index = section _base>>20;
section _base sdram_base+ sdram_size;
評論