uboot启动第一阶段分析
Posted linux-37ge
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uboot启动第一阶段分析相关的知识,希望对你有一定的参考价值。
一. 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 = .; }
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>
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
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
以上是关于uboot启动第一阶段分析的主要内容,如果未能解决你的问题,请参考以下文章