講乙個位址問題,主要圍繞三個位址來介紹:編譯位址,載入位址,執行位址。
其實不光是uboot,linux也有這三個位址;這三個位址是存在聯絡的,使用者需要明確的知道這三個位址各代表什麼意思,如何去設定和運用。
事先說明的是,這裡的三個位址都是首位址,也就是起始位址。
編譯位址一般在鏈結的檔案中指定,比如uboot在arch\arm\cpu\u-boot.lds檔案中規定,如:
utput_format("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
output_arch(arm)
entry(_start)
sections
這裡的編譯起始位址就是0x00000000,也就是編譯器從0x00000000開始分配**和記憶體。
上面例子中__image_copy_start = 0x00000000,start.o裡面的**段也是從0x00000000開始分配。
將編譯完成的uboot的可執行檔案拷貝到單板中時的拷貝位址,比如我們拷貝的位址是0x0c001000,這個位址通常由使用者指定,在include\configs\*****.h中決定。
****就是你對應單板的名字,如:
/* soc configuration */
#define config_armv7
#define config_arch_cpu_init
#define config_sys_arch_timer
#define config_sys_hz_clock clk_get_rate(tci6638_clk1_6)
#define config_sys_hz 1000
#define config_sys_text_base 0x0c001000
#define config_of_libfdt 1
#define config_of_board_setup
#define config_sys_dcache_off
.globl _text_base
_text_base:
.word config_sys_text_base
也就是定義了乙個全域性變數 _text_base,這個全域性變數會儲存你的載入位址。
執行位址在uboot中是重定位後的位址位置。這個位址在uboot中是根據記憶體來動態計算的,而在linux中是指定的。
uboot的計算方法如下(該**在arch\arm\lib\board.c中的board_init_f()中):
1)初始化外部的ram,通常是ddr,得到ddr的首位址的尾位址
2)從尾位址開始往回倒數,倒數64kb,預留給tlb使用(但一般都用不到)
3)再倒數,根據uboot編譯完成的image大小,預留出memory給uboot,得到uboot重定位的首位址,也就是我們的執行位址;
這裡從kernel裡面摘取一段**來說明位址的互算方式。
__fixup_smp_on_up:
adr r0, 1f
// r0是儲存了lable 1的執行位址
ldmia r0,
// r3,r4,r5分別儲存了 label 1,__smpalt_begin, __smpalt_end的編譯位址
sub r3, r0, r3
// 將lable 1的執行位址減去編譯位址,得到乙個偏移offset
add r4, r4, r3 // 將得到的偏移加上原始的編譯位址,就得到了__smpalt_begin的執行位址
add r5, r5, r3
b __do_fixup_smp_on_up
endproc(__fixup_smp)
.align
1: .word .
.word __smpalt_begin
.word __smpalt_end
u boot學習 一 u boot概述
我們知道對於pc機,使用電腦時我們首先按下開機按鍵,然後等待電腦的啟動,開機完成後,我們會進行各種需要的操作,如qq聊天 寫csdn部落格等。其實這個過程是 啟動bios程式,由bios程式引導windows作業系統,再由作業系統識別c盤d盤等硬碟,最後執行應用程式qq csdn等。對嵌入式系統來說...
uboot移植 uboot啟動回顧
一 uboot啟動的第一階段start.s 路徑uboot cpu s5pc11x start.s 1 include 標頭檔案包含,config.件原始碼中不存 在,配置後自動生成 路徑 include linux config.h 2 include 標頭檔案包含,version.件原始碼中不存...
u boot移植詳解 初識u boot
u boot是一種普遍用於嵌入式系統中的bootloader。bootloader是基於特定硬體平台來實現的,因此幾乎不可能為所有的嵌入式系統建立乙個通用的bootloader,不同的處理器架構都有不同的bootloader,bootloader不但依賴於cpu的體系結構,還依賴於嵌入式系統板級裝置...