新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM中的鏈接地址為什么ARM要重定位

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

        作者: 時間:2016-11-09 來源:網絡 收藏
        在考慮為什么要重定位的問題之前,我們首先要明白一下幾點:

        1. 鏈接地址的定義:我自己理解是,程序被定義的開始執行的內存地址。

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

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

        在程序超過8K時,如果不進行重定位,就會發生類似于下面的訪問錯誤,這將導致程序無法正常執行。

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

        00000200 :
        200: 00000000 ......

        我們可以看出來,r0的值要根據地址0x500000e8處獲得,而在Stepping Stone中無法找到0x500000e8這個地址,這樣程序就會出錯。所以在程序被CPU拷貝到Stepping Stone后,我們要先寫一段程序初始化nandflash和內存,再利用位置無關的代碼將程序從nandflash拷貝到內存中,然后跳轉到其它函數繼續執行,這就是ARM的重定位。

        本文引用地址:http://www.104case.com/article/201611/317858.htm


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 山东省| 大丰市| 逊克县| 嘉善县| 辛集市| 牟定县| 卢湾区| 珠海市| 东光县| 乐清市| 团风县| 老河口市| 共和县| 丘北县| 华坪县| 澄城县| 眉山市| 鲁山县| 莲花县| 阿克| 察隅县| 沂源县| 武川县| 宁陕县| 监利县| 南康市| 新疆| 郧西县| 包头市| 淄博市| 临洮县| 松阳县| 北海市| 武邑县| 福清市| 黔西县| 咸阳市| 类乌齐县| 托克托县| 霍邱县| 龙泉市|