uboot执行流程学习
uboot执行流程文件路径:
1、uboot/arch/arm/cpu/arm926ejs/start.S,执行结束会跳转到_main部分,处于下一路径中
2、uboot/arch/arm/lib/crt0.S,执行到
mov r0, #0
bl board_init_f
会跳转到void board_init_f(ulong dummy),处于下一路径中
3、uboot/arch/arm/mach-sunxi/board.c,执行结束时跳转到下一路径
4、uboot/arch/arm/lib/crt0.S,执行到
ldr pc, =board_init_r /* this is auto-relocated! */
会跳转到void board_init_r(gd_t *dummy1, ulong dummy2),处于下一路径中
5、uboot/common/spl/spl.c,执行结束后,跳转到image中执行
6、又会执行uboot/arch/arm/lib/crt0.S,执行到
mov r0, #0
bl board_init_f
会跳转到void board_init_f(ulong boot_flags),但却处于下一路径中
这里出现两个相同函数名,执行时却按照不同流程进行了!!!
6、uboot/common/board_f.c,,执行结束后跳转到下一路径
7、uboot/arch/arm/lib/crt0.S,执行到
ldr pc, =board_init_r /* this is auto-relocated! */(自动重定位)
会跳转到void board_init_r(gd_t *new_gd, ulong dest_addr),但却处于下一路径中
这里出现两个相同函数名,执行时却按照不同流程进行了!!!查到资料解释为:在启动阶段由内部BROM复制一部分程序到DDR执行,猜测这一部分里有一个board_init_r,然后运行这一部分程序,这一部分程序又回拷贝整个uboot到DDR,这个时候的uboot里也有一个board_init_r,但地址应该不太一样,猜测arm内部进行自动重定位了。
8、uboot/common/board_r.c,执行结束后跳转到下一路径
9、uboot/common/main.c,之后处于命令行状态,可以用命令执行uboot操作。启动内核也属于命令执行uboot操作,但这个操作会结束uboot命令行状态。
crt0.s会被执行两次,且每次运行调用的函数不一样。spl时执行crt0.s,调用一个board_init_f和board_init_r函数,这两个函数在board.c中;当调用uboot镜像后,又执行了crt0.s,也调用一个board_init_f和board_init_r函数,但这时这两个函数却分别在board_f.c和board_r.c中。