UBoot流程分析

2021-06-20 20:57:14 字數 4214 閱讀 4652

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,這些...