【嵌入式移植】10、U-Boot源码分析6—启动过程分析_main

1 _main函数

根据上一章分析,启动过程运行到_main函数,通过查找,可知arch/arm/lib/crt0.Sarch/arm/lib/crt0_64.S文件中均有_main函数的定义,再通过查看arch/arm/lib/Makefile文件中内容
请添加图片描述
由宏定义CONFIG_ARM64=y,可知编译链接的是arch/arm/lib/crt0_64.S文件中的_main函数,下面进行分析

第72行~81行,首先还是根据宏定义设置堆栈,然后使用bl指令跳转至board_init_f_alloc_reserve,即调用board_init_f_alloc_reserve函数
请添加图片描述

2 board_init_f_alloc_reserve函数

查找可知board_init_f_alloc_reserve函数位于common/init/board_init.c文件中请添加图片描述
这里board_init_f_alloc_reserve函数有1个输入参数top,由汇编代码可知这里传入的是x0寄存器的值,即栈顶指针(目前为堆栈的起始位置,即CONFIG_SPL_STACK=LOW_LEVEL_SRAM_STACK=0x00008000,为SRAM的结束地址,因为此时还未初始化DDR,仍使用的SRAM)

第49行~51行,将top减去早先预留的空间(这里减去的值为0x400即1024字节)。这里需要说明的是SYS_MALLOC_F是u-boot为了给串口等设备进行初始化预分配的malloc池,因为此时还没有进行内存的初始化(也就是后续所说的重定向),所有的代码运行、变量等均存于SRAM中,而SRAM空间很小,因此需要额外注意SRAM空间的使用

第53行,计算global_data需要预留的空间,并进行16字节对齐,并更新top的值。

第55行,返回top的值,这个值将保存在x0寄存器中

回到_main函数中,第82行,将board_init_f_alloc_reserve函数返回值即上述top的值存入sp寄存器;第84行,将此值保存在x18寄存器中(即后面说的全局变量gd的起始地址),然后第85行调用board_init_f_init_reserve函数,传入参数仍为x0寄存器的值,即上述top
请添加图片描述

3 board_init_f_init_reserve函数

board_init_f_init_reserve函数同样位于common/init/board_init.c文件中请添加图片描述
这里board_init_f_init_reserve函数有1个输入参数base,由汇编代码可知这里传入的是x0寄存器的值,目前为board_init_f_alloc_reserve函数计算后得到的值,即为global_data结构体预留空间且进行了16字节对齐的地址

第102行~111行,定义一个叫做gd_ptrglobal_data结构体指针,并将此地址指针作为其起始地址,然后进行清零

第117行,计算16字节对齐后剩余空间的起始地址,并将其保存在全局变量gd中,在arch/arm/include/asm/global_data.h中定义,即为gd_t结构体的指针,且其内容保存在X18寄存器中,而使用volatile关键字表明gd的内容可能会被意想不到的改变,因此在编译时不对任何使用gd的代码进行优化

请添加图片描述
gd_t结构体位于include/asm-generic/global_data.h中,保存一些关键的全局数据

board_init_f_init_reserve函数第126行,将后续可用于malloc的首地址保存在全局结构体中gd->malloc_base

_main函数中,第87行将X0寄存器清零,然后使用bl指令跳转至board_init_f,即调用board_init_f函数

4 board_init_f函数

这里从u-boot.map的记录可以看出,board_init_f函数位于common/board_f.c文件中,传入参数为0,即gd->flags的值为0
请添加图片描述
第908行,通过调用函数initcall_run_list来运行init_sequence_f初始化序列中的所有函数,这里先看看initcall_run_list函数

4.1 initcall_run_list函数

initcall_run_list函数位于lib/initcal.c中,其功能十分简单,即调用初始化序列中所有函数,并判断其运行返回值
请添加图片描述
第17行开始的for循环,遍历init_seq

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值