x210v3开发板u-boot-2012.10移栽之补充篇-uboot启动流程详解

x210v3开发板u-boot-2012.10移植之补充篇---uboot启动流程详解
欢迎加入朱老师物联网大课堂qq群 一起学习进步 

群号:397164505 

自己建立source insight工程,从uboot入口点(_start)开始一路往下分析,_start位于arch/arm/cpu/armv7/start.S文件,打开看看

#include <asm-offsets.h>
#include <config.h>
#include <version.h>
#include <asm/system.h>
#include <linux/linkage.h>

这里是一些需要包含的头文件,先不管用到了再说。接着往下看

.globl _start
_start: b	reset
	ldr	pc, _undefined_instruction
	ldr	pc, _software_interrupt
	ldr	pc, _prefetch_abort
	ldr	pc, _data_abort
	ldr	pc, _not_used
	ldr	pc, _irq
	ldr	pc, _fiq
#ifdef CONFIG_SPL_BUILD
_undefined_instruction: .word _undefined_instruction
_software_interrupt:	.word _software_interrupt
_prefetch_abort:	.word _prefetch_abort
_data_abort:		.word _data_abort
_not_used:		.word _not_used
_irq:			.word _irq
_fiq:			.word _fiq
_pad:			.word 0x12345678 /* now 16*4=64 */
#else
_undefined_instruction: .word undefined_instruction
_software_interrupt:	.word software_interrupt
_prefetch_abort:	.word prefetch_abort
_data_abort:		.word data_abort
_not_used:		.word not_used
_irq:			.word irq
_fiq:			.word fiq
_pad:			.word 0x12345678 /* now 16*4=64 */
#endif	/* CONFIG_SPL_BUILD */

.global _end_vect
_end_vect:

	.balignl 16,0xdeadbeef

.globl _start 定义了一个全局标号,为什么要全局化呢?因为链接器脚本(u-boot.lds)要用到,不全局化链接器脚本是找不到的。u-boot.lds位于arch/arm/cpu目录下,看到u-boot.lds里有这么一句ENTRY(_start)。然后,b reset调到reset标号。(后面7行代码是异常向量表,这里不深入讲,有兴趣的可以去看,arm处理器部分,到时我会讲。讲讲CONFIG_SPL_BUILD这个宏,默认是没有定义的。那么是用来干嘛的呢?其实是用来控制生成BL1的,具体如何配置才能生成SPL或者说BL1请看README文件,但是这里我们不用它,我们可以截取BL2(也就是u-boot.bin)的前16k-16字节作为BL1。 .balignl与. align类似,完整的laign语句格式为:.align {alignment} {,fill} {,max},alignment用于指定对齐方式,可能的取值为2的次幂,缺省为4。fill是填充内容,缺省用0填充。max是填充字节数最大值,如果填充字节数超过max, 不进行对齐。但是这里的.balignl 16,0xdeadbeef 是指16字节对齐,而不是2的16次方对齐,从当前地址开始用deadbeef填充。为什么要字节对齐呢?因为我们是32位的ARM处理器,要求指令的地址是4字节对齐,否则编译不通过,不信可以试试。然后为嘛是16字节对齐呢?难道u-boot作者故意搞笑,有兴趣的自己去试试改为4字节对齐。我们接着往下分析

/*
 * the actual reset code
 */

reset:
	bl	save_boot_params
	/*
	 * set the cpu to SVC32 mode
	 */
	mrs	r0, cpsr
	bic	r0, r0, #0x1f
	orr	r0, r0, #0xd3
	msr	cpsr,r0

又是一个跳转,不要慌其实这个跳转啥也没干。因为往下可以看到

ENTRY(save_boot_params)
bx lr@ back to my caller
ENDPROC(save_boot_params)
.weak save_boot_params

将ENTRY这个宏展开,ENTRY包含在头文件linkage.h中,为什么是在这个文件呢?这里说下u-boot默认的头文件包含路径,有两个:顶层目录下的include目录和


没写完,我会持续更新修改。。。。