对u-boot启动代码start.s(汇编部分)的注解。
需要注意的是代码的搬运过程。
对于从nandflash启动的s3c2410,上电后会自动从nandflash搬移4k代码(肯定包含start.s部分)到0地址的缓存(bootstone)中,然后从0地址开始读取指令并运行。那么这4k的代码必须实现必要的初始化和u-boot代码的搬移(到sdram中),最后u-boot将在sdram中运行。
u-boot默认是从norflash或sdram中启动运行的。原版的start.s对于代码搬移的实现如下:
1,首先读取_start的地址值(相对pc的值,特别注意adr伪指令)和_TEXT_BASE地址处TEXT_BASE的值(在连接脚本中定义的常数),以判别程序从哪里运行,是否需要搬移。
relocate: /* relocate U-Boot to RAM */<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1
beq stack_setup
2,如果需要,搬移所有整个代码段到sdram(TEXT_BASE地址处)。下面用于计算代码段长度和代码段终止地址。
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
add r2, r0, r2 /* r2 <- source end address */
3,如果是从nandflash启动,上述实际上只有效搬移了4k的代码到sdram,因为u-boot代码段大部分还在nandflash中。所以需要添加从nandflash拷贝到sdram的代码。这里由copy_myself函数实现,再次搬移了128k,并且覆盖了前次搬移的4k。
bl copy_myself
4,搬移完成后,程序必须跳到sdram中去运行。注意下面的ldr伪指令,得到on_the_ram的绝对地址(连接完成后就是个常数值,位于sdram中),然后赋值给pc。
@ jump to ram
ldr r1, =on_the_ram
add pc, r1, #0
5,跳到start_armboot(),运行第一跳c指令。这里的ldr是普通指令,_start_armboot标号处存储了start_armboot()函数的绝对地址(连接完就是个常数)。到此start.s的工作完成。
on_the_ram:
#endif
/*end add*/
ldr pc, _start_armboot
_start_armboot: .word start_armboot
文章评论(0条评论)
登录后参与讨论