解析S3C2410 MMU(存儲(chǔ)器管理單元)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
MMU,全稱(chēng)Memory Manage Unit, 中文名——存儲(chǔ)器管理單元。
許多年以前,當(dāng)人們還在使用DOS或是更古老的操作系統(tǒng)的時(shí)候,計(jì)算機(jī)的內(nèi)存還非常小,一般都是以K為單位進(jìn)行計(jì)算,相應(yīng)的,當(dāng)時(shí)的程序規(guī)模也不大,所以內(nèi)存容量雖然小,但還是可以容納當(dāng)時(shí)的程序。但隨著圖形界面的興起還用用戶需求的不斷增大,應(yīng)用程序的規(guī)模也隨之膨脹起來(lái),終于一個(gè)難題出現(xiàn)在程序員的面前,那就是應(yīng)用程序太大以至于內(nèi)存容納不下該程序,通常解決的辦法是把程序分割成許多稱(chēng)為覆蓋塊(overlay)的片段。覆蓋塊0首先運(yùn)行,結(jié)束時(shí)他將調(diào)用另一個(gè)覆蓋塊。雖然覆蓋塊的交換是由OS完成的,但是必須先由程序員把程序先進(jìn)行分割,這是一個(gè)費(fèi)時(shí)費(fèi)力的工作,而且相當(dāng)枯燥。人們必須找到更好的辦法從根本上解決這個(gè)問(wèn)題。不久人們找到了一個(gè)辦法,這就是虛擬存儲(chǔ)器(virtual memory).虛擬存儲(chǔ)器的基本思想是程序,數(shù)據(jù),堆棧的總的大小可以超過(guò)物理存儲(chǔ)器的大小,操作系統(tǒng)把當(dāng)前使用的部分保留在內(nèi)存中,而把其他未被使用的部分保存在磁盤(pán)上。比如對(duì)一個(gè)16MB的程序和一個(gè)內(nèi)存只有4MB的機(jī)器,OS通過(guò)選擇,可以決定各個(gè)時(shí)刻將哪4M的內(nèi)容保留在內(nèi)存中,并在需要時(shí)在內(nèi)存和磁盤(pán)間交換程序片段,這樣就可以把這個(gè)16M的程序運(yùn)行在一個(gè)只具有4M內(nèi)存機(jī)器上了。而這個(gè)16M的程序在運(yùn)行前不必由程序員進(jìn)行分割。
任何時(shí)候,計(jì)算機(jī)上都存在一個(gè)程序能夠產(chǎn)生的地址集合,我們稱(chēng)之為地址范圍。這個(gè)范圍的大小由CPU的位數(shù)決定,例如一個(gè)32位的CPU,它的地址范圍是0~0xFFFFFFFF (4G),而對(duì)于一個(gè)64位的CPU,它的地址范圍為0~0xFFFFFFFFFFFFFFFF (64T).這個(gè)范圍就是我們的程序能夠產(chǎn)生的地址范圍,我們把這個(gè)地址范圍稱(chēng)為虛擬地址空間,該空間中的某一個(gè)地址我們稱(chēng)之為虛擬地址。與虛擬地址空間和虛擬地址相對(duì)應(yīng)的則是物理地址空間和物理地址,大多數(shù)時(shí)候我們的系統(tǒng)所具備的物理地址空間只是虛擬地址空間的一個(gè)子集,這里舉一個(gè)最簡(jiǎn)單的例子直觀地說(shuō)明這兩者,對(duì)于一臺(tái)內(nèi)存為256MB的32bit x86主機(jī)來(lái)說(shuō),它的虛擬地址空間范圍是0~0xFFFFFFFF(4G),而物理地址空間范圍是0x000000000~0x0FFFFFFF(256MB)。
在沒(méi)有使用虛擬存儲(chǔ)器的機(jī)器上,虛擬地址被直接送到內(nèi)存總線上,使具有相同地址的物理存儲(chǔ)器被讀寫(xiě)。而在使用了虛擬存儲(chǔ)器的情況下,虛擬地址不是被直接送到內(nèi)存地址總線上,而是送到內(nèi)存管理單元——MMU(主角終于出現(xiàn)了:])。他由一個(gè)或一組芯片組成,一般存在與協(xié)處理器中,其功能是把虛擬地址映射為物理地址。
大多數(shù)使用虛擬存儲(chǔ)器的系統(tǒng)都使用一種稱(chēng)為分頁(yè)(paging)。虛擬地址空間劃分成稱(chēng)為頁(yè)(page)的單位,而相應(yīng)的物理地址空間也被進(jìn)行劃分,單位是頁(yè)框(frame).頁(yè)和頁(yè)框的大小必須相同。接下來(lái)配合圖片我以一個(gè)例子說(shuō)明頁(yè)與頁(yè)框之間在MMU的調(diào)度下是如何進(jìn)行映射的
在這個(gè)例子中我們有一臺(tái)可以生成16位地址的機(jī)器,它的虛擬地址范圍從0x0000~0xFFFF(64K),而這臺(tái)機(jī)器只有32K的物理地址,因此他可以運(yùn)行64K的程序,但該程序不能一次性調(diào)入內(nèi)存運(yùn)行。這臺(tái)機(jī)器必須有一個(gè)達(dá)到可以存放64K程序的外部存儲(chǔ)器(例如磁盤(pán)或是FLASH),以保證程序片段在需要時(shí)可以被調(diào)用。在這個(gè)例子中,頁(yè)的大小為4K,頁(yè)框大小與頁(yè)相同(這點(diǎn)是必須保證的,內(nèi)存和外圍存儲(chǔ)器之間的傳輸總是以頁(yè)為單位的),對(duì)應(yīng)64K的虛擬地址和32K的物理存儲(chǔ)器,他們分別包含了16個(gè)頁(yè)和8個(gè)頁(yè)框。
我們先根據(jù)上圖解釋一下分頁(yè)后要用到的幾個(gè)術(shù)語(yǔ),在上面我們已經(jīng)接觸了頁(yè)和頁(yè)框,上圖中綠色部分是物理空間,其中每一格表示一個(gè)物理頁(yè)框。橘黃色部分是虛擬空間,每一格表示一個(gè)頁(yè),它由兩部分組成,分別是Frame Index(頁(yè)框索引)和位p(present 存在位),F(xiàn)rame Index的意義很明顯,它指出本頁(yè)是往哪個(gè)物理頁(yè)框進(jìn)行映射的,位p的意義則是指出本頁(yè)的映射是否有效,如上圖,當(dāng)某個(gè)頁(yè)并沒(méi)有被映射時(shí)(或稱(chēng)“映射無(wú)效”,F(xiàn)rame Index部分為X),該位為0,映射有效則該位為1。
我們執(zhí)行下面這些指令(本例子的指令不針對(duì)任何特定機(jī)型,都是偽指令)
例1:
MOVE REG,0 //將0號(hào)地址的值傳遞進(jìn)寄存器REG.
虛擬地址0將被送往MMU,MMU看到該虛地址落在頁(yè)0范圍內(nèi)(頁(yè)0范圍是0到4095),從上圖我們看到頁(yè)0所對(duì)應(yīng)(映射)的頁(yè)框?yàn)?(頁(yè)框2的地址范圍是8192到12287),因此MMU將該虛擬地址轉(zhuǎn)化為物理地址8192,并把地址8192送到地址總線上。內(nèi)存對(duì)MMU的映射一無(wú)所知,它只看到一個(gè)對(duì)地址8192的讀請(qǐng)求并執(zhí)行它。MMU從而把0到4096的虛擬地址映射到8192到12287的物理地址。
例2:
MOVE REG,8192
被轉(zhuǎn)換為
MOVE REG,24576
因?yàn)樘摂M地址8192在頁(yè)2中,而頁(yè)2被映射到頁(yè)框6(物理地址從24576到28671)
例3:
MOVE REG,20500
被轉(zhuǎn)換為
MOVE REG,12308
虛擬地址20500在虛頁(yè)5(虛擬地址范圍是20480到24575)距開(kāi)頭20個(gè)字節(jié)處,虛頁(yè)5映射到頁(yè)框3(頁(yè)框3的地址范圍是 12288到16383),于是被映射到物理地址12288+20=12308。
通過(guò)適當(dāng)?shù)脑O(shè)置MMU,可以把16個(gè)虛頁(yè)隱射到8個(gè)頁(yè)框中的任何一個(gè),但是這個(gè)方法并沒(méi)有有效的解決虛擬地址空間比物理地址空間大的問(wèn)題。從上圖中我們可以看到,我們只有8個(gè)頁(yè)框(物理地址),但我們有16個(gè)頁(yè)(虛擬地址),所以我們只能把16個(gè)頁(yè)中的8個(gè)進(jìn)行有效的映射。我們看看例4會(huì)發(fā)生什么情況
MOV REG,32780
虛擬地址32780落在頁(yè)8的范圍內(nèi),從上圖總我們看到頁(yè)8沒(méi)有被有效的進(jìn)行映射(該頁(yè)被打上X),這是又會(huì)發(fā)生什么?MMU注意到這個(gè)頁(yè)沒(méi)有被映射,于是通知CPU發(fā)生一個(gè)缺頁(yè)故障(page fault).這種情況下操作系統(tǒng)必須處理這個(gè)頁(yè)故障,它必須從8個(gè)物理頁(yè)框中找到1個(gè)當(dāng)前很少被使用的頁(yè)框并把該頁(yè)框的內(nèi)容寫(xiě)入外圍存儲(chǔ)器(這個(gè)動(dòng)作被稱(chēng)為page copy),隨后把需要引用的頁(yè)(例4中是頁(yè)8)映射到剛才釋放的頁(yè)框中(這個(gè)動(dòng)作稱(chēng)為修改映射關(guān)系),然后從新執(zhí)行產(chǎn)生故障的指令(MOV REG,32780)。假設(shè)操作系統(tǒng)決定釋放頁(yè)框1,那么它將把虛頁(yè)8裝入物理地址的4-8K,并做兩處修改:首先把標(biāo)記虛頁(yè)1未被映射(原來(lái)虛頁(yè)1是被影射到頁(yè)框1的),以使以后任何對(duì)虛擬地址4K到8K的訪問(wèn)都引起頁(yè)故障而使操作系統(tǒng)做出適當(dāng)?shù)膭?dòng)作(這個(gè)動(dòng)作正是我們現(xiàn)在在討論的),其次他把虛頁(yè)8對(duì)應(yīng)的頁(yè)框號(hào)由X變?yōu)?,因此重新執(zhí)行MOV REG,32780時(shí),MMU將把32780映射為4108。[!--empirenews.page--]
我們大致了解了MMU在我們的機(jī)器中扮演了什么角色以及它基本的工作內(nèi)容是什么,下面我們將舉例子說(shuō)明它究竟是如何工作的(注意,本例中的MMU并無(wú)針對(duì)某種特定的機(jī)型,它是所有MMU工作的一個(gè)抽象)。
我們已經(jīng)知道,大多數(shù)使用虛擬存儲(chǔ)器的系統(tǒng)都使用一種稱(chēng)為分頁(yè)(paging)的技術(shù),就象我們剛才所舉的例子,虛擬地址空間被分成大小相同的一組頁(yè),每個(gè)頁(yè)有一個(gè)用來(lái)標(biāo)示它的頁(yè)號(hào)(這個(gè)頁(yè)號(hào)一般是它在該組中的索引,這點(diǎn)和C/C++中的數(shù)組相似)。在上面的例子中0~4K的頁(yè)號(hào)為0,4~8K的頁(yè)號(hào)為1,8~12K的頁(yè)號(hào)為2,以此類(lèi)推。而虛擬地址(注意:是一個(gè)確定的地址,不是一個(gè)空間)被MMU分為2個(gè)部分,第一部分是頁(yè)號(hào)索引(page Index),第二部分則是相對(duì)該頁(yè)首地址的偏移量(offset). 。我們還是以剛才那個(gè)16位機(jī)器結(jié)合下圖進(jìn)行一個(gè)實(shí)例說(shuō)明,該實(shí)例中,虛擬地址8196被送進(jìn)MMU,MMU把它映射成物理地址。16位的CPU總共能產(chǎn)生的地址范圍是0~64K,按每頁(yè)4K的大小計(jì)算,該空間必須被分成16個(gè)頁(yè)。而我們的虛擬地址第一部分所能夠表達(dá)的范圍也必須等于16(這樣才能索引到該頁(yè)組中的每一個(gè)頁(yè)),也就是說(shuō)這個(gè)部分至少需要4個(gè)bit。一個(gè)頁(yè)的大小是4K(4096),也就是說(shuō)偏移部分必須使用12個(gè)bit來(lái)表示(2^12= 4096,這樣才能訪問(wèn)到一個(gè)頁(yè)中的所有地址),8196的二進(jìn)制碼如下圖所示:
該地址的頁(yè)號(hào)索引為0010(二進(jìn)制碼),既索引的頁(yè)為頁(yè)2,第二部分為000000000100(二進(jìn)制),偏移量為 4。頁(yè)2中的頁(yè)框號(hào)為6(頁(yè)2映射在頁(yè)框6,見(jiàn)上圖),我們看到頁(yè)框6的物理地址是24~28K。于是MMU計(jì)算出虛擬地址8196應(yīng)該被映射成物理地址 24580(頁(yè)框首地址+偏移量=24576+4=24580)。同樣的,若我們對(duì)虛擬地址1026進(jìn)行讀取,1026的二進(jìn)制碼為 0000010000000010,page index=0000=0,offset=010000000010=1026。頁(yè)號(hào)為0,該頁(yè)映射的頁(yè)框號(hào)為2,頁(yè)框2的物理地址范圍是 8192~12287,故MMU將虛擬地址1026映射為物理地址9218(頁(yè)框首地址+偏移量=8192+1026=9218)
以上就是MMU的工作過(guò)程。
下面我們針對(duì)s3c2410的MMU(注1)進(jìn)行講解。
S3c2410總共有4種內(nèi)存映射方式,分別是:
1.Fault (無(wú)映射)
2.Coarse Page (粗表)
3.Section (段)
4.Fine Page (細(xì)表)
我們以Section(段)進(jìn)行說(shuō)明。
ARM920T是一個(gè)32bit的CPU,它的虛擬地址空間為2^32=4G。而在Section模式,這4G的虛擬空間被分成一個(gè)一個(gè)稱(chēng)為段(Section)的單位(與我們上面講的頁(yè)在本質(zhì)上其實(shí)是一致的),每個(gè)段的長(zhǎng)度是1M (而我們之前所使用的頁(yè)的長(zhǎng)度是4K)。4G的虛擬內(nèi)存總共可以被分成4096個(gè)段(1M*4096=4G),因此我們必須用4096個(gè)描述符來(lái)對(duì)這組段進(jìn)行描述,每個(gè)描述符占用4個(gè)Byte,故這組描述符的大小為16KB (4K*4096),這4096個(gè)描述符構(gòu)為一個(gè)表格,我們稱(chēng)其為T(mén)ralaton Table.
上圖是描述符的結(jié)構(gòu)
Section base address:段基地址(相當(dāng)于頁(yè)框號(hào)首地址)
AP: 訪問(wèn)控制位Access Permission
Domain: 訪問(wèn)控制寄存器的索引。Domain與AP配合使用,對(duì)訪問(wèn)權(quán)限進(jìn)行檢查
C:當(dāng)C被置1時(shí)為write-through (WT)模式
B: 當(dāng)B被置1時(shí)為write-back (WB)模式
(C,B兩個(gè)位在同一時(shí)刻只能有一個(gè)被置1)
下面是s3c2410內(nèi)存映射后的一個(gè)示意圖:
我的s3c2410上配置的SDRSAM大小為64M,該SDRAM的物理地址范圍是0x3000 0000~0x33FF FFFF(屬于Bank 6),由于1個(gè)Section的大小是1M,所以該物理空間可以被分成64個(gè)物理段(頁(yè)框).
在Section模式下,送進(jìn)MMU的虛擬地址(注1)被分為兩部分(這點(diǎn)和我們上面舉的例子是一樣的),這兩部分為 Descriptor Index(相當(dāng)于上面例子的Page Index)和 Offset,descript index長(zhǎng)度為12bit(2^12=4096,從這個(gè)關(guān)系式你能看出什么?:) ),Offset長(zhǎng)度為20bit(2^20=1M,你又能看出什么?:)).觀察一下一個(gè)描述符(Descriptor)中的Section Base Address部分,它長(zhǎng)度為12 bit,里面的值是該虛擬段(頁(yè))映射成的物理段(頁(yè)框)的物理地址前12bit,由于每一個(gè)物理段的長(zhǎng)度都是1M,所以物理段首地址的后20bit總是為0x00000(每個(gè)Section都是以1M對(duì)齊),確定一個(gè)物理地址的方法是 物理頁(yè)框基地址+虛擬地址中的偏移部分=Section Base Address<<20+Offset ,呵呵,可能你有點(diǎn)糊涂了,還是舉一個(gè)實(shí)際例子說(shuō)明吧。假設(shè)現(xiàn)在執(zhí)行指令
MOV REG, 0x30000012
虛擬地址的二進(jìn)制碼為00110000 00000000 00000000 00010010
前 12位是Descriptor Index= 00110000 0000=768,故在Translation Table里面找到第768號(hào)描述符,該描述的Section Base Address=0x0300,也就是說(shuō)描述符所描述的虛擬段(頁(yè))所映射的物理段(頁(yè)框)的首地址為0x3000 0000(物理段(頁(yè)框)的基地址=Section Base Address左移20bit=0x0300<<20=0x3000 0000),而Offset=000000 00000000 00010010=0x12,故虛擬地址0x30000012映射成的物理地址=0x3000 0000+0x12=0x3000 0012(物理頁(yè)框基地址+虛擬地址中的偏移)。你可能會(huì)問(wèn)怎么這個(gè)虛擬地址和映射后的物理地址一樣?這是由我們定義的映射規(guī)則所決定的。在這個(gè)例子中我們定義的映射規(guī)則是把虛擬地址映射成和他相等的物理地址。我們這樣書(shū)寫(xiě)映射關(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;[!--empirenews.page--]
descriptor_index+=1;section _base +=0x100000)
{
*(mmu_tlb_base + (descriptor_index)) = (section _base>>20) | MMU_OTHER_SECDESC;
}
}
上面的這段段代碼把虛擬空間0x3000 0000~0x33FF FFFF映射到物理空間0x3000 0000~0x33FF FFFF,由于虛擬空間與物理空間空間相吻合,所以虛擬地址與他們各自對(duì)應(yīng)的物理地址在值上是一致的。當(dāng)初始完Translation Table之后,記得要把Translation Table的首地址(第0號(hào)描述符的地址)加載進(jìn)協(xié)處理器CP15的Control Register2(2號(hào)控制寄存器)中,該控制寄存器的名稱(chēng)叫做Translation table base (TTB) register。
以上討論的是descriptor中的Section Base Address以及虛擬地址和物理地址的映射關(guān)系,然而MMU還有一個(gè)重要的功能,那就是訪問(wèn)控制機(jī)制(Access Permission )。
簡(jiǎn)單說(shuō)訪問(wèn)控制機(jī)制就是CPU通過(guò)某種方法判斷當(dāng)前程序?qū)?nèi)存的訪問(wèn)是否合法(是否有權(quán)限對(duì)該內(nèi)存進(jìn)行訪問(wèn)),如果當(dāng)前的程序并沒(méi)有權(quán)限對(duì)即將訪問(wèn)的內(nèi)存區(qū)域進(jìn)行操作,則CPU將引發(fā)一個(gè)異常,s3c2410稱(chēng)該異常為Permission fault,x86架構(gòu)則把這種異常稱(chēng)之為通用保護(hù)異常(General Protection),什么情況會(huì)引起Permission fault呢?比如處于User級(jí)別的程序要對(duì)一個(gè)System級(jí)別的內(nèi)存區(qū)域進(jìn)行寫(xiě)操作,這種操作是越權(quán)的,應(yīng)該引起一個(gè)Permission fault,搞過(guò)x86架構(gòu)的朋友應(yīng)該聽(tīng)過(guò)保護(hù)模式(Protection Mode),保護(hù)模式就是基于這種思想進(jìn)行工作的,于是我們也可以這么說(shuō):s3c2410的訪問(wèn)控制機(jī)制其實(shí)就是一種保護(hù)機(jī)制。那s3c2410的訪問(wèn)控制機(jī)制到底是由什么元素去參與完成的呢?它們間是怎么協(xié)調(diào)工作的呢?這些元素總共有:
1.協(xié)處理器CP15中Control Register3:DOMAIN ACCESS CONTROL REGISTER
2.段描述符中的AP位和Domain位
3.協(xié)處理器CP15中Control Register1(控制寄存器1)中的S bit和R bit
4.協(xié)處理器CP15中Control Register5(控制寄存器5)
5.協(xié)處理器CP15中Control Register6(控制寄存器6)
DOMAIN ACCESS CONTROL REGISTER 是訪問(wèn)控制寄存器,該寄存器有效位為32,被分成16個(gè)區(qū)域,每個(gè)區(qū)域由兩個(gè)位組成,他們說(shuō)明了當(dāng)前內(nèi)存的訪問(wèn)權(quán)限檢查的級(jí)別,如下圖所示:
每區(qū)域可以填寫(xiě)的值有4個(gè),分別為00,01,10,11(二進(jìn)制),他們的意義如下所示:
00:當(dāng)前級(jí)別下,該內(nèi)存區(qū)域不允許被訪問(wèn),任何的訪問(wèn)都會(huì)引起一個(gè)domain fault
01:當(dāng)前級(jí)別下,該內(nèi)存區(qū)域的訪問(wèn)必須配合該內(nèi)存區(qū)域的段描述符中AP位進(jìn)行權(quán)檢查
10:保留狀態(tài)(我們最好不要填寫(xiě)該值,以免引起不能確定的問(wèn)題)
11:當(dāng)前級(jí)別下,對(duì)該內(nèi)存區(qū)域的訪問(wèn)都不進(jìn)行權(quán)限檢查。
我們?cè)賮?lái)看看discriptor中的Domain區(qū)域,該區(qū)域總共有4個(gè)bit,里面的值是對(duì)DOMAIN ACCESS CONTROL REGISTER中16個(gè)區(qū)域的索引.而AP位配合S bit和A bit對(duì)當(dāng)前描述符描述的內(nèi)存區(qū)域被訪問(wèn)權(quán)限的說(shuō)明,他們的配合關(guān)系如下圖所示:
AP位也是有四個(gè)值,我結(jié)合實(shí)例對(duì)其進(jìn)行說(shuō)明.
在下面的例子中,我們的DOMAIN ACCESS CONTROL REGISTER都被初始化成0xFFFF BDCF,如下圖所示:
例1:
Discriptor 中的domain=4,AP=10(這種情況下S bit ,A bit 被忽略)
假設(shè)現(xiàn)在我要對(duì)該描述符描述的內(nèi)存區(qū)域進(jìn)行訪問(wèn):
由于domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系統(tǒng)會(huì)對(duì)該訪問(wèn)進(jìn)行訪問(wèn)權(quán)限的檢查。
假設(shè)當(dāng)前CPU處于Supervisor模式下,則程序可以對(duì)該描述符描述的內(nèi)存區(qū)域進(jìn)行讀寫(xiě)操作。
假設(shè)當(dāng)前CPU處于User模式下,則程序可以對(duì)該描述符描述的內(nèi)存進(jìn)行讀訪問(wèn),若對(duì)其進(jìn)行寫(xiě)操作則引起一個(gè)permission fault.
例2:
Discriptor 中的domain=0,AP=10(這種情況下S bit ,A bit 被忽略)
domain=0,而DOMAIN ACCESS CONTROL REGISTER中field 0的值是11,系統(tǒng)對(duì)任何內(nèi)存區(qū)域的訪問(wèn)都不進(jìn)行訪問(wèn)權(quán)限的檢查。
由于統(tǒng)對(duì)任何內(nèi)存區(qū)域的訪問(wèn)都不進(jìn)行訪問(wèn)權(quán)限的檢查,所以無(wú)論CPU處于合種模式下(Supervisor模式或是User模式),程序?qū)υ撁枋龇枋龅膬?nèi)存都可以順利地進(jìn)行讀寫(xiě)操作
例3:Discriptor 中的domain=4,AP=11(這種情況下S bit ,A bit 被忽略)
由于domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系統(tǒng)會(huì)對(duì)該訪問(wèn)進(jìn)行訪問(wèn)權(quán)限的檢查。
由于AP=11,所以無(wú)論CPU處于合種模式下(Supervisor模式或是User模式),程序?qū)υ撁枋龇枋龅膬?nèi)存都可以順利地進(jìn)行讀寫(xiě)操作
例4:
Discriptor 中的domain=4,AP=00, S bit=0,A bit=0
由于domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系統(tǒng)會(huì)對(duì)該訪問(wèn)進(jìn)行訪問(wèn)權(quán)限的檢查。
由于AP=00,S bit=0,A bit=0,所以無(wú)論CPU處于合種模式下(Supervisor模式或是User模式),程序?qū)υ撁枋龇枋龅膬?nèi)存都只能進(jìn)行讀操作,否則引起permission fault.
通過(guò)以上4個(gè)例子我們得出兩個(gè)結(jié)論:
1.對(duì)某個(gè)內(nèi)存區(qū)域的訪問(wèn)是否需要進(jìn)行權(quán)限檢查是由該內(nèi)存區(qū)域的描述符中的Domain域決定的。
2.某個(gè)內(nèi)存區(qū)域的訪問(wèn)權(quán)限是由該內(nèi)存區(qū)域的描述符中的AP位和協(xié)處理器CP15中Control Register1(控制寄存器1)中的S bit和R bit所決定的。
關(guān)于訪問(wèn)控制機(jī)制我們就講到這里.[!--empirenews.page--]
注1:對(duì)于s3c2410來(lái)說(shuō),MMU是以Modify Visual Address(MVA)進(jìn)行尋址的,這個(gè)地址是Virtual Address的一個(gè)變換,我將在以后談?wù)摰竭M(jìn)程切換的時(shí)候中向大家介紹MVA