uboot源码分析--_start以及C语言函数入口(三)

一个可执行代码的入口可以通过链接文件(后缀.lds),获知可执行代码的入口就可以找到整个程序的起始代码。
uboot中的make会按相应的硬件平台配置调用u-boot.lds(由于有很多u-boot.lds,至于调用的是哪一个可以直接看编译过程的输出信息,还有就是直接在生成所有目标文件目录下去寻找[make O=目标目录路径]),现截取部分内容如下:
uboot源码分析--_start以及C语言函数入口(三)
整个程序的入口取决于连接脚本中ENTRY声明的地方, _start符号是整个程序的入口,_start所在的代码就是整个程序的起始代码,而且又看到代码段(.text)最开始部分是arch/cpu/arm7/start.o,那么就去目录arch/cpu/arm7看看:
uboot源码分析--_start以及C语言函数入口(三)
uboot源码分析--_start以及C语言函数入口(三)
去start.S中找到_start符号:
uboot源码分析--_start以及C语言函数入口(三)
稍微了解一下arm汇编指令,然后再结合arm cpu硬件相关信息基本是可以看懂的,最主要的是汇编部分代码再后续开发中基本不会修改,此处也多做说明,直接跳到c语言函数入口:uboot源码分析--_start以及C语言函数入口(三)
可以看到有两个相关文件包含 board_init_f函数,这就需要自己根据配置文件去仔细分析了,这里是arm/arch/lib/board.c文件(不涉及SPI启动方式):
uboot源码分析--_start以及C语言函数入口(三)
uboot源码分析--_start以及C语言函数入口(三)
初始化最基本的硬件外设资源,将相关参数放在CONFIG_SYS_INIT_SP_ADDR地址处的struct global_data结构信息,包含以下信息(有删减):
uboot源码分析--_start以及C语言函数入口(三)
函数board_init_f的最后还是会跳回start.S中的relocate_code符号:uboot源码分析--_start以及C语言函数入口(三)
uboot源码分析--_start以及C语言函数入口(三)
继续按程序指令的执行流往下看,最终还是会跳转的C语言函数board_init_r:
uboot源码分析--_start以及C语言函数入口(三)
我们看看board_init_r函数部分:
uboot源码分析--_start以及C语言函数入口(三)
完成基本的包括串口,flash,网络以及中断等资源的初始化之后就进入main_loop,也就是Uboot启动之后在指定时间内按任意键或者指定健后等待输入相应命令,否则就继续启动内核文件。
下节再仔细分析main_loop中如何响应相关命令以及如何启动启动系统内核。