一、為什么需要位置無關(guān)碼?
首先我們需要了解一下ARM板子的啟動(dòng)流程。
1. exynos 4412啟動(dòng)流程
首先看一下 exynos 4412 memory map :
可知:
iROM基地址是0x00000000
iRAM基地址是0x02020000
這兩塊內(nèi)存都在 SOC中。
查看exynos 4412 Booting Sequence:
位于第五章。
上圖是exynos4412上電復(fù)位時(shí)的啟動(dòng)流程,大致如下:
<1>執(zhí)行內(nèi)部只讀存儲(chǔ)器iROM中的一段代碼(廠家固化在里面的),這段代碼主要是初始化一些系統(tǒng)的基本配置,比如初步時(shí)鐘配置、堆棧、啟動(dòng)模式(對(duì)應(yīng)圖中的標(biāo)志①)。
<2>iROM中的代碼根據(jù)階段一獲取的啟動(dòng)模式(OM_STAT寄存器),從相應(yīng)的存儲(chǔ)介質(zhì)中拷貝BL1鏡像到內(nèi)部靜態(tài)隨機(jī)存儲(chǔ)器SRAM,BL1主要是完善系統(tǒng)時(shí)鐘的初始化工作、內(nèi)存控制器一些時(shí)序的配置。做完這些工作后把OS鏡像拷貝到內(nèi)存中(對(duì)應(yīng)圖中標(biāo)志②③)。
<3>跳轉(zhuǎn)到OS中執(zhí)行。
SRAM只有256KB,而uboot鏡像一般是超過這個(gè)大小的,也就是說它不能把完整的uboot鏡像拷貝到SRAM中,因此,推測(cè)這里的拷貝方式應(yīng)該還是:BL1拷貝的僅僅是uboot的一部分,這一部分除了能設(shè)置好基本的硬件運(yùn)行環(huán)境外,還能把其自身(uboot鏡像)完整的拷貝到內(nèi)存中,然后uboot在內(nèi)存中運(yùn)行,完成OS鏡像的拷貝和引導(dǎo)
一般情況下兩者的地址并不相同,程序在DRAM中的地址重定位過程必須由程序員來完成。
這樣就有了位置無關(guān)代碼的概念,指代碼不在連接時(shí)指定的運(yùn)行地址空間,也可以執(zhí)行,它一段加載到任意地址空間都能執(zhí)行的特殊代碼。
uboot搬移到DRAM中,然后跳轉(zhuǎn)到DRAM繼續(xù)運(yùn)行uboot剩下的代碼,那么在搬移之前的這段代碼必須是位置無關(guān),而且不能使用絕對(duì)尋址指令,否則尋址就會(huì)出錯(cuò)。
二、怎么實(shí)現(xiàn)位置無關(guān)碼?
1. 什么是《編譯地址》?什么是《運(yùn)行地址》?
編譯地址:
32位的處理器,它的每一條指令是4個(gè)字節(jié),以4個(gè)字節(jié)存儲(chǔ)順序,進(jìn)行順序執(zhí)行,CPU是順序執(zhí)行的,只要沒發(fā)生什么跳轉(zhuǎn),它會(huì)順序進(jìn)行執(zhí)行, 編譯器會(huì)對(duì)每一條指令分配一個(gè)編譯地址,這是編譯器分配的,在編譯過程中分配的地址,我們稱之為編譯地址。
運(yùn)行地址:
是指程序指令真正運(yùn)行的地址,是由用戶指定的,用戶將運(yùn)行地址燒錄到哪里,哪里就是運(yùn)行的地址。
比如有一個(gè)指令的編譯地址是0x40008000,實(shí)際運(yùn)行的地址是0x40008000,如果用戶將指令燒到0x60000000上,那么這條指令的運(yùn)行地址就是0x60000000。
當(dāng)編譯地址和運(yùn)行地址不同的時(shí)候會(huì)出現(xiàn)什么結(jié)果?
結(jié)果是不能跳轉(zhuǎn),編譯后會(huì)產(chǎn)生跳轉(zhuǎn)地址,如果實(shí)際地址和編譯后產(chǎn)生的地址不相等,那么就不能跳轉(zhuǎn)。
C語言編譯地址:
都希望把編譯地址和實(shí)際運(yùn)行地址放在一起的,但是匯編代碼因?yàn)椴恍枰鯟語言到匯編的轉(zhuǎn)換,可以直接的去寫地址,所以直接寫的就是他的運(yùn)行地址,這就是為什么任何bootloader剛開始會(huì)有一段匯編代碼,因?yàn)槠鹗即a編譯地址和實(shí)際地址不相等,這段代碼和匯編無關(guān),跳轉(zhuǎn)用的運(yùn)行地址。
2. 舉例
實(shí)現(xiàn)位置無關(guān)碼主要考慮以下兩個(gè)方面:
1. 位置無關(guān)的函數(shù)跳轉(zhuǎn)2. 位置無關(guān)的常量訪問
下面我們通過兩個(gè)例子詳細(xì)講解。
3. 代碼
編譯代碼使用的連接文件map.lds如下:
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS{. = 0x40008000;. = ALIGN(4);.text :{
gcd.o(.text)*(.text)}. = ALIGN(4);.rodata :
{ *(.rodata) }. = ALIGN(4);.data :
{ *(.data) }. = ALIGN(4);.bss : { *(.bss) }}
如文件map.lds所示:0x40008000就是鏈接地址,
其他源文件如下:
gcd.s
.text.global _start
_start:
ldr sp,=0x70000000 /*get stack top pointer*/
bl func
ldr pc,=func
b main
func:
mv pc,lr
main.c
/*
* main.c
*
* Created on: 2020-12-12
* Author: 一口Linux
*/int aaaa=0; int main(void){
aaaa = 0x11;while(1);return 0;}
Makefile
TARGET=gcd
TARGETC=main
all:
arm-none-linux-gnueabi-gcc -O1 -g -c -o $(TARGETC).o $(TARGETC).c
arm-none-linux-gnueabi-gcc -O1 -g -c -o $(TARGET).o $(TARGET).s
arm-none-linux-gnueabi-gcc -O1 -g -S -o $(TARGETC).s $(TARGETC).c
arm-none-linux-gnueabi-ld $(TARGETC).o $(TARGET).o -Tmap.lds -o $(TARGET).elf
arm-none-linux-gnueabi-objcopy -O binary -S $(TARGET).elf $(TARGET).bin
arm-none-linux-gnueabi-objdump -D $(TARGET).elf > $(TARGET).dis
clean:
rm -rf *.o *.elf *.dis *.bin
反匯編文件gcd.dis
如上圖所示:
_start對(duì)應(yīng)的鏈接地址是0x40008000
9行 bl func對(duì)應(yīng)的指令
10行 ldr pc,=pc對(duì)應(yīng)的指令
func的鏈接地址0x40008010
全局變量aaaa對(duì)應(yīng)的內(nèi)存位于bss段0x4000802c
19行 aaaa = 0x11 賦值語句對(duì)應(yīng)的機(jī)器碼
如果我們將生成的bin文件拷貝到內(nèi)存0x40008000位置運(yùn)行必然沒有問題,
bl func 和 ldr pc,=func 都能跳轉(zhuǎn)到func函數(shù),
而19行代碼,也能訪問到全局變量aaaa。
如果我們將該程序拷貝到其他地址是否能正常運(yùn)行呢?
假定我們拷貝到0地址運(yùn)行,那么程序的執(zhí)行地址需要從0開始重新編排,即_start對(duì)應(yīng)0地址,main對(duì)應(yīng)0x18。
拷貝到0地址后內(nèi)存布局:
拷貝到0地址運(yùn)行后,**內(nèi)存中指令(機(jī)器碼)**的內(nèi)容還和以前一樣,
pc的值會(huì)根據(jù)實(shí)際運(yùn)行地址重新修正。
首先看bl func
對(duì)應(yīng)的匯編代碼是 第9行;
該指令的機(jī)器碼是0xeb000001,
我們?cè)凇?. 從0開始學(xué)ARM-ARM指令,移位、數(shù)據(jù)處理、BL、機(jī)器碼》講過該機(jī)器碼格式是從pc的位置向前偏移1條指令
因?yàn)槿?jí)流水線,所以應(yīng)該往下偏移3條指令,即func的位置,
所以bl仍然可以正確找到func這個(gè)函數(shù)。
ldr pc,=func
對(duì)應(yīng)的匯編代碼是 第10行;
我們可以看到是從pc值+4位置取出對(duì)應(yīng)的內(nèi)存的值,pc值+4是14,該位置對(duì)應(yīng)15行,
即將40008010寫入到pc,
而我們的bin文件只有44個(gè)字節(jié)大小,所以此時(shí)內(nèi)存40008010并沒有我們編寫的任何代碼。
所以ldr pc,=func 無法跳轉(zhuǎn)到func。
c訪問全局變量aaaa
對(duì)應(yīng)的匯編代碼是 第19行;
我們可以看到是從pc值+4位置取出對(duì)應(yīng)的內(nèi)存的值,pc值+4是28,該位置對(duì)應(yīng)22行,
即將4000802c寫入到r3,然后20行會(huì)將r2中值寫入到0x4000802c這個(gè)地址,
而此時(shí)該地址并不是全局變量aaaa,
所以此指令是無法找到bss段的aaaa變量的內(nèi)存。
四、總結(jié)
1. 位置無關(guān)碼:
CPU取指時(shí)用相對(duì)地址取指令(比如pc +4),只要其相對(duì)地址沒有變,都能夠取指并運(yùn)行。即該段代碼無論放在內(nèi)存的哪個(gè)地址,都能正確運(yùn)行。究其原因,是因?yàn)榇a里沒有使用絕對(duì)地址,都是相對(duì)地址。
2. 位置相關(guān)碼:
利用絕對(duì)地址取指并運(yùn)行,這就需要你存放程序(鏈接過程中)需要按照連接腳本的要求那樣執(zhí)行(Makefile里面有 -Ttext xxx指定或連接腳本)。
即它的地址與代碼處于的位置相關(guān),是絕對(duì)地址,如:mov PC ,#0xff;ldr pc,=0xffff等。
3. 位置無關(guān)碼的應(yīng)用:
1). 程序在運(yùn)行期間動(dòng)態(tài)加載到內(nèi)存;
2). 程序在不同場(chǎng)合與不同程序組合后加載到內(nèi)存(共享的動(dòng)態(tài)鏈接庫);
3). 在運(yùn)行期間不同地址相互之間的映射(如bootloader)
4. 結(jié)論
使用mov pc ,xxx ; ldr pc ,xxx等就是位置相關(guān)碼。這些使用絕對(duì)指令尋址。
而使用bl ,b ,adr,ldr一般為位置無關(guān)碼。
在使用b, bl調(diào)用C語言中的函數(shù)里不要使用全局變量,因?yàn)镃中全局變量的地址也是根據(jù)鏈接地址生成的。
使用=和不使用=號(hào)是有很大區(qū)別的。
無=號(hào):取該標(biāo)號(hào)處的值,位置無關(guān)
有=號(hào):取該標(biāo)號(hào)的地址,位置相關(guān)
五、思考題
考一考大家為什么uboot的異常向量表的reset異常,指令是b reset,而其他異常卻是我們本文所說的位置相關(guān)碼,ldr pc,XXXXXX?
arm對(duì)應(yīng)的uboot異常向量表如下:
arch/arm/cpu/armv7/start.S
上一篇:23. 基于Cortex-A9 uboot代碼啟動(dòng)分析
下一篇:最后一頁
推薦閱讀
史海拾趣
友盟(AP)公司在電子行業(yè)的崛起,始于其堅(jiān)持不懈的技術(shù)創(chuàng)新。在創(chuàng)立初期,友盟就敏銳地捕捉到了移動(dòng)互聯(lián)網(wǎng)快速發(fā)展的趨勢(shì),投入大量資源進(jìn)行技術(shù)研發(fā)。公司團(tuán)隊(duì)深入研究用戶行為分析、大數(shù)據(jù)分析等前沿技術(shù),不斷推出具有創(chuàng)新性的產(chǎn)品和服務(wù)。通過精準(zhǔn)的數(shù)據(jù)分析和個(gè)性化推薦,友盟成功幫助眾多合作伙伴提升了用戶體驗(yàn)和業(yè)務(wù)效率,逐漸在行業(yè)內(nèi)樹立起了良好的口碑。
隨著公司的發(fā)展壯大,迦美信芯不僅在上海設(shè)立了總部,還在杭州、北京、深圳等地設(shè)立了全資子公司和業(yè)務(wù)辦事處。此外,公司還在歐洲比利時(shí)設(shè)立了研發(fā)中心,以進(jìn)一步拓展全球市場(chǎng)。這些布局不僅增強(qiáng)了公司的研發(fā)實(shí)力,也為其在全球范圍內(nèi)的業(yè)務(wù)拓展提供了有力支持。
面對(duì)數(shù)字化浪潮的沖擊,康奈特積極響應(yīng)并開始了數(shù)字化轉(zhuǎn)型之路。公司引進(jìn)了先進(jìn)的智能制造設(shè)備和技術(shù)手段,實(shí)現(xiàn)了生產(chǎn)線的自動(dòng)化和智能化升級(jí)。同時(shí),公司還建立了數(shù)字化管理平臺(tái),實(shí)現(xiàn)了對(duì)生產(chǎn)、銷售、庫存等各個(gè)環(huán)節(jié)的實(shí)時(shí)監(jiān)控和管理。這種數(shù)字化轉(zhuǎn)型不僅提高了生產(chǎn)效率和質(zhì)量穩(wěn)定性,也為公司未來的發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
作為一家技術(shù)驅(qū)動(dòng)的公司,Atlanta Micro始終重視研發(fā)實(shí)力的提升。公司不斷加大研發(fā)投入,引進(jìn)了一批高素質(zhì)的研發(fā)人才,并建立了完善的研發(fā)體系。這些舉措使得公司的研發(fā)能力得到了顯著提升,不斷推出具有市場(chǎng)競(jìng)爭(zhēng)力的新產(chǎn)品,為公司的發(fā)展提供了源源不斷的動(dòng)力。
近年來,Desoutter公司開始重視中國市場(chǎng)的發(fā)展,并加大了在中國的投資和布局。公司在中國設(shè)立了多個(gè)銷售和服務(wù)中心,以便更好地服務(wù)中國客戶。同時(shí),Desoutter公司還與中國本土企業(yè)開展合作,共同開發(fā)適合中國市場(chǎng)的產(chǎn)品。這些舉措使Desoutter公司在中國市場(chǎng)的份額不斷擴(kuò)大,品牌影響力也得到了提升。
以上五個(gè)故事涵蓋了Desoutter公司在電子行業(yè)中的發(fā)展歷程、技術(shù)創(chuàng)新、國際化戰(zhàn)略、合并與擴(kuò)張以及中國市場(chǎng)的發(fā)展等方面。這些故事基于事實(shí)描述,旨在展現(xiàn)Desoutter公司在電子行業(yè)中的成長和變化。
隨著國防事業(yè)的不斷發(fā)展,軍事電子產(chǎn)品的市場(chǎng)需求也在不斷增加。Defense Supply Center Columbus公司敏銳地捕捉到了這一市場(chǎng)機(jī)遇,積極拓展國內(nèi)外市場(chǎng)。公司通過與國內(nèi)外知名企業(yè)和機(jī)構(gòu)建立合作關(guān)系,共同開發(fā)新產(chǎn)品、新技術(shù),不斷拓展市場(chǎng)份額。同時(shí),公司還積極參加各類國際展覽和論壇,展示公司的技術(shù)實(shí)力和產(chǎn)品優(yōu)勢(shì),吸引了眾多潛在客戶的關(guān)注。這些市場(chǎng)拓展的努力,為公司的發(fā)展注入了新的動(dòng)力。
汽車電子產(chǎn)品EMC標(biāo)準(zhǔn)與常見解決方法 摘 要:本文主要介紹汽車電子產(chǎn)品供應(yīng)商給車廠供貨時(shí),由于嚴(yán)酷EMC要求,往往電磁兼容驗(yàn)證不能通過,導(dǎo)致供貨受到一定的影響;本文結(jié)合實(shí)際設(shè)計(jì)一個(gè)普通的產(chǎn)品 EMC進(jìn)行分析,說明車廠的EMC要求以及常見問題與解決方法。 關(guān)鍵詞: BCI(大電流注 ...… 查看全部問答∨ |
byteflight協(xié)議由BMW聯(lián)合Motorola,Elmos及Infineon公司聯(lián)合開發(fā),主要用于機(jī)動(dòng)車輛中的安全臨界應(yīng)用。該系統(tǒng)應(yīng)用在BMW 7系列汽車中,主要用于安全氣囊系統(tǒng)中時(shí)間臨界(time-critical)數(shù)據(jù)的傳輸。另外,還可用于傳輸車身及底盤電子系統(tǒng)的相關(guān)數(shù)據(jù)。 ...… 查看全部問答∨ |
高價(jià)收購現(xiàn)有手持嵌入式或單片機(jī)RFID數(shù)據(jù)采集產(chǎn)品的方案 高價(jià)收購現(xiàn)有手持嵌入式或單片機(jī)RFID數(shù)據(jù)采集產(chǎn)品的方案 我現(xiàn)在有個(gè)項(xiàng)目要用手持的數(shù)據(jù)采集產(chǎn)品,現(xiàn)高價(jià)收購 要求如下: 1.提供原理圖,PCB Layout 2.提供系統(tǒng)軟件原代碼 3.使用單片機(jī)或嵌入式CPU 4.讀寫RFID 5.將RFID資料用GRPS發(fā)給服務(wù)器 ...… 查看全部問答∨ |
|
誠聘驅(qū)動(dòng)開始人員1位,過濾驅(qū)動(dòng)開發(fā)。 誠聘驅(qū)動(dòng)開始人員1位,過濾驅(qū)動(dòng)開發(fā)。 共同創(chuàng)業(yè),前途無量。 創(chuàng)業(yè)地點(diǎn):山東威海 簡歷投放:pass86@gmail.com… 查看全部問答∨ |
如果說實(shí)現(xiàn)是一種技能,方案的討論和擬定就是一種思維。很多時(shí)候我們只關(guān)注實(shí)現(xiàn)而忽略在制定方案的過程中自己全局思維的一種成長。為了更完整的把這次DIY的活動(dòng)的過程呈現(xiàn)給大家,我在此貼上整理后的討論記錄?;臼菬o刪減版的,必要的地方我注釋 ...… 查看全部問答∨ |
求AM2301溫濕度傳感器得到的數(shù)據(jù)怎么存到sd卡中 如題,需要在sd卡中得到TXT文檔,里面有時(shí)間。溫度。濕度的標(biāo)題,底下是數(shù)據(jù),我是學(xué)生剛接觸這個(gè),不是很懂,如果有懂得希望可以幫助解決,感謝!… 查看全部問答∨ |
TM4出“新”EK-TM4C123GXL -Tiva Launchpad,以前的 TM4的launchpad主控由LM4F120H5Q更改為TM4C123GH6PM,性能上增強(qiáng),增加了 PWM, QEI 和 USB host/OTG 想拿到板子估計(jì)是10周以后的事情,論壇會(huì)不會(huì)有搶先版呢? Tiva™ C Series TM4C123G LaunchPad The Tiva C Series TM4C123G LaunchPad E ...… 查看全部問答∨ |
這是10nf的意思嗎 J100又指的是什么 這是1K是的電阻嗎?前面的u和后面的63指什么? 這些為什么是紅色的?是代表精度嗎?以前沒見過這樣的電阻電容。大神能不能解釋一下,謝謝! … 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- 保障工業(yè)核心命脈:深度解讀工業(yè)交換機(jī)QoS的“智能流量治理”之道
- WAIC 直擊|Arm 鄒挺:突破基礎(chǔ)設(shè)施、數(shù)據(jù)安全與人才三重挑戰(zhàn),釋放 AI 發(fā)展新潛能
- 鎧俠第九代 BiCS FLASH? 512Gb TLC 存儲(chǔ)器開始送樣
- 基于PPEC32系列芯片的10kW純正弦波車載逆變器應(yīng)用方案
- 新唐科技推出全新KM1M4BF6x系列單電機(jī)控制MCU
- 伺服電機(jī)中的回原點(diǎn)方式
- 芯科集成CX3288系列車規(guī)MCU在旋轉(zhuǎn)變壓器的應(yīng)用
- AI玩具DC-DC芯片,安全與成本雙突圍
- 訂單暴增800%!消費(fèi)芯片新風(fēng)口:東北裝空調(diào)
- 機(jī)器人也能純視覺控制?MIT華人博士團(tuán)隊(duì)登上Nature主刊
- 【六一兒童節(jié)】說說你童年的夢(mèng)想!
- 有獎(jiǎng)直播 | 微軟 Azure Sphere助力穩(wěn)定,安全和靈活的物聯(lián)網(wǎng)解決方案
- TE專題:可靠連接解決方案大集合
- ams圣誕禮物大作戰(zhàn):掃碼、關(guān)注、玩游戲、贏禮!
- ADI 全新技術(shù)資料集錦
- Digi-Key KOL視頻來襲~資深算法工程師暢聊圖像處理秘訣
- 有獎(jiǎng)直播|貝能國際推出基于英飛凌技術(shù)的毫米波雷達(dá)模組,完美解決PIR市場(chǎng)痛點(diǎn)
- 免費(fèi)申請(qǐng)|ATmega4809 Curiosity Nano
- 下載嘍:PCIe要了解的10件事和識(shí)別協(xié)議的BSX系列BERTScope誤碼率測(cè)試儀技術(shù)資料
- 從“手”到 ”腦”的升級(jí),泰克測(cè)試小劇場(chǎng)開播
- 凌華一體化AI智能相機(jī),讓自動(dòng)化制造應(yīng)用部署更快更簡單
- 成立僅一年,聯(lián)想凌拓研發(fā)能力便獲得權(quán)威機(jī)構(gòu)高度認(rèn)可
- 更節(jié)能更強(qiáng)大,Imagination成本敏感型應(yīng)用iEW410 IP問市
- 寶德:鯤鵬加持,乘風(fēng)而行勢(shì)不可擋
- 富士康A(chǔ)股掛牌,郭臺(tái)銘沒說的4件事
- 3億用戶Twitter終于單季盈利
- 谷歌AI相機(jī)面世 這款會(huì)讓攝影師失業(yè)的神器放了哪些大招?
- 富士康子公司擬在上交所上市 募集資金投資物聯(lián)網(wǎng)
- 樂視離職員工接到法院電話:支付50%欠薪 剩下不給了
- 為了感謝大家對(duì)論壇的支持,想自己做些東西送給網(wǎng)友
- BeagleBone Black 系統(tǒng)參考手冊(cè)
- 求救!evc串口收發(fā)數(shù)據(jù)問題
- 第13章 精靈進(jìn)程
- BlueNRG-1添加DeviceInformation信息
- MicroPython編程的話是不是最好用ESP32
- 【GD32L233C-START評(píng)測(cè)】15. flash擦寫操作,將FLASH當(dāng)做EEPROM使用
- 收到xilinx的試用板 上裸照
- Wince6.0基于Directshow攝像頭驅(qū)動(dòng)開發(fā)
- LM3S系列PWM問題