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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM中的鏈接地址為什么ARM要重定位

          ARM中的鏈接地址為什么ARM要重定位

          作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
          在考慮為什么要重定位的問題之前,我們首先要明白一下幾點(diǎn):

          1. 鏈接地址的定義:我自己理解是,程序被定義的開始執(zhí)行的內(nèi)存地址。

          2. 當(dāng)ARM從nandflash啟動(dòng)的時(shí)候,CPU所做的工作是將nandflash中的前8K代碼自動(dòng)的到6410的0地址(即Stepping Stone)中去,然后從0地址開始執(zhí)行程序。

          3. 程序在執(zhí)行過程中,用鏈接地址來(lái)訪問全局變量。全局變量一般被存放于程序的最后面。

          在程序超過8K時(shí),如果不進(jìn)行重定位,就會(huì)發(fā)生類似于下面的訪問錯(cuò)誤,這將導(dǎo)致程序無(wú)法正常執(zhí)行。

          假設(shè)我們定義程序的鏈接地址為0x50000000,程序從6410的0地址(即Stepping Stone)執(zhí)行的時(shí)候,如果要訪問某個(gè)全局變量時(shí),假設(shè)其反匯編代碼如下:
          500000a4 e59f303c ldr r0, [pc, #60] ;r0 = [0x500000e8] =0x00000200
          500000a8 e5933000 ldr r0, [r0] ;r0 = [0x00000200]
          500000ac ......
          ......
          500000e8 00000200 .......

          00000200 :
          200: 00000000 ......

          我們可以看出來(lái),r0的值要根據(jù)地址0x500000e8處獲得,而在Stepping Stone中無(wú)法找到0x500000e8這個(gè)地址,這樣程序就會(huì)出錯(cuò)。所以在程序被CPU拷貝到Stepping Stone后,我們要先寫一段程序初始化nandflash和內(nèi)存,再利用位置無(wú)關(guān)的代碼將程序從nandflash拷貝到內(nèi)存中,然后跳轉(zhuǎn)到其它函數(shù)繼續(xù)執(zhí)行,這就是ARM的重定位。

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


          關(guān)鍵詞: ARM中鏈接地址重定

          評(píng)論


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

          關(guān)閉
          看屁屁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); })();