- iTop4412 uboot-2019.2移植之流程分析(二)
- iTop4412 uboot-2019.2移植之点灯验证(五)
- iTop4412 uboot-2019.2移植之制作镜像(三)
- iTop4412 uboot-2019.2移植之电源管理(四)
- iTop4412 uboot-2019.2移植之杨帆启航(一)
- iTop4412 uboot-2019.2移植之拷贝u-boot
- iTop4412 uboot-2019.2移植之时钟管理(六)
- iTop4412 uboot-2019.2移植之内存控制器(七)
- iTop4412 uboot-2019.2移植之初始化串口(九)
- itop4412 uboot-2017.11移植(二)
只分析脉络,并不分析细节
一、入口
通过百度和查找相应链接脚本,发现程序的入口位于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寄存器中的值。
网友评论