ARM Uboot經歷 Uboot位址問題

2021-06-16 18:49:13 字數 2040 閱讀 8679

講乙個位址問題,主要圍繞三個位址來介紹:編譯位址,載入位址,執行位址。

其實不光是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的體系結構,還依賴於嵌入式系統板級裝置...