1. 程式人生 > >uboot移植過程中的執行地址和裝載地址的區別

uboot移植過程中的執行地址和裝載地址的區別

    連線指令碼檔案lds中沒有設定LMA,只是設定了VMA。VMA的設定是通過頂層目錄下的config.mk檔案中的LDFLAGS實現的
     
    在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

                _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標號。