图文解析u-boot2013.01启动流程
时间:2018-09-25 来源:未知
在uboot源码目录下生成tags文件: ctags –R
u-boot起始地址为0x0000000,4字节对其,文本段.text说明第一个执行的文件是在Arch/arm/cpu/armv7/start.o 所以下一步找这个目录的start.s文件

从 arch/arm/cpu/armv7/start.S构建异常向量表

b reset------>

设置cpu为svc模式,关闭所有中断------>

bl cpu_init_cp15
关闭数据和指令
关闭cache TLB
关闭mmu相关的东西------>

bl cpu_init_crit------>
b lowlevel_init 切换到了board/samsung/fs4412/lowlevel_init.S

设置堆栈,lr入栈

关闭看门狗------>

判断uboot是否已经运行到物理内存中(系统时钟等初始化交给之前的代码完成)------>
bl uart_asm_init
串口的初始化------>

bl _main (arch/arm/cpu/armv7/start.S)

设置C语言运行的基本环境------> arch/arm/lib/alt0.s

bl board_init_f 切换到 arch/arm/lib/board.c

初始化一些全局数据(比如 0x40000100就是给内核传递参数地址)
进行各种板级初始化。


b relocate_code 进行uboot代码重定位。 切换到arch/arm/cpu/armv7/start.S

需要对搬移后的代码进行符号重定向,避免绝对跳转失败------>
设置C语言运行终的环境 arch/arm/lib/crt0.S
bss段的清零操作。

第二阶段:完善uboot功能
ldr pc, =board_init_r
完全进入C语言的代码
702 for (;;) {
703 main_loop();
704 }

