重定位引入和鏈結指令碼1

2021-10-02 18:49:33 字數 1033 閱讀 9660

1、乙個事實:大部分指令是位置有關碼

位置無關碼(pic position independent code):彙編原始檔被編碼成二進位制可執行程式時編碼方式(生成的可執行程式)與位置(記憶體位址)無關。

位置有關編碼:彙編原始檔被編碼成二進位制可執行程式後和記憶體位址是有關的。

我們在設計乙個程式時,會給這個程式指定乙個執行位址(鏈結位址),就是說我們在編譯程式時其實心裡是知道我們程式將來被執行時的位址(執行位址)的,而且必須給編譯器鏈結器指定這個位址(鏈結位址)才行。最後得到乙個二進位制程式理論上是和你指定的執行位址(鏈結位址)有關的,將來這個程式被執行時必須放在當時編譯鏈結時給定的那個位址(鏈結位址)下才行,否則不能執行(叫位置無關碼)。但是有個別特別的指令他可以跟指定的位址(鏈結位址)沒有關係,也就是說這些**實際執行時不管放在那裡都能正常執行。

uboot實際使用的方式:uboot大小隨意,假定為200kb,啟動過程是這樣;先開機上電後先開機上電後bl0執行,bl0會載入外部啟動裝置中的的uboot的前16kb(bl1)到sram中去執行;bl1執行時會初始化ddr,然後將整個uboot搬運到ddr中,然後用一句長跳轉(從sram跳轉到ddr)指令從sram中直接跳轉到ddr中繼續執行uboot直到uboot完全啟動。

4、現在明白為什麼要重定位了吧?

原因:鏈結位址和執行位址有時候必須不同,而且還不能全部用位置無關碼,這時候只能重定位。

擴充套件:分散載入:把uboot分成兩部分(bl1和整個uboot),兩部分分別指定不同的鏈結位址,啟動時將兩部分載入到不同的位址(bl1載入到sram,整個uboot載入到ddr),這時候不用重定位也能啟動。

評價:分散載入其實相當於手工重定位。重定位是用**自動進行重定位,分散載入是手工重定位。

*iram(iram)位址對映圖:*

s5pv210啟動過程**:

1 5 5 重定位引入和鏈結指令碼1

朱老師物聯網大講堂 學習筆記 重定位引入和鏈結指令碼 位置無關編碼 位置有關編碼 我們在設計程式的時候會給程式指定乙個執行位址,比如0xd0020010 這裡是通過鏈結器中指定來設定的,它的另乙個說法也叫鏈結位址,鏈結位址可以通過上面的 ttext或者鏈結指令碼來指定。程式的執行位址和我們的設定有關...

重定位引入和鏈結指令碼

1 乙個事實 大部分指令是位置有關編碼 位置無關編碼 pic,position independent code 彙編原始檔被編碼成二進位制可執行程式時編碼方式與位置 記憶體位址 無關。位置有關編碼 彙編原始碼編碼成二進位制可執行程式後和記憶體位址是有關的。我們在設計乙個程式時,會給這個程式指定乙個...

重定位和鏈結指令碼

重定位實際就是在執行位址處執行一段位置無關碼pic,讓這段pic 也就是重定位 從執行位址處把整個程式映象拷貝乙份到鏈結位址處,完了之後使用一句長跳轉指令從執行位址處直接跳轉到鏈結位址處去執行同乙個函式,這樣就實現了重定位之後的無縫連線。鏈結位址 鏈結時指定的位址 指定方式為 makefile中用 ...