上一篇介绍到start.S 最后一个指令是跳转到_main, 接下来分析 __main 都做了什么
arch/arm/lib/crt0.S
__main 注释写的很详细,主要分为5步
1. 准备board_init_f的运行环境
2. 跳转到board_init_f
3. 设置broad_init_f 申请的stack 和 GD
4. 完整u-boot 执行relocate_code, 将u-boot 搬到board_init_f计算出的目的地址, tpl, spl 跳回crt0
5. 设置board_init_r运行环境,完整u-boot 有些cpu 剩余工作由c_runtime_cpu_setup完成
6. 跳转到board_init_r
详细分析如下:
1. 申请reserve 空间
CONFIG_TPL_NEEDS_SEPARATE_STACK=1 CONFIG_TPL_STACK 0xff8effff
根据这些定义,x0 = 0xff8effff, 从这个位置
a,预留SYS_MALLOC_F_LEN 给malloc 使用,
b, 再预留struct global_data 给全局gd 使用,
c, 分配完后,将sp 往上移
bic sp, x0, #0xf /* 16-byte alignment for ABI compliance */
mov x0, sp
bl board_init_f_alloc_reserve
mov sp, x0
/* set up gd here, outside any C code */
mov x18, x0
bl board_init_f_init_reserve
2. board_init_f
代码位于arch/arm/mach-rockchip/tpl.c
CONFIG_SPL_FRAMEWORK


2095

被折叠的 条评论
为什么被折叠?



