新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM MMU工作原理剖析

        ARM MMU工作原理剖析

        作者: 時間:2016-11-23 來源:網絡 收藏

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

        我的s3c2410上配置的SDRSAM大小為64M,該SDRAM的物理地址范圍是0x3000 0000~0x33FF FFFF(屬于Bank 6),由于1個Section的大小是1M,所以該物理空間可以被分成64個物理段(頁框).


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

        假設現在執行指令MOV REG, 0x30000012,虛擬地址的二進制碼為00110000 00000000 00000000 00010010,前12位是Descriptor Index= 00110000 0000=768,故在Translation Table里面找到第768號描述符,該描述的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(物理頁框基地址+虛擬地址中的偏移)。你可能會問怎么這個虛擬地址和映射后的物理地址一樣?這是由我們定義的映射規則所決定的。在這個例子中我們定義的映射規則是把虛擬地址映射成和他相等的物理地址。我們這樣書寫映射關系的代碼:
        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,由于虛擬空間與物理空間空間相吻合,所以虛擬地址與他們各自對應的物理地址在值上是一致的。當初始完Translation Table之后,記得要把Translation Table的首地址(第0號描述符的地址)加載進協處理器CP15的Control Register2(2號控制寄存器)中,該控制寄存器的名稱叫做Translation table base (TTB) register。


        以上討論的是descriptor中的Section Base Address以及虛擬地址和物理地址的映射關系,然而MMU還有一個重要的功能,那就是訪問控制機制(Access Permission )。簡單說訪問控制機制就是CPU通過某種方法判斷當前程序對內存的訪問是否合法(是否有權限對該內存進行訪問),如果當前的程序并沒有權限對即將訪問的內存區域進行操作,則CPU將引發一個異常,s3c2410稱該異常為Permission fault,x86架構則把這種異常稱之為通用保護異常(General Protection),什么情況會引起Permission fault呢?比如處于User級別的程序要對一個System級別的內存區域進行寫操作,這種操作是越權的,應該引起一個Permission fault,搞過x86架構的朋友應該聽過保護模式(Protection Mode),保護模式就是基于這種思想進行工作的,于是我們也可以這么說:s3c2410的訪問控制機制其實就是一種保護機制。那s3c2410的訪問控制機制到底是由什么元素去參與完成的呢?它們間是怎么協調工作的呢?這些元素總共有:
        1.協處理器CP15中Control Register3:DOMAIN ACCESS CONTROL REGISTER
        2.段描述符中的AP位和Domain位
        3.協處理器CP15中Control Register1(控制寄存器1)中的S bit和R bit
        4.協處理器CP15中Control Register5(控制寄存器5)
        5.協處理器CP15中Control Register6(控制寄存器6)
        DOMAIN ACCESS CONTROL REGISTER 是訪問控制寄存器,該寄存器有效位為32,被分成16個區域,每個區域由兩個位組成,他們說明了當前內存的訪問權限檢查的級別,如下圖所示:


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


        00:當前級別下,該內存區域不允許被訪問,任何的訪問都會引起一個domain fault
        01:當前級別下,該內存區域的訪問必須配合該內存區域的段描述符中AP位進行權檢查
        10:保留狀態(我們最好不要填寫該值,以免引起不能確定的問題)
        11:當前級別下,對該內存區域的訪問都不進行權限檢查。
        我們再來看看discriptor中的Domain區域,該區域總共有4個bit,里面的值是對DOMAIN ACCESS CONTROL REGISTER中16個區域的索引.而AP位配合S bit和A bit對當前描述符描述的內存區域被訪問權限的說明,他們的配合關系如下圖所示:


        AP位也是有四個值,我結合實例對其進行說明.
        在下面的例子中,我們的DOMAIN ACCESS CONTROL REGISTER都被初始化成0xFFFF BDCF,如下圖所示:


        例1:
        Discriptor 中的domain=4,AP=10(這種情況下S bit ,A bit 被忽略)
        假設現在我要對該描述符描述的內存區域進行訪問:
        由于domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系統會對該訪問進行訪問權限的檢查。
        假設當前CPU處于Supervisor模式下,則程序可以對該描述符描述的內存區域進行讀寫操作。
        假設當前CPU處于User模式下,則程序可以對該描述符描述的內存進行讀訪問,若對其進行寫操作則引起一個permission fault.

        例2:
        Discriptor 中的domain=0,AP=10(這種情況下S bit ,A bit 被忽略)
        domain=0,而DOMAIN ACCESS CONTROL REGISTER中field 0的值是11,系統對任何內存區域的訪問都不進行訪問權限的檢查。
        由于統對任何內存區域的訪問都不進行訪問權限的檢查,所以無論CPU處于合種模式下(Supervisor模式或是User模式),程序對該描述符描述的內存都可以順利地進行讀寫操作

        例3:Discriptor 中的domain=4,AP=11(這種情況下S bit ,A bit 被忽略)
        由于domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系統會對該訪問進行訪問權限的檢查。
        由于AP=11,所以無論CPU處于合種模式下(Supervisor模式或是User模式),程序對該描述符描述的內存都可以順利地進行讀寫操作

        例4:
        Discriptor 中的domain=4,AP=00, S bit="0",A bit="0"
        由于domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系統會對該訪問進行訪問權限的檢查。
        由于AP=00,S bit="0",A bit="0",所以無論CPU處于合種模式下(Supervisor模式或是User模式),程序對該描述符描述的內存都只能進行讀操作,否則引起permission fault.
        通過以上4個例子我們得出兩個結論:
        1.對某個內存區域的訪問是否需要進行權限檢查是由該內存區域的描述符中的Domain域決定的。
        2.某個內存區域的訪問權限是由該內存區域的描述符中的AP位和協處理器CP15中Control Register1(控制寄存器1)中的S bit和R bit所決定的。


        上一頁 1 2 下一頁

        關鍵詞: ARMMMU工作原

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 甘泉县| 贡觉县| 丹东市| 进贤县| 罗定市| 道真| 上杭县| 都匀市| 和平区| 浦城县| 织金县| 祥云县| 东城区| 吐鲁番市| 维西| 依兰县| 紫云| 密云县| 革吉县| 海南省| 蓬溪县| 政和县| 平定县| 涪陵区| 株洲县| 讷河市| 巴塘县| 黔东| 吴川市| 澎湖县| 莱阳市| 凤庆县| 奇台县| 沭阳县| 新泰市| 自贡市| 金阳县| 临潭县| 天水市| 垣曲县| 天津市|