色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          ARM MMU工作原理剖析

          作者: 時(shí)間:2016-11-23 來源:網(wǎng)絡(luò) 收藏

          上圖是描述符的結(jié)構(gòu)
          Section base address:段基地址(相當(dāng)于頁框號(hào)首地址)
          AP: 訪問控制位Access Permission
          Domain: 訪問控制寄存器的索引。Domain與AP配合使用,對(duì)訪問權(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è)物理段(頁框).


          在Section模式下,送進(jìn)MMU的虛擬地址(注1)被分為兩部分(這點(diǎn)和我們上面舉的例子是一樣的),這兩部分為 Descriptor Index(相當(dāng)于上面例子的Page Index)和 Offset,descript index長度為12bit(2^12=4096,從這個(gè)關(guān)系式你能看出什么?:) ),Offset長度為20bit(2^20=1M,你又能看出什么?:)).觀察一下一個(gè)描述符(Descriptor)中的Section Base Address部分,它長度為12 bit,里面的值是該虛擬段(頁)映射成的物理段(頁框)的物理地址前12bit,由于每一個(gè)物理段的長度都是1M,所以物理段首地址的后20bit總是為0x00000(每個(gè)Section都是以1M對(duì)齊),確定一個(gè)物理地址的方法是 物理頁框基地址+虛擬地址中的偏移部分=Section Base Address<<20+Offset ,呵呵,可能你有點(diǎn)糊涂了,還是舉一個(gè)實(shí)際例子說明吧。

          假設(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",也就是說描述符所描述的虛擬段(頁)所映射的物理段(頁框)的首地址為0x3000 0000(物理段(頁框)的基地址=Section Base Address左移20bit=0x0300<<20=0x3000 0000),而Offset=000000 00000000 00010010=0x12,故虛擬地址0x30000012映射成的物理地址=0x3000 0000+0x12=0x3000 0012(物理頁框基地址+虛擬地址中的偏移)。你可能會(huì)問怎么這個(gè)虛擬地址和映射后的物理地址一樣?這是由我們定義的映射規(guī)則所決定的。在這個(gè)例子中我們定義的映射規(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;
          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)控制寄存器)中,該控制寄存器的名稱叫做Translation table base (TTB) register。


          以上討論的是descriptor中的Section Base Address以及虛擬地址和物理地址的映射關(guān)系,然而MMU還有一個(gè)重要的功能,那就是訪問控制機(jī)制(Access Permission )。簡單說訪問控制機(jī)制就是CPU通過某種方法判斷當(dāng)前程序?qū)?nèi)存的訪問是否合法(是否有權(quán)限對(duì)該內(nèi)存進(jìn)行訪問),如果當(dāng)前的程序并沒有權(quán)限對(duì)即將訪問的內(nèi)存區(qū)域進(jìn)行操作,則CPU將引發(fā)一個(gè)異常,s3c2410稱該異常為Permission fault,x86架構(gòu)則把這種異常稱之為通用保護(hù)異常(General Protection),什么情況會(huì)引起Permission fault呢?比如處于User級(jí)別的程序要對(duì)一個(gè)System級(jí)別的內(nèi)存區(qū)域進(jìn)行寫操作,這種操作是越權(quán)的,應(yīng)該引起一個(gè)Permission fault,搞過x86架構(gòu)的朋友應(yīng)該聽過保護(hù)模式(Protection Mode),保護(hù)模式就是基于這種思想進(jìn)行工作的,于是我們也可以這么說:s3c2410的訪問控制機(jī)制其實(shí)就是一種保護(hù)機(jī)制。那s3c2410的訪問控制機(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 是訪問控制寄存器,該寄存器有效位為32,被分成16個(gè)區(qū)域,每個(gè)區(qū)域由兩個(gè)位組成,他們說明了當(dāng)前內(nèi)存的訪問權(quán)限檢查的級(jí)別,如下圖所示:


          每區(qū)域可以填寫的值有4個(gè),分別為00,01,10,11(二進(jìn)制),他們的意義如下所示:


          00:當(dāng)前級(jí)別下,該內(nèi)存區(qū)域不允許被訪問,任何的訪問都會(huì)引起一個(gè)domain fault
          01:當(dāng)前級(jí)別下,該內(nèi)存區(qū)域的訪問必須配合該內(nèi)存區(qū)域的段描述符中AP位進(jìn)行權(quán)檢查
          10:保留狀態(tài)(我們最好不要填寫該值,以免引起不能確定的問題)
          11:當(dāng)前級(jí)別下,對(duì)該內(nèi)存區(qū)域的訪問都不進(jìn)行權(quán)限檢查。
          我們?cè)賮砜纯磀iscriptor中的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ū)域被訪問權(quán)限的說明,他們的配合關(guān)系如下圖所示:


          AP位也是有四個(gè)值,我結(jié)合實(shí)例對(duì)其進(jìn)行說明.
          在下面的例子中,我們的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)行訪問:
          由于domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系統(tǒng)會(huì)對(duì)該訪問進(jìn)行訪問權(quán)限的檢查。
          假設(shè)當(dāng)前CPU處于Supervisor模式下,則程序可以對(duì)該描述符描述的內(nèi)存區(qū)域進(jìn)行讀寫操作。
          假設(shè)當(dāng)前CPU處于User模式下,則程序可以對(duì)該描述符描述的內(nèi)存進(jìn)行讀訪問,若對(duì)其進(jìn)行寫操作則引起一個(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ū)域的訪問都不進(jìn)行訪問權(quán)限的檢查。
          由于統(tǒng)對(duì)任何內(nèi)存區(qū)域的訪問都不進(jìn)行訪問權(quán)限的檢查,所以無論CPU處于合種模式下(Supervisor模式或是User模式),程序?qū)υ撁枋龇枋龅膬?nèi)存都可以順利地進(jìn)行讀寫操作

          例3:Discriptor 中的domain=4,AP=11(這種情況下S bit ,A bit 被忽略)
          由于domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系統(tǒng)會(huì)對(duì)該訪問進(jìn)行訪問權(quán)限的檢查。
          由于AP=11,所以無論CPU處于合種模式下(Supervisor模式或是User模式),程序?qū)υ撁枋龇枋龅膬?nèi)存都可以順利地進(jìn)行讀寫操作

          例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ì)該訪問進(jìn)行訪問權(quán)限的檢查。
          由于AP=00,S bit="0",A bit="0",所以無論CPU處于合種模式下(Supervisor模式或是User模式),程序?qū)υ撁枋龇枋龅膬?nèi)存都只能進(jìn)行讀操作,否則引起permission fault.
          通過以上4個(gè)例子我們得出兩個(gè)結(jié)論:
          1.對(duì)某個(gè)內(nèi)存區(qū)域的訪問是否需要進(jìn)行權(quán)限檢查是由該內(nèi)存區(qū)域的描述符中的Domain域決定的。
          2.某個(gè)內(nèi)存區(qū)域的訪問權(quán)限是由該內(nèi)存區(qū)域的描述符中的AP位和協(xié)處理器CP15中Control Register1(控制寄存器1)中的S bit和R bit所決定的。


          上一頁 1 2 下一頁

          關(guān)鍵詞: ARMMMU工作原

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉