上一章說了lowlevel_init.s,現在重新回到start.s中。
1.再次設定棧
ldr sp, _text_phy_base
sub sp, sp, #12
mov fp, #0
(1)之前在呼叫lowlevel_init程式前設定過1次棧(start.s 284-287行),那時候因為ddr尚未初始化,因此程式執行都是在sram中,所以在sram中分配了一部分記憶體作為棧。本次因為ddr已經被初始化了,為了防止sram中棧不夠用,因此要把棧挪移到ddr中,所以要重新設定棧,這是第二次(start.s 297-299行);
(2)這裡實際設定的棧的位址是33e00000,分析**可以得出:
_text_phy_base的字面意思是**段實體地址基位址的意思,用si我們可以檢視到:
_text_phy_base:
.word cfg_phy_uboot_base
通過si可以繼續查到:#define cfg_phy_uboot_base memory_base_address + 0x3e00000
其中memory_base_address值為30000000;
2.再次判斷當前位址以決定是否重定位
ldr r0, =0xff000fff
bic r1, pc, r0
ldr r2, _text_base
bic r2, r2, r0
cmp r1, r2
beq after_copy
(1)再次使用與lowlevel.init.s中相同的**來判斷當前位址是在sram中還是ddr中,不過和上一次目的不一樣。
上一次判斷是為了決定是否要執行初始化時鐘和ddr的**;這一次判斷是為了決定是否進行uboot的重定位;
(2)冷啟動時當前情況是uboot的前一部分(16kb或者8kb)開機自動從sd卡載入到sram中正在執行,uboot的第二部分(其實第二部分是整個uboot)還躺在sd卡的某個扇區開頭的n個扇區中。此時uboot的第一階段已經即將結束了(第一階段該做的事基本做完了),結束之前要把第二部分載入到ddr中鏈結位址處(33e00000),這個載入過程就叫重定位。
3.重定位
#if defined(config_evt1)
/* if bl1 was copied from sd/mmc ch2 */
ldr r0, =0xd0037488
ldr r1, [r0]
ldr r2, =0xeb200000
cmp r1, r2
beq mmcsd_boot
#endif
ldr r0, =inf_reg_base
ldr r1, [r0, #inf_reg3_offset]
cmp r1, #boot_nand /* 0x0 => boot device is nand */
beq nand_boot
cmp r1, #boot_onenand /* 0x1 => boot device is onenand */
beq onenand_boot
cmp r1, #boot_mmcsd
beq mmcsd_boot
cmp r1, #boot_nor
beq nor_boot
cmp r1, #boot_sec_dev
beq mmcsd_boot
(1)首先這裡的d0037488這個記憶體位址在sram中,這個位址中的值是被硬體自動設定的,代表的是哪個sd**道。硬體根據我們實際電路中sd卡在哪個通道中,會將這個位址中的值設定為相應的數字。譬如我們從sd0通道啟動時,這個值為eb000000;從sd2通道啟動時,這個值為eb200000。
(2)**中將d0037488中的值與eb200000想比較,如果相等則跳轉到mmcsd_boot,否則繼續執行下面的**。
(3)我們在start.s的260行確定了從mmcsd啟動,
/* sd/mmc boot */
cmp r2, #0xc
moveq r3, #boot_mmcsd
然後又在278行將#boot_mmcsd寫入了inf_reg3暫存器中儲存著,
ldr r0, =inf_reg_base
str r3, [r0, #inf_reg3_offset]
然後又在322行讀出來,再和#boot_mmcsd去比較,確定是從mmcsd啟動,最終跳轉到mmcsd_boot函式中去執行重定位動作。
ldr r1, [r0, #inf_reg3_offset]
cmp r1, #boot_mmcsd
beq mmcsd_boot
所以不管怎樣,最終都會跳轉到mmcsd_boot處執行。
mmcsd_boot:
bl movi_bl2_copy
b after_copy
真正的重定位是通過呼叫movi_bl2_copy函式完成的,在uboot/cpu/s5pc11x/movi.c中,是乙個c語言的函式。 UBOOT第一階段分析
感覺不錯的乙個圖就轉過來了!u boot第一階段的啟動流程。這個階段主要是初始化硬體裝置,為載入u boot的第二階段 準備ram空間最後跳轉到lib arm board.c中start armboot函式,這是第二階段的入口點。u boot第一階段的儲存器布局。上圖中u boot安裝在nand f...
u boot第一階段
u boot 第一階段 位置 cpu arm920t start.s 流程分析 1.儲存一些全域性變數,用於啟動程式將 從flash拷貝到ram或其他使用。有一些變數的值是通過鏈結指令碼得到的,如 text base 位於board 2440 config.mk 中 bss start end 位於...
uboot移植(四) uboot啟動第一階段
1 bl0 bl1 bl2分別是什麼 1 bl0 s5pv210的irom中固化的 作用 初始化系統時鐘,設定看門狗,初始化棧,載入bl1 2 bl1 從外部啟動介質 nand sd卡 中載入的uboot.bin的前16k 作用 初始化ram,關閉cache,初始化ddr,設定棧,載入bl2 3 b...