在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 }