iTop4412 uboot-2019.2移植之流程分析(二)

只分析脉络,并不分析细节

一、入口

通过百度和查找相应链接脚本,发现程序的入口位于arch/arm/lib/vectors.S

该文件的第一段代码是定义了一个宏,并不生成代码!

标签_start后面的语句才是要执行的语句;将宏展开可知,执行的是b reset

其余部分定义了中断向量表,如果想要定义中断,可以模仿人家。

执行跳转语句后,一般不会回到该文件了,除非发生中断!

二、reset

通过百度查找,发现剩余代码基本在相应CPU目录下,故知道符号reset位于目录arch/arm/cpu/armv7/start.S

该文件做了些基本初始化操作,然后一去不复返的跳转到_main。

现阶段不必深究。根据我的原则,不要修改公共代码;修改公共代码,会出现不可预料的错误;因此这个文件不会修改。

三、_main

通过JLINK,发现该符号位于arch/arm/lib/crt0.S,看名字就知道做了C语言环境初始化。

该调整了堆栈,分配了内存,并将内存写零。最后一去不复返的跳转到board_init_f

四、board_init_f ——SPL阶段的导游

通过JLINK,发现该符号位于arch/arm/mach-exynos/spl_boot.c

该函数是描述了SPL阶段要做的事情。首先分配内存,并初始化了某些内存;然后做低级初始化操作;拷贝uboot到RAM;最后执行uboot。

五、低级初始化 —— 为启动uboot做准备

函数位于arch/arm/mach-exynos/lowlevel_init.c,做了电源初始化,时钟初始化和内存初始化。

调用的函数都在同级目录下,通过文件名字就能确定,不在啰嗦。

六、board_init_f ——再次出现该符号

再SPL阶段,会执行arch/arm/mach-exynos/spl_boot.c中的board_init_f,但进入uboot后,将会执行common/board_f.c中的board_init_f。

通过分析发现,这个函数主要调用函数initcall_run_list。

在initcall_run_list中,循环调用数组中的函数完成初始化工作,只要由一个函数失败,程序没法继续往下执行

执行完board_init_f 后,程序会返回。

七、取消重定向

重定向的目的就是把代码放到正确的位置,但对我们调试程序有很大影响,故需要取消重定向。

取消重定向的方式就是改变程序的链接地址,该地址需要通过调试确定。

ENTRY(relocate_code)                                                                                                                                                            x
   x81              ldr     r1, =__image_copy_start /* r1 <- SRC &__image_copy_start */                                                                                                     x
   x82              subs    r4, r0, r1              /* r4 <- relocation offset */                                                                                                           x
  >x83              beq     relocate_done           /* skip relocation */                                                                                                                   x
   x84              ldr     r2, =__image_copy_end   /* r2 <- SRC &__image_copy_end */

通过访问R0和R1寄存器,也确定新连接地址的值,也就是R0寄存器中的值。

你可能感兴趣的:(iTop4412 uboot-2019.2移植之流程分析(二))