歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

U-Boot之u-boot-2009.11啟動過程分析

注:本文使用的u-boot源碼版本為u-boot-2009.11

相關閱讀:U-Boot源代碼下載地址 http://www.linuxidc.com/Linux/2011-07/38897.htm

u-boot同其他bootloader一樣,其啟動過程分為stage1和stage2兩個階段, stage1主要完成基本硬件設備初始化和為加載stage2部分的代碼准備RAM空間,stage2則是為引導內核准備環境。下面分兩部分來分析u-boot啟動的兩個階段。

一、u-boot啟動第一階段stage1

u-boot的第一階段主要由u-boot源文件目錄cpu\arm_cortexa8目錄下的start.S和cpu\arm_cortexa8\omap3目錄下lowlevel_init.S來完成,前者是SOC平台相關,後者是開發板相關的。

1、基礎硬件初始化

基本硬件設備的初始化主要在start.S內完成,依次完成如下設置:將CPU的工作模式設為管理模式(svc),將中斷向量表拷貝到SRAM,關閉WATCHDOG,後來就是關閉MMU,CACHE等。

reset:
      /*
      * set the cpu to SVC32 mode 設置ARM處理器的工作模式為SVC模式
      */
      mrs r0, cpsr
      bic  r0, r0, #0x1f
      orr  r0, r0, #0xd3
      msr cpsr,r0
/*將中斷向量表拷貝到SRAM*/
#if (CONFIG_OMAP34XX)
      /* Copy vectorsto mask ROM indirect addr */
      adr  r0, _start            @ r0<- current position of code
      add r0, r0, #4            @ skip reset vector
      mov      r2, #64                @ r2 <- size to copy
      add r2, r0, r2              @ r2 <- sourceend address
      mov      r1, #SRAM_OFFSET0  @ build vect addr
      mov      r3, #SRAM_OFFSET1
      add r1, r1, r3
      mov      r3, #SRAM_OFFSET2
      add r1, r1, r3
next:
      ldmia    r0!, {r3 - r10}              @ copy from source address [r0]
      stmia    r1!, {r3 - r10}              @ copyto  target address [r1]
      cmp      r0, r2                  @until source end address [r2]
      bne next                    @loop until equal */
 
      ldr  pc, _start_armboot    @ jump to C code
_start_armboot: .wordstart_armboot
cpu_init_crit:
      /*關閉MMU與CACHE */
      mov      r0, #0                  @ set up for MCR
      mcr p15, 0, r0, c8, c7, 0    @ invalidateTLBs
      mcr p15, 0, r0, c7, c5, 0    @ invalidateicache
 
      mrc p15, 0, r0, c1, c0, 0
      bic  r0, r0, #0x00002000  @ clear bits 13(--V-)
      bic  r0, r0, #0x00000007  @ clear bits 2:0 (-CAM)
      orr  r0, r0, #0x00000002  @ set bit 1 (--A-) Align
      orr  r0, r0, #0x00000800  @ set bit 12(Z---) BTB
      mcr p15, 0, r0, c1, c0, 0
      /*調用lowlevel_init用來初始化RAM*/
      mov      ip, lr                    @persevere link reg across call
      bl    lowlevel_init                @go setup pll,mux,memory
      mov      lr, ip                    @restore link
      mov      pc, lr                    @back to my caller

2、為stage2准備RAM空間
 
所謂准備RAM空間,就是初始化內存控制器,使它可用。對於OMAP3這種SOC,通過在start.S中調用lowlevel_init函數來設置存儲控制器,使得外接的SDRAM可用。代碼在cpu\arm_cortexa8\omap3目錄下lowlevel_init.S中。

.globl lowlevel_init
lowlevel_init:
      ldr  sp,  SRAM_STACK
        str    ip,      [sp]  /* stashold link register */
      mov      ip,  lr    /*save link reg across call */
      bl      s_init          /* gosetup pll,mux,memory */
        ldr    ip,      [sp]    /* restore saveip */
      mov      lr,    ip    /*restore link reg */
      /* back toarch calling code */
      mov      pc,  lr
      /* the literalpools origin */
      .ltorg

Copyright © Linux教程網 All Rights Reserved