/* ************************************************************************* * * 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 * ************************************************************************* */ /*保存变量的数据区*/ _TEXT_BASE: .word TEXT_BASE
/*初始化代码在系统重启的时候调用,运行时热复位从RAM中启动不执行 * we do sys-critical inits only at reboot, * not when booting from ram! */ #ifndef CONFIG_SKIP_LOWLEVEL_INIT bl cpu_init_crit //初始化CPU #endif
#ifndef CONFIG_SKIP_RELOCATE_UBOOT relocate: /* 重定位 U-Boot 到 RAM */ adr r0, _start /* r0 <- current position of code */ /*r0取得当前位置的地址,(见上面代码_start: b reset)当在flash中运行时(上电复位),r0=_start=0x0 ;当此段在RAM中执行时,_start = _TEXT_BASE(在board/smdk2410/config.mk中指定的值为0x33F80000,即u-boot在把代码拷贝到RAM中去执行的代码段的开始)*/ ldr r1, _TEXT_BASE /* 测试是从flash启动还是RAM,此时r1=_TEXT_BASE=0x33F80000,由编译器指定*/ cmp r0, r1 /* 调试的时候不进行重定向 */ beq stack_setup /*如果相等,则是从RAM执行,不进行重定向,直接跳转设置堆栈*/
/*准备重定向代码,以上确定了复位启动代码是从flash启动,是系统重启,而不是软启动,就需要把flash中的代码拷贝到RAM中,下面计算需要拷贝的代码的长度*/ ldr r2, _armboot_start /*把_armboot_start地址处的值也就是_start绝对地址(也即在内存中的地址,这个绝对地址是在 link 的时候确定的,如0x81008000)移到r2 ,r2=_armboot_start=_start=0x0*/ ldr r3, _bss_start /*未初始化静态变量,把_bss_start地址处的值也就是__bss_start绝对地址(也即在内存中的地址,这个绝对地址是在 link 的时候确定的)移到r3*/ sub r2, r3, r2 /* r2=armboot大小 */ add r2, r0, r2 /* r2=要复制代码的末尾地址 */
/* * 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 //保存前一个跳转地址,防止下一个跳转将前一个lr地址覆盖 bl lowlevel_init //board/smdk2410/lowlevel_init.S:用于完成芯片存储器的初始化 mov lr, ip mov pc, lr //返回cpu_init_crit函数