從0學(xué)ARM——什么是位置無關(guān)碼?
一、為什么需要位置無關(guān)碼?
首先我們需要了解一下ARM板子的啟動流程。
1. exynos 4412啟動流程首先看一下 exynos 4412 memory map :
可知:iROM基地址是0x00000000iRAM基地址是0x02020000
這兩塊內(nèi)存都在 SOC中。
查看exynos 4412 Booting Sequence:
位于第五章。
上圖是exynos4412上電復(fù)位時的啟動流程,大致如下:
<1>執(zhí)行內(nèi)部只讀存儲器iROM中的一段代碼(廠家固化在里面的),這段代碼主要是初始化一些系統(tǒng)的基本配置,比如初步時鐘配置、堆棧、啟動模式(對應(yīng)圖中的標(biāo)志①)。
<2>iROM中的代碼根據(jù)階段一獲取的啟動模式(OM_STAT寄存器),從相應(yīng)的存儲介質(zhì)中拷貝BL1鏡像到內(nèi)部靜態(tài)隨機(jī)存儲器SRAM,BL1主要是完善系統(tǒng)時鐘的初始化工作、內(nèi)存控制器一些時序的配置。做完這些工作后把OS鏡像拷貝到內(nèi)存中(對應(yīng)圖中標(biāo)志②③)。
<3>跳轉(zhuǎn)到OS中執(zhí)行。
SRAM只有256KB,而uboot鏡像一般是超過這個大小的,也就是說它不能把完整的uboot鏡像拷貝到SRAM中,因此,推測這里的拷貝方式應(yīng)該還是:「BL1拷貝的僅僅是uboot的一部分」,這一部分除了能設(shè)置好基本的硬件運(yùn)行環(huán)境外,「還能把其自身(uboot鏡像)完整的拷貝到內(nèi)存中」,然后uboot在內(nèi)存中運(yùn)行,完成OS鏡像的拷貝和引導(dǎo)
一般情況下兩者的地址并不相同,程序在DRAM中的地址重定位過程必須由程序員來完成。
這樣就有了「位置無關(guān)代碼」的概念,指代碼不在連接時指定的運(yùn)行地址空間,也可以執(zhí)行,它一段加載到任意地址空間都能執(zhí)行的特殊代碼。
uboot搬移到DRAM中,然后跳轉(zhuǎn)到DRAM繼續(xù)運(yùn)行uboot剩下的代碼,那么在搬移之前的這段代碼必須是位置無關(guān),而且不能使用絕對尋址指令,否則尋址就會出錯。

最新活動更多
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀(jì)”爆發(fā)至今,五類新物種登上歷史舞臺
- 5 國產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來商業(yè)化突破,但落地仍需時間
- 7 東陽光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開成長空間
- 8 地平線自動駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?