u-boot启动流程分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
先看board/smsk2410/u-boot.lds这个链接脚本,可以知道目标程序的各部分链接顺序。
OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm",
"elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm","elf32-arm","elf32-arm")*/ OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
.= 0x00000000; /*指定可执行image文件的全局入口点,通常这个地址都放在ROM(flash)0x0位置。必须使编译器知道这个地址,通常都是修改此处来完成*/
.=ALIGN(4);
.text :
{
cpu/arm920t/start.o (.text)
*(.text)
}
.=ALIGN(4);
.rodata : { *(.rodata) }
.=ALIGN(4);
第一个要链接的是cpu/arm920t/start.o,那么U-Boot的入口指令一定位于这个程序中。下面详细分析一下程序跳转和函数的调用关系以及函数实现。
1.Stage1:cpu/arm920t/start.S
这个汇编程序是U-Boot的入口程序,开头就是复位向量的代码。
U-Boot启动代码流程图
/* the actual reset code */
reset: //复位启动子程序
/*设置CPU为SVC32模式*/
mrs r0,cpsr
bic r0,r0,#0x1f ;;位清除,将某些位的值置0:r0 = r0 AND(!0x1f) orr r0,r0,#0xd3 ;;逻辑或,将r0与立即数进行逻辑或,放在r0中(第一个)
msr cpsr,r0
/*关闭看门狗*/
/* turn off the watchdog */
#if defined(CONFIG_S3C2400)
# define pWTCON 0x15300000
# define INTMSK 0x14400008 /* Interupt-Controller base addresses */
# define CLKDIVN 0x14800014 /* clock divisor register */
#elif defined(CONFIG_S3C2410)
# define pWTCON 0x53000000
# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
# define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014 /* clock divisor register */
#endif
#if defined(CONFIG_S3C2400)|| defined(CONFIG_S3C2410)
ldr r0,=pWTCON
mov r1, #0x0
str r1,[r0]
/*禁止所有中断和设置CPU频率*/
/*
*mask all IRQs by setting all bits in the INTMR - default
*/
mov r1, #0xffffffff
ldr r0,=INTMSK
str r1,[r0]
# if defined(CONFIG_S3C2410)
ldr r1,=0x3ff
ldr r0,=INTSUBMSK
str r1,[r0]
# endif
/* FCLK:HCLK:PCLK = 1:2:4 */;;FCLK用于CPU,HCLK用于AHB,PCLK用于APB
/* default FCLK is 120 MHz !*/
ldr r0,=CLKDIVN ;;根据硬件手册来设置CLKDIVN寄存器
mov r1, #3 ;;用户手册的推荐值
str r1,[r0]
#endif /* CONFIG_S3C2400 || CONFIG_S3C2410 */
/*这些初始化代码在系统重起的时候执行,运行时热复位从RAM中启动不执行*/
/*
* we do sys-critical inits only at reboot,
*not when booting from
*/
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit ;;跳转去初始化CPU
#endif
;;#ifdef CONFIG_INIT_CRITICAL 原文中的,估计是1.1.16版本的;;bl cpu_init_crit
;;#endif
/* CPU和RAM两个关键的初始化子程序*/
/*初始化CPU */
cpu_init_crit:
/*
* flush v4 I/D caches 设置CP15
*/
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */;;使I/D cache失效:将寄存器r0的数据传送到协处理器p15的c7中。C7寄存器位对应cp15中的cache控制寄存器