訂閱
糾錯(cuò)
加入自媒體

從0學(xué)ARM——什么是位置無(wú)關(guān)碼?

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

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

1. exynos 4412啟動(dòng)流程首先看一下 exynos 4412 memory map :

可知:iROM基地址是0x00000000iRAM基地址是0x02020000

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

查看exynos 4412 Booting Sequence:

位于第五章。

上圖是exynos4412上電復(fù)位時(shí)的啟動(dòng)流程,大致如下:

<1>執(zhí)行內(nèi)部只讀存儲(chǔ)器iROM中的一段代碼(廠(chǎng)家固化在里面的),這段代碼主要是初始化一些系統(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鏡像一般是超過(guò)這個(gè)大小的,也就是說(shuō)它不能把完整的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ò)程必須由程序員來(lái)完成。

這樣就有了「位置無(wú)關(guān)代碼」的概念,指代碼不在連接時(shí)指定的運(yùn)行地址空間,也可以執(zhí)行,它一段加載到任意地址空間都能執(zhí)行的特殊代碼。

uboot搬移到DRAM中,然后跳轉(zhuǎn)到DRAM繼續(xù)運(yùn)行uboot剩下的代碼,那么在搬移之前的這段代碼必須是位置無(wú)關(guān),而且不能使用絕對(duì)尋址指令,否則尋址就會(huì)出錯(cuò)。

1  2  3  下一頁(yè)>  
聲明: 本文由入駐維科號(hào)的作者撰寫(xiě),觀(guān)點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)