uboot程式分析:程式入口分析--->第一階段bl1程式分析---->第二階段bl2程式分析
解壓uboot原始碼,開啟頂層makefile,每個uboot所支援的開發板在makefile中都會有乙個配置選項, 在e:uboot\board\samsung\smdk2440,有乙個uboot.lds鏈結器指令碼檔案,uboot整個鏈結就由它控制,開啟鏈結器指令碼看到:
.text :
cpu/s3c24xx/start.o (.text)
cpu/s3c24xx/s3c2440/cpu_init.o (.text)
*(.text)
得出位於整個uboot**段最前端的是cpu/s3c24xx/start.o,在鏈結器指令碼有entry(_start)用來標明整個程式入口為_start,開啟在cpu/s3c24xx/start.s,
_start:
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq 整個程式的入口,這部分主要就是設定中斷向量表。
首先跳到reset
reset:
* set the cpu to svc32 mode
cpu_init_crit:
* flush v4 i/d caches
* disable mmu stuff and caches
設定處理器為svc32模式,重新整理i/d caches,關閉mmu和cache,下面執行函式lowlevel_init
開啟目錄e:\uboot\board\samsung\smdk2440找到lowlevel_init.s
lowlevel_init:
mov r12, lr
/*init system clock */
blsystem_clock_init
/* for uart */
bluart_asm_init
/* ****** init for nand */
blnand_asm_init
adrl r0, mem_cfg_val
bl mem_con_init
1: mov lr, r12
mov pc, lr
初始化系統時鐘,串列埠,對nandflash進行簡單初始化,判斷uboot是否執行於記憶體當中,如果沒有,那麼就是從nandflash啟動,就要對記憶體初始化,然後返回到start.s。
/* check boot device is nand or nor */
ldr r0, =0x00000000
ldr r3, [r0]
ldr r1, =0xfffffffe
str r1, [r0]
ldr r2, [r0]
str r3, [r0]
cmp r1, r2
beq nand_copy
/* nor copy */
nand_copy:
mov r0, #0x1000
bl copy_from_nand
判斷是否為norflash還是nandflash,如果是nandflash就會beq nand_copy,如果是norflash就會/* nor copy */把剩餘在norflash或nandflash中的bootload拷貝到記憶體,這裡是從nandflash啟動,呼叫nand_copy,完成bootload拷貝。
/* set up the stack */
stack_setup:
clear_bss:
ldr r0, _bss_start /* find start of bsssegment */
ldr r1, _bss_end /* stop here */
mov r2, #0x00000000 /*clear*/
設定堆疊,為c程式設計鋪墊,清除bss段,這樣第一階段**完成。
ldr pc,_start_armboot 偽指令把_start_armboot值裝載到pc指標, _start_armboot 為start_armboot函式位址,pc指標執行start_armboot函式,跳轉到記憶體執行,分析第二階段程式e:\uboot\lib_arm board.c
void start_armboot() 函式
for (init_fnc_ptr = init_sequence;*init_fnc_ptr; ++init_fnc_ptr) 讓乙個指標指向指標陣列,把指標陣列裡的函式指標依次呼叫如下函式,
init_fnc_t *init_sequence = ;初始化串列埠,
size = lcd_setmem (addr);
eth_initialize(gd->bd);
led_init(); //初始化lcd,網絡卡 ,led
main_loop (); //解析使用者輸入控制台命令,執行使用者相應命令
下面分析6410 uboot
e:\uboot\cpu\s3c64xx start.s
_start: b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq //第一部分也是設定中斷向量表,
reset:
* set the cpu to svc32 mode
* flush v4 i/d caches
* disable mmu stuff and caches
*/ 同2410,設定cpu為svc模式,重新整理i/d caches,關閉mmu和caches。
/* peri port setup */ //外圍裝置基位址初始化
bl lowlevel_init /* go setup pll,mux,memory */ 進入lowlevel_init函式
lowlevel_init::
/* led on only #8 */ //點亮led
/* disable watchdog */ //關閉看門狗
@ disable all interrupts (vic0 andvic1) //關閉所有中斷
blsystem_clock_init
bl uart_asm_init
bl nand_asm_init
//初始化系統時鐘、串列埠、nandflash
bl mem_ctrl_asm_init //初始化記憶體,然後返回start.s
#ifdef config_boot_nand
mov r0, #0x1000
bl copy_from_nand //把nandflash裡bootload複製到記憶體
/* set up the stack*/
stack_setup: //堆疊初始化
clear_bss:
ldr r0, _bss_start /* find start of bss segment*/
ldr r1, _bss_end /*stop here */
mov r2, #0x00000000/* clear*/ //清除bss段
ldr pc, _start_armboot //跳轉到start_armboot只有乙個地方有,2440,6410共享乙個lib_arm/board.c start_armboot ,分析同2440。
Uboot啟動流程分析
uboot是嵌入式系統中最常用的bootloader,這裡我們以s3c2410為例分析一下uboot的啟動流程。首先通過uboot的鏈結檔案,我們可以看到uboot執行是執行的第一段 在start.s中。entry start sections align 4 rodata align 4 data...
MIPS之u boot流程分析
1 系統上電後 由uboot的鏈結檔案 u boot arch mips cpu u boot.lds知 entry start 程式入口點是 u boot arch mips cpu xburst start.s 2 由la t9,board init f 知跳轉到board init f 函式 ...
uboot階段顯示流程分析
在uboot起來之後會執行board init r函式。在uboot common board r.c 檔案中 在這個函式中查詢所有初始化的函式。在這裡會做很多的初始化,比如nand,mmc等。splash image init,stdio add devices,owl dss enable,這些...