日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年07月28日(星期一)

2021年07月28日 | 15. 從0開始學(xué)ARM-位置無關(guān)碼

發(fā)布者:sclibin 來源: eefocus關(guān)鍵字:ARM  位置無關(guān)碼  啟動(dòng)流程 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

一、為什么需要位置無關(guān)碼?

首先我們需要了解一下ARM板子的啟動(dòng)流程。

1. exynos 4412啟動(dòng)流程

  1. 首先看一下 exynos 4412 memory map :
    Memory Map可知:
    iROM基地址是0x00000000
    iRAM基地址是0x02020000

這兩塊內(nèi)存都在 SOC中。

  1. 查看exynos 4412 Booting Sequence:

位于第五章。

Booting Time Operation
上圖是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

鏈接地址0x40008000

如上圖所示:


_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地址后內(nèi)存布局
拷貝到0地址運(yùn)行后,**內(nèi)存中指令(機(jī)器碼)**的內(nèi)容還和以前一樣,
pc的值會(huì)根據(jù)實(shí)際運(yùn)行地址重新修正。

  1. 首先看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ù)。

bl func

  1. ldr pc,=func
    對(duì)應(yīng)的匯編代碼是 第10行;

ldr pc,=func
我們可以看到是從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。

  1. c訪問全局變量aaaa

對(duì)應(yīng)的匯編代碼是 第19行;

c訪問全局變量aaaa

我們可以看到是從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é)論

  1. 使用mov pc ,xxx ; ldr pc ,xxx等就是位置相關(guān)碼。這些使用絕對(duì)指令尋址。

  2. 而使用bl ,b ,adr,ldr一般為位置無關(guān)碼。

  3. 在使用b, bl調(diào)用C語言中的函數(shù)里不要使用全局變量,因?yàn)镃中全局變量的地址也是根據(jù)鏈接地址生成的。

  4. 使用=和不使用=號(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

在這里插入圖片描述

關(guān)鍵字:ARM  位置無關(guān)碼  啟動(dòng)流程 引用地址:15. 從0開始學(xué)ARM-位置無關(guān)碼

上一篇:23. 基于Cortex-A9 uboot代碼啟動(dòng)分析
下一篇:最后一頁

推薦閱讀

7月26日,2018中國焊接機(jī)器人在武進(jìn)國家高新區(qū)舉行,300多位行業(yè)專家學(xué)者、企業(yè)家參會(huì)。副市長梁一波出席并講話。 論壇由中國機(jī)器人產(chǎn)業(yè)聯(lián)盟、常州市政府主辦,武進(jìn)國家高新區(qū)和江蘇省機(jī)器人與智能裝備產(chǎn)業(yè)技術(shù)創(chuàng)新戰(zhàn)略聯(lián)盟承辦,設(shè)主論壇和金屬分論壇、精密焊接分論壇等。 機(jī)器人是武進(jìn)高新區(qū)的一張產(chǎn)業(yè)名片,園區(qū)初步形成從零部件生產(chǎn)到整機(jī)裝配的...
國網(wǎng)湘西供電公司總經(jīng)理 謝國勝 國網(wǎng)公司提出“三型兩網(wǎng)、世界一流”新戰(zhàn)略,推動(dòng)“堅(jiān)強(qiáng)智能電網(wǎng)”與“泛在電力物聯(lián)網(wǎng)”協(xié)同并進(jìn)、融合發(fā)展。國網(wǎng)湘西供電公司結(jié)合實(shí)際,深入領(lǐng)會(huì)“三型兩網(wǎng)”建設(shè)的豐富內(nèi)涵,積極探索符合湘西區(qū)域特點(diǎn)的“兩網(wǎng)”融合發(fā)展模式。 統(tǒng)一思想 領(lǐng)會(huì)“三型兩網(wǎng)”建設(shè)內(nèi)涵 “三型兩網(wǎng)、世界一流”提出以來,國網(wǎng)湘西供電...
英特爾上周四表示,7納米制程的良率偏低恐導(dǎo)致相關(guān)CPU產(chǎn)品時(shí)間表較預(yù)定目標(biāo)延遲12個(gè)月,該公司未來可能考慮將芯片制造外包給其他代工廠。外媒指出,英特爾的這一聲明為美國主導(dǎo)先進(jìn)制造的時(shí)代畫上了句號(hào)。據(jù)日經(jīng)亞洲評(píng)論報(bào)道,伯恩斯坦研究公司的資深科技分析師Mark Li表示:“單純從技術(shù)角度看,英特爾落后于臺(tái)積電一到兩年,而若還考慮在提高產(chǎn)量和供應(yīng)...
之前有寫過如何在Linux上使用openOCD給STM32下載程序的文章,今天給大家介紹一下如何在Windows上使用openOCD。Linux下開發(fā)stm32(二) | 使用openocd下載程序一、OpenOCD介紹openocd全名叫做Open On-Chip Debugger,是一個(gè)自由開放的片上調(diào)試工具和編程工具,目前已經(jīng)發(fā)布到0.11.0版本,目前主流調(diào)試器幾乎都支持,具體可以查看Open On-Chip Debugge...

史海拾趣

問答坊 | AI 解惑

汽車電子產(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é)議簡介

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ù)。 ...…

查看全部問答∨

AT命令的問題

AT的撥號(hào)指令、APN PDP、ppp的指令都是什么啊 知道幾個(gè)說幾個(gè) ,謝謝了。…

查看全部問答∨

高價(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…

查看全部問答∨

【MSP430超低功耗時(shí)鐘】第一次小組討論

如果說實(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指什么? 這些為什么是紅色的?是代表精度嗎?以前沒見過這樣的電阻電容。大神能不能解釋一下,謝謝! …

查看全部問答∨

模擬雜記ing

本帖最后由 dontium 于 2015-1-23 11:33 編輯 1.源跟隨器引入顯著的噪聲,【why】 2.差分對(duì)差模分析:Av-dm與Ro,不管單端還是雙端,差分信號(hào)施加的方式一樣。可以看做Gm≡1/2*gm。單端時(shí),Ro=Rd ; Av-dm=1/2*gm * Rd=1/2*gm*Rd ;雙端時(shí),Ro=2Rd ...…

查看全部問答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved