中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 關(guān)于ARM9的MMU重要理解

        關(guān)于ARM9的MMU重要理解

        作者: 時(shí)間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
        MMU給我感覺是個(gè)很復(fù)雜的東西,網(wǎng)上看了一些資料,勉強(qiáng)知道了一些表面的東西。它有兩個(gè)作用:1、把虛擬地址映射到物理地址;2、對(duì)內(nèi)存訪問提供控制機(jī)制。

        原文地址:

        本文引用地址:http://www.antipu.com.cn/article/201611/322696.htm

        http://blog.chinaunix.net/u1/58780/showart_468065.html

        在ARM中,MMU另外提供了一張映射表(MVA),用于程序虛擬地址(VA)到物理地址(PA)的映射。MVA稱為變換后的VA。在程序運(yùn)行時(shí),CPU只看到VA,而MMU和cache們只看到PA和MVA。應(yīng)該說,在進(jìn)程運(yùn)行切換過程中,映射關(guān)系是動(dòng)態(tài)變化的,因?yàn)椴煌M(jìn)程和內(nèi)存之間需要不同的映射關(guān)系,就需要不斷的重做映射表,這個(gè)代價(jià)是很大的。所以,有必要讓映射表中需要更新的內(nèi)容很少,以減少性能開支,這就出現(xiàn)了“變換后的”VA,即MVA,如果VA<32M,需要使用進(jìn)程標(biāo)識(shí)號(hào)PID(通過讀CP15的C13獲得)來轉(zhuǎn)換為MVA。

        VA與MVA的轉(zhuǎn)換方法如下(這是硬件自動(dòng)完成的):

        if(VA<32M)
        MVA=VA|(PID<<25);//VA<32M,即PID*0x02000000作為該進(jìn)程起始地址
        else
        MVA=VA;//VA>=32M

        如:假設(shè)兩個(gè)進(jìn)程1、2運(yùn)行時(shí)的VA都是0-32M,則他們的MVA分別是0x02000000-0x03ffffff、0x04000000-0x05ffffff,這樣進(jìn)程切換就省事多了,不必進(jìn)行重建頁表等工作。

        但 是,這同時(shí)帶來了中斷跳轉(zhuǎn)的問題。當(dāng)發(fā)生異常時(shí),需要跳到0x0位置的異常向量表,這個(gè)0x0應(yīng)該是VA,且小于32M,如果開啟了MMU,就會(huì)被轉(zhuǎn)換為 MVA,而不同的PID產(chǎn)生不同的MVA,這就導(dǎo)致異常向量表的地址不統(tǒng)一了。所以,Linux采取了將0x0位置的向量表映射到高地址 0xffff0000處,就沒有上述的問題了,看了半天原來是這么回事。。。

        因?yàn)?,?2位的CPU系統(tǒng)上,虛擬地址空間為2^32 = 4G
        而VA和MVA的轉(zhuǎn)換公式為:
        if(VA < 32M) then
        MVA = VA | PID << 25;
        else
        MVA = VA;
        這樣,只要每個(gè)進(jìn)程的VA都在32M之內(nèi),就可以保證每個(gè)進(jìn)程的MVA不會(huì)發(fā)生重疊。
        2^25 = 32M。另外,可以計(jì)算出進(jìn)程最多為2^(32-25) = 128個(gè)
        如果說這個(gè)是規(guī)定來的,你信不信?呵呵如果是64M的話,那么公式就要改成MVA = VA | PID << 26;
        那么PID就只有6位了,linux操作系統(tǒng)能夠支持的進(jìn)程最多只有2^6=64個(gè)了,這樣不劃算
        B指令的的機(jī)器代碼結(jié)構(gòu)為
        31 2827 26 25 24 230
        cond101Lsigned_imed
        若L為0則為直接跳轉(zhuǎn)B,若L為1則為連接跳轉(zhuǎn)BL,signed_imed為24位有符號(hào)立即數(shù),這個(gè)值為跳轉(zhuǎn)的偏移量。
        24位有符號(hào)數(shù)值的范圍是-8M ~ +8M,而指令中偏移量為1時(shí)代表從當(dāng)前PC開始向下跳1個(gè)字,即偏移量的單位為4個(gè)字節(jié)
        因此,B指令向前和向后尋址的最大范圍為32M
        你可以試下如下代碼:
        BNEXT
        NEXT
        NOP
        NOP
        看一下那條跳轉(zhuǎn)指令它的機(jī)器代碼,最低24位立即數(shù)的值應(yīng)該是-1
        跟字對(duì)齊有點(diǎn)關(guān)系,因?yàn)锳RM指令集的指令都是四字節(jié)的,所以偏移量的單位是4個(gè)字節(jié)。
        如果當(dāng)前跳轉(zhuǎn)的偏移量為-1,那么PC會(huì)向前跳4個(gè)字節(jié),如果偏移量為-8M,那么PC會(huì)向前跳-32M個(gè)字節(jié)

        恩,最低24位是0xffffff,偏移量就是 -1
        BNEXT
        NOP
        NOP
        NEXT
        NOP
        B跳轉(zhuǎn)是針對(duì)當(dāng)前PC來計(jì)算的,而當(dāng)前PC值等于當(dāng)前正在執(zhí)行指令的下下一條指令的地址值
        向下跳,偏移量為正數(shù),向上跳,偏移量為負(fù)數(shù)。這個(gè)上下方向是針對(duì)程序執(zhí)行的方向來說的。

        恩,是這樣的



        關(guān)鍵詞: ARM9MM

        評(píng)論


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

        關(guān)閉