uboot启动流程分析如下:
第一阶段:
a -- 设置cpu工作模式为SVC模式
b -- 关闭中断,mmu,cache
v -- 关看门狗
d -- 初始化内存,串口
e -- 设置栈
f -- 代码自搬移
g -- 清bss
h -- 跳c
第二阶段
a -- 初始化外设,进入超循环
b -- 超循环处理用户命令
可见, U-Boot 属于两阶段的Bootloader
第一阶段的文件:
arch/arm/cpu/armv7 /start.S 平台相关,CPU工作模式设为SVC模式,关MMU,关icahce(CPU相关)
board/samsung/fs4412/lowlevel_init.S 开发板相关:关看门狗,内存初始化,时钟初始化,串口初始化(board相关,初始化最基本设备)
第二阶段的文件:
arch/arm/lib/crt0.S _main 函数所在处,初始化SP,为C语言准备,代码重定位,清BSS,设置R0 R1 R2 R8相应寄存器
arch/arm/lib/board.c board_init_f 函数 ,填充GD结构体,初始化外设, main_loop()函数超循环
arch/arm/cpu/armv7 /start.S 代码自搬移时会用到
针对uboot2013启动流程图如下:
下面是具体分析:
一、U-Boot 第一阶段代码分析
通常我们通过连接文件知晓程序入口点,入口查看 u-boot.lds
通过链接脚本可知入口为_start,位于arch/arm/cpu/armv7/start.o。
第一阶段开始:
1、进入arch/arm/cpu/armv7/start.S
a -- 异常向量表设置
b -- 设置CPU处于SVC工作模式
d -- 协处理器 p15 的 c12 寄存器来重新定位