/*
*************************************************************************
*
* Startup Code (reset vector)
*
* do important init only if we don't start from memory!
* relocate armboot to ram
* setup stack
* jump to second stage //从英文注释中可以看出starts.o的作用。
*
*************************************************************************
*/
/*
* These are defined in the board-specific linker script. 针对不同板类型的链接脚本中已经定义过了,具体的脚本??
*/
.globl _bss_start //未初始化的数据段开始地址
_bss_start:
.word __bss_start
/*
* we do sys-critical inits only at reboot,
* not when booting from ram!
*/
#ifndef CONFIG_SKIP_LOWLEVEL_INIT 防止重复引用cpu_init_crit函数。
bl cpu_init_crit
#endif
橙色的部分代码,是针对从nor flash中启动的设备。对于不是从nandflash中启动的设备,没什么用。这一段好像也能执行代码复制.
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 */
查看当前代码的地址信息,若从ram中运行,则_start=_TEXT_BASE,否则_start = 0x00000000
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup 若相等,则建立堆栈
/*
* before relocating, we have to setup RAM timing 在重定位之前,需要设初始化内存时序,因为内存时钟是开发板独立的。
* because memory timing is board-dependend, you will
* find a lowlevel_init.S in your board directory.
*/
mov ip, lr //返回到reset
bl lowlevel_init
mov lr, ip
mov pc, lr //从lowlevel_init中,返回到reset
#endif /* CONFIG_SKIP_LOWLEVEL_INIT */