新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > uboot之ARM位置無關代碼設計

        uboot之ARM位置無關代碼設計

        作者: 時間:2016-11-09 來源:網絡 收藏
        前言:

        所謂位置無關代碼是指:可執行鏡像test.bin

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

        我將它拷貝至內存0x30000000,然后pc = 0x30000000、它可以順利執行;

        我將它拷貝至內存0x38000000,然后pc = 0x38000000、它仍可以順利執行。

        1.程序的編譯及運行流程

        源碼經過編譯、匯編(生成相對地址符號表)和連接(提供絕對首地址、進而確定絕對地址符號表)后編程可執行鏡像;

        特別指出地是:在連接時,對各個目標文件進行重定位、建立符號引用規則;進而為變量和函數分配了絕對的運行地址;

        程序執行時,系統必須把可執行鏡像加載到連接階段指定的地址空間,這樣程序執行中才能對變量、函數等符號做正確引用,程序才能正常運行。

        在有操作系統的系統中,連接階段的重定位(即運行地址的確定)由系統自動完成;

        而裸機開發中,這個地址必須由程序員在連接階段通過參數指定。

        2.位置無關代碼的應用場合:

        程序在運行期間動態加載至內存;

        程序在不同場合與不同程序組合后加載至內存(如共享的動態鏈接庫);

        在運行期間不同地址相互之間的映射(如bootloader程序的前4KB代碼;因為編譯連接后決定它的運行地址是0x30000000,但剛開機時它是運行在0x00000000的)。

        3.原理

        PIC對常量和函數入口地址的操作都是基于PC+偏移量的尋址方式;即使程序被移動,但PC也變化了、而偏移量是不變的。所以,程序仍然可以找到正確的入口地址和常量!

        eg:

        __asm{   pc = a;  //假設可以直接給pc賦值 }; int a() {   return 0; }

        這個就是位置有關代碼,它不能在任意處加載運行。

        說明:編譯連接后函數a的運行地址已經被確定,例如0x80000100。

        __asm{   bl a; }; int a() {   return 0; }

        這個就是位置無關代碼,它可以被加載到非運行地址處運行。

        說明:編譯連接后函數a的運行地址已經被確定,例如0x80000100。

        一、名詞解釋

        ARM位置無關代碼設計指的是該部分代碼編譯后的可執行鏡像,加載到任何地址處都可以正常運行。

        即:程序不在連接時指定的運行地址空間,也可以執行。

        二、實現的必要條件

        1.ARM匯編中對程序運行的相對跳轉指令:

        BL a:運行時首先獲得當前PC值(也就是當前代碼段的值),然后計算當前PC值和a(也是由連接器獲得)間的距離;跳轉地址即是pc+offset。

        相對跳轉指令的目標地址用基于當前PC的偏移量來表示、與連接時分配給地址標號的絕對地址值無關,因而、代碼可以在任何位置進行跳轉,實現位置無關性。

        這樣,不論編譯器指定的a絕對地址是什么;程序都可以加載到任意地址處正常運行。

        三、說明

        連接階段執行后,可執行鏡像中的虛擬地址與內存管理無關!



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 芜湖市| 广元市| 清远市| 垣曲县| 元阳县| 庐江县| 喀什市| 平泉县| 化州市| 酒泉市| 元氏县| 蓬莱市| 鹿邑县| 醴陵市| 博爱县| 玉山县| 宁津县| 正阳县| 九江市| 报价| 陕西省| 安溪县| 鹿泉市| 建水县| 瓮安县| 临邑县| 巍山| 全南县| 永善县| 兴化市| 石门县| 射阳县| 资中县| 和田市| 淳安县| 明溪县| 屏山县| 札达县| 洱源县| 洛川县| 措美县|