以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裡,則執行位址指向...