1. 程式人生 > >uboot啟動第一階段分析

uboot啟動第一階段分析

pdf rod 頭文件 作用 nan .bss ext sha 3.1.1

一. uboot第一階段初識

  1.1. 什麽是uboot第一階段

    1.1.1. 啟動os三個階段

      1.1.1.1. bl0階段

        a. 這段代碼是三星固化到iROM中,可以查看《S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf》

        b. 這段代碼作用是將uboot第一階段的8kb加載到iRAM中

技術分享圖片

      1.1.1.2. bl1階段(uboot第一階段)

        a. 此部分是整個uboot的前8k部分

        b. 此部分有bl0 加載到iRAM指定地址

      1.1.1.3. bl2階段(整個uboot)

        a. 此部分是整個uboot    

        b. 此部分由bl1重定位到DDR的鏈接地址去

  1.2. 第一階段主要作用

    a. 初始化DDR

    b. 將整個uboot重定位到DDR中

    c. 跳轉到DDR中執行uboot(長跳轉)

二. uboot 第一階段源碼分析

  2.1. uboot鏈接腳本分析

    a. ENTRY(_start):整個程序的入口取決於鏈接腳本中ENTRY聲明的地方。ENTRY(_start)因此_start符號所在的文件就是整個程序的起始文件,_start所在處的代碼就是整個程序的起始代碼。

    b. 在text段中,指定很多文件的段靠前存放,這樣可以保證必要的文件可以在uboot前8K地址內     

技術分享圖片
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
    . = 0x00000000;

    . = ALIGN(4);
    .text      :
    {
      cpu/s5pc11x/start.o    (.text)
      cpu/s5pc11x/s5pc110/cpu_init.o    (.text)
      board
/samsung/x210/lowlevel_init.o (.text) cpu/s5pc11x/onenand_cp.o (.text) cpu/s5pc11x/nand_cp.o (.text) cpu/s5pc11x/movi.o (.text) common/secure_boot.o (.text) common/ace_sha1.o (.text) cpu/s5pc11x/pmic.o (.text) *(.text) } . = ALIGN(4); .rodata : { *(.rodata) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); .got : { *(.got) } __u_boot_cmd_start = .; .u_boot_cmd : { *(.u_boot_cmd) } __u_boot_cmd_end = .; . = ALIGN(4); .mmudata : { *(.mmudata) } . = ALIGN(4); __bss_start = .; .bss : { *(.bss) } _end = .; }
View Code

  2.2. start.S分析 

    2.1.1. 相關頭文件分析 

      a. 有些頭文件是在配置/編譯過程生成的

      b. 有些頭文件使用了符號鏈接

      c. 很多宏定義在x210_sd.h宏定義,但此文件被config.h所引用

技術分享圖片
#include <config.h>
#include <version.h>
#if defined(CONFIG_ENABLE_MMU)
#include <asm/proc/domain.h>
#endif
#include <regs.h>
View Code

    2.2.1. uboot頭信息地址占位

      a. 定義4個字空間占用16字節,16字節信息定義可以查看 《S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf》   

      b. 此處僅僅是定義並未賦有效值,有效值再制作usb啟動uboot是寫入(如使用sd_fusing中sd_fdisk.c文件會填充)

技術分享圖片
#if defined(CONFIG_EVT1) && !defined(CONFIG_FUSED)
    .word 0x2000
    .word 0x0
    .word 0x0
    .word 0x0
#endif
View Code

    2.3.1. _start匯編標號分析

      2.3.1.1. 上述我們已經分析了,啟動bl1時的起點就是_start

      2.3.1.2. b reset為什麽開始執行的第一句匯編

        a. 無論是復位還是開啟都屬於重啟,故啟動先執行reset很合理

        b. reset後cpu處於SVC模式,reset匯編重新設置模式也無妨

技術分享圖片
reset:
    /*
     * set the cpu to SVC32 mode and IRQ & FIQ disable
     */
    @;mrs    r0,cpsr
    @;bic    r0,r0,#0x1f
    @;orr    r0,r0,#0xd3
    @;msr    cpsr,r0
    msr    cpsr_c, #0xd3        @ I & F disable, Mode: 0x13 - SVC
View Code

uboot啟動第一階段分析