uboot启动流程
Posted 四季帆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uboot启动流程相关的知识,希望对你有一定的参考价值。
1. S5pv210 uboot启动分析
版本号:1.3.4
1.1 分析uboot顶层目录下的连接脚本 u-boot.lds
OUTPUT_ARCH(arm)
ENTRY(_start) //指定uboot的入口
······
1.2 S5pv210 uboot主脉络
.globl _start(uboot/cpu/s5pv210/start.S)
-->cpu_init_crit
-->lowlevel_init(uboot/board/samsung/x210/lowlevel_init.S)
-->start_armboot(lib_arm/board.c)
-->for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr)
-->main_loop() //进入死循环
2. exynos4412 uboot主脉络
这个版本的uboot流程总结,是我根据网络上别人的分析归纳总结的,我自己没有这份源码,所以我不知道这个uboot的版本号。
.globl _start(uboot/arch/arm/cpu/armv7/start.S)
-->cpu_init_crit
-->lowlevel_init(uboot/arch/arm/cpu/armv7/lowlevel_init.S)
-->_main(uboot/arch/arm/lib/crt0.S)
-->board_init_f(uboot/arch/arm/lib/board.c)
-->for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) //遍历执行init_sequence数组
-->board_init_r(uboot/arch/arm/lib/board.c)
-->main_loop() //进入死循环
3. Imx6dl uboot主脉络
版本号:2014.04
.globl _start(uboot/arch/arm/cpu/armv7/start.S)
-->cpu_init_crit
-->lowlevel_init(uboot/arch/arm/cpu/armv7/lowlevel_init.S)
-->_main(uboot/arch/arm/lib/crt0.S)
-->board_init_f(uboot/common/board_f.c)
-->initcall_run_list(init_sequence_f)
-->board_init_r(uboot/common/board_r.c)
-->initcall_run_list(init_sequence_r)
-->run_main_loop(数组最后一项)
-->main_loop(进入死循环)
3.1 陷阱
在这份源码中【arch/arm/lib/board.c】和【common/board_f.c】都存在,所以一开始的时候小编还分析错了,后来根据打印信息才慢慢找到正确调用流程和路径。在这份源码中,前者并没有被编译为.o文件。
总结
本章归纳总结了三个不同SOC对应的uboot启动流程,从总体的流程上来看,不同版本、不同SOC的uboot启动过程大同小异,其中这一小部分的不同,可能是因为uboot架构升级导致的,也可能是SOC厂商做了改动。
仔细对比三个版本的uboot可以发现,其实在代码主体上没有特别大的变动,主要不同在于函数调用的位置有所变化,函数内容有点儿变化。所以研究一两个uboot之后,就熟悉它的套路了,熟悉以后,有改动的地方经过研究源码也可以比较快地理解。
版本越新,分层却多了,很明显的可以感觉到1.3.4版本和后面两个版本相比,前者在一个函数中实现的功能,在后者里面分成了两部分,这样做有什么深意呢?我个人认为是为了将函数变短,使一个函数没那么长、易读、易理解,层次也更清晰,比如需要提前初始化的部分就放到第一部分进行初始化,其余的放到第二部分进行初始化。在1.3.4版本中的start_armboot()函数有接近500行(如下图,该函数折叠以后的样子,444行到909行,有没有吓到你?),我觉得分两段还不够,哈哈哈!
以上是关于uboot启动流程的主要内容,如果未能解决你的问题,请参考以下文章