從0學ARM——什么是位置無關碼?
一、為什么需要位置無關碼?
首先我們需要了解一下ARM板子的啟動流程。
1. exynos 4412啟動流程首先看一下 exynos 4412 memory map :

可知:iROM基地址是0x00000000iRAM基地址是0x02020000
這兩塊內存都在 SOC中。
查看exynos 4412 Booting Sequence:
位于第五章。

上圖是exynos4412上電復位時的啟動流程,大致如下:
<1>執行內部只讀存儲器iROM中的一段代碼(廠家固化在里面的),這段代碼主要是初始化一些系統的基本配置,比如初步時鐘配置、堆棧、啟動模式(對應圖中的標志①)。
<2>iROM中的代碼根據階段一獲取的啟動模式(OM_STAT寄存器),從相應的存儲介質中拷貝BL1鏡像到內部靜態隨機存儲器SRAM,BL1主要是完善系統時鐘的初始化工作、內存控制器一些時序的配置。做完這些工作后把OS鏡像拷貝到內存中(對應圖中標志②③)。
<3>跳轉到OS中執行。
SRAM只有256KB,而uboot鏡像一般是超過這個大小的,也就是說它不能把完整的uboot鏡像拷貝到SRAM中,因此,推測這里的拷貝方式應該還是:「BL1拷貝的僅僅是uboot的一部分」,這一部分除了能設置好基本的硬件運行環境外,「還能把其自身(uboot鏡像)完整的拷貝到內存中」,然后uboot在內存中運行,完成OS鏡像的拷貝和引導
一般情況下兩者的地址并不相同,程序在DRAM中的地址重定位過程必須由程序員來完成。
這樣就有了「位置無關代碼」的概念,指代碼不在連接時指定的運行地址空間,也可以執行,它一段加載到任意地址空間都能執行的特殊代碼。
uboot搬移到DRAM中,然后跳轉到DRAM繼續運行uboot剩下的代碼,那么在搬移之前的這段代碼必須是位置無關,而且不能使用絕對尋址指令,否則尋址就會出錯。
請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
- 1 AI狂歡遇上油價破百,全球股市還能漲多久? | 產聯看全球
- 2 OpenAI深夜王炸!ChatGPT Images 2.0實測:中文穩、細節炸,設計師慌了
- 3 6000億美元估值錨定:字節跳動的“去單一化”突圍與估值重構
- 4 Tesla AI5芯片最新進展總結
- 5 連夜測了一波DeepSeek-V4,我發現它可能只剩“審美”這個短板了
- 6 熱點丨AI“瑜亮之爭”:既生OpenClaw,何生Hermes?
- 7 AI界的殺豬盤:9秒刪庫跑路,全員被封號,還繼續扣錢!
- 8 2026,人形機器人只贏了面子
- 9 DeepSeek降價90%:價格屠夫不是身份,是戰略
- 10 AI Infra產業鏈卡在哪里了?


分享













