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行,有没有吓到你?),我觉得分两段还不够,哈哈哈!

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值