uboot移植過程中的執行地址和裝載地址的區別
阿新 • • 發佈:2019-02-05
連線指令碼檔案lds中沒有設定LMA,只是設定了VMA。VMA的設定是通過頂層目錄下的config.mk檔案中的LDFLAGS實現的
在board/smdk2410/config.mk定義了TEXT_BASE = 0x33F80000(SDRAM),即程式的執行地址 _armboot_start
173 0x33f80000 _start
174 board/samsung/fs2410/lowlevel_init.o(.text)
175 .text 0x33f804a0 0x64 board/samsung/fs2410/lowlevel_init.o
176 0x33f804a4 lowlevel_init
177 board/samsung/fs2410/nand_read.o(.text)
178 .text 0x33f80504 0xe8 board/samsung/fs2410/nand_read.o
179 0x33f80504 wait_idle
180 0x33f80518 nand_read_ll
此時裝載地址和執行地址明顯不一樣,為什麼程式還能執行呢?這裡就涉及到PIC----程式碼無關設計方面的知識了。在組合語言中,像bl、b、adr(adr屬於偽指令,一般被編譯器解釋成sub指令)指令屬於位置無關指令,不管程式裝載在哪個位置上,bl、b、adr指令都能正確的執行,其原因是bl、b、adr指令的地址域是基於PC的相對偏移定址,相當於[pc+offset]。當ARM啟動時,ARM自動取0x00000000位置上的指令,此時PC=0x00000000。
基於PC偏移量的指令都能正確的執行。所以uboot第一階段指令都能執行的原因在於此。
但我們回顧一下u-boot的啟動過程中的第一階段有將u-boot程式碼複製到SDRAM中,並跳到SDRAM中去執行,因為SDRAM對映到了BANK6,其地址為0x30000000,此時uboot程式碼的地址範圍從 TEXT_BASE ----TEXT_BASE+size(u-boot),程式是如何跳轉的呢?跳轉到SDRAM為何還能執行呢?這裡就需要看下cpu/arm920t/start.S中的relocate標號。
在board/smdk2410/config.mk定義了TEXT_BASE = 0x33F80000(SDRAM),即程式的執行地址
檢視u-boot.map檔案,程式碼的連線地址是從0x33F80000開始的。
167 .text 0x33f80000 0x232c8
168 cpu/arm920t/start.o(.text)
169 .text 0x33f80000 0x4a0 cpu/arm920t/start.o
170 0x33f80048 _bss_start
171 0x33f8004c _bss_end
172 0x33f80044
173 0x33f80000 _start
174 board/samsung/fs2410/lowlevel_init.o(.text)
175 .text 0x33f804a0 0x64 board/samsung/fs2410/lowlevel_init.o
176 0x33f804a4 lowlevel_init
177 board/samsung/fs2410/nand_read.o(.text)
178 .text 0x33f80504 0xe8 board/samsung/fs2410/nand_read.o
179 0x33f80504 wait_idle
180 0x33f80518 nand_read_ll
基於PC偏移量的指令都能正確的執行。所以uboot第一階段指令都能執行的原因在於此。
但我們回顧一下u-boot的啟動過程中的第一階段有將u-boot程式碼複製到SDRAM中,並跳到SDRAM中去執行,因為SDRAM對映到了BANK6,其地址為0x30000000,此時uboot程式碼的地址範圍從 TEXT_BASE