新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > uboot之ARM位置無(wú)關(guān)代碼設(shè)計(jì)

uboot之ARM位置無(wú)關(guān)代碼設(shè)計(jì)

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
前言:

所謂位置無(wú)關(guān)代碼是指:可執(zhí)行鏡像test.bin

本文引用地址:http://m.butianyuan.cn/article/201611/317893.htm

我將它拷貝至內(nèi)存0x30000000,然后pc = 0x30000000、它可以順利執(zhí)行;

我將它拷貝至內(nèi)存0x38000000,然后pc = 0x38000000、它仍可以順利執(zhí)行。

1.程序的編譯及運(yùn)行流程

源碼經(jīng)過編譯、匯編(生成相對(duì)地址符號(hào)表)和連接(提供絕對(duì)首地址、進(jìn)而確定絕對(duì)地址符號(hào)表)后編程可執(zhí)行鏡像;

特別指出地是:在連接時(shí),對(duì)各個(gè)目標(biāo)文件進(jìn)行重定位、建立符號(hào)引用規(guī)則;進(jìn)而為變量和函數(shù)分配了絕對(duì)的運(yùn)行地址;

程序執(zhí)行時(shí),系統(tǒng)必須把可執(zhí)行鏡像加載到連接階段指定的地址空間,這樣程序執(zhí)行中才能對(duì)變量、函數(shù)等符號(hào)做正確引用,程序才能正常運(yùn)行。

在有操作系統(tǒng)的系統(tǒng)中,連接階段的重定位(即運(yùn)行地址的確定)由系統(tǒng)自動(dòng)完成;

而裸機(jī)開發(fā)中,這個(gè)地址必須由程序員在連接階段通過參數(shù)指定。

2.位置無(wú)關(guān)代碼的應(yīng)用場(chǎng)合:

程序在運(yùn)行期間動(dòng)態(tài)加載至內(nèi)存;

程序在不同場(chǎng)合與不同程序組合后加載至內(nèi)存(如共享的動(dòng)態(tài)鏈接庫(kù));

在運(yùn)行期間不同地址相互之間的映射(如bootloader程序的前4KB代碼;因?yàn)榫幾g連接后決定它的運(yùn)行地址是0x30000000,但剛開機(jī)時(shí)它是運(yùn)行在0x00000000的)。

3.原理

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

eg:

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

這個(gè)就是位置有關(guān)代碼,它不能在任意處加載運(yùn)行。

說明:編譯連接后函數(shù)a的運(yùn)行地址已經(jīng)被確定,例如0x80000100。

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

這個(gè)就是位置無(wú)關(guān)代碼,它可以被加載到非運(yùn)行地址處運(yùn)行。

說明:編譯連接后函數(shù)a的運(yùn)行地址已經(jīng)被確定,例如0x80000100。

一、名詞解釋

ARM位置無(wú)關(guān)代碼設(shè)計(jì)指的是該部分代碼編譯后的可執(zhí)行鏡像,加載到任何地址處都可以正常運(yùn)行。

即:程序不在連接時(shí)指定的運(yùn)行地址空間,也可以執(zhí)行。

二、實(shí)現(xiàn)的必要條件

1.ARM匯編中對(duì)程序運(yùn)行的相對(duì)跳轉(zhuǎn)指令:

BL a:運(yùn)行時(shí)首先獲得當(dāng)前PC值(也就是當(dāng)前代碼段的值),然后計(jì)算當(dāng)前PC值和a(也是由連接器獲得)間的距離;跳轉(zhuǎn)地址即是pc+offset。

相對(duì)跳轉(zhuǎn)指令的目標(biāo)地址用基于當(dāng)前PC的偏移量來(lái)表示、與連接時(shí)分配給地址標(biāo)號(hào)的絕對(duì)地址值無(wú)關(guān),因而、代碼可以在任何位置進(jìn)行跳轉(zhuǎn),實(shí)現(xiàn)位置無(wú)關(guān)性。

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

三、說明

連接階段執(zhí)行后,可執(zhí)行鏡像中的虛擬地址與內(nèi)存管理無(wú)關(guān)!



評(píng)論


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

關(guān)閉