自制F1C200S demo板(八、Linux初学3)

发布于:2024-06-03 ⋅ 阅读:(89) ⋅ 点赞:(0)

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中。


网站公告

今日签到

点亮在社区的每一天
去签到