<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 關于ARM9的MMU重要理解

          關于ARM9的MMU重要理解

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

          原文地址:

          本文引用地址:http://www.ex-cimer.com/article/201611/322696.htm

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

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

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

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

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

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

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

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

          恩,是這樣的



          關鍵詞: ARM9MM

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();