u boot中鏈結位址和載入位址的相關知識

2021-07-01 23:19:03 字數 1103 閱讀 1405

以zc702開發板的u-boot為例

u-boot的鏈結指令碼由config_sys_ldscript巨集定義來指定,如在zynq_common.h當中有如下**:

#define config_sys_ldscript  "arch/arm/cpu/armv7/zynq/u-boot.lds"
在該鏈結指令碼中指定了u-boot中各部分的鏈結順序。同時zynq_common.h中的config_sys_text_base則指定了u-boot鏈結的起始位址,其定義如下:

#define config_sys_text_base   0x04000000

arch/arm/cpu/armv7/start.o(.text*)

.text 0x04000000 0x3a0 arch/arm/cpu/armv7/start.o

0x04000000 _start

0x04000040 _end_vect

0x04000040 _text_base

0x04000044 _bss_start_ofs

0x04000048 _bss_end_ofs

0x0400004c _end_ofs

是指程式實際在記憶體上存放的位址。

對於zc702來說,u-boot是被fsbl載入到記憶體中的,那麼fsbl將u-boot載入到**呢?實際上fsbl就是將u-boot載入到了它的鏈結位址上。fsbl通過讀取boot.bin(由fsbl和u-boot生成)的分割槽資訊來獲取u-boot的鏈結起始位址,然後就將這個鏈結起始位址作為u-boot的載入位址。

對於u-boot來說,鏈結位址和載入位址可以一樣也可以不一樣。如在zc702開發板的新版u-boot中(如2014.4),在u-boot重定位前這兩個位址是一樣的,重定位後鏈結位址和載入位址就不一樣了,但此時u-boot仍然可以正常執行(詳細原理見uboot的relocation原理詳細分析)。

執行位址和載入位址

在連線目標 時,會提到執行位址和載入位址。這兩者有什麼區別呢?載入時位址就是程式放置的位址,執行位址就是程式定位的絕對位址,也即在編譯連線時定位的位址 如果程式是在flash裡執行,則執行位址和載入位址是相同的。如果程式是在ram裡執行,但程式是儲存在flash裡,則執行位址指向ram,而載入位址是...

執行位址和載入位址

在連線目標 時,會提到執行位址和載入位址。這兩者有什麼區別呢?載入時位址就是程式放置的位址,執行位址就是程式定位的絕對位址,也即在編譯連線時定位的位址 如果程式是在flash裡執行,則執行位址和載入位址是相同的。如果程式是在ram裡執行,但程式是儲存在flash裡,則執行位址指向ram,而載入位址是...

執行位址和載入位址

執行位址和載入位址 在連線目標 時,會提到執行位址和載入位址。這兩者有什麼區別呢?載入時位址就是程式放置的位址,執行位址就是程式定位的絕對位址,也即在編譯連線時定位的位址。如果程式是在flash裡執行,則執行位址和載入位址是相同的。如果程式是在ram裡執行,但程式是儲存在flash裡,則執行位址指向...