1、代码重定位就是将u-boot拷贝到SDRAM上执行,前提是SDRAM必须可以使用
<1>设置栈
ldr sp, =0x34000000
<2>初始化NANDFLASH,nand_init
bl nand_init
<3>设置地址参数
mov r0,#0//源地址 ldr r1,=_start//目标地址 ldr r2,=__bss_start sub r2,r2,r1//长度,代码段大小
<4>拷贝代码,清除bss
r0:0 r1:_start(0x33f80000) r2:代码大小
bl copy_code_to_sdram//拷贝代码 bl clear_bss//清除bss
copy_code_to_sdram()函数
void copy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len) { int i = 0; /* 如果是NOR启动 */ if (isBootFromNorFlash()) {
/*Norflash启动*/ while (i < len) { dest[i] = src[i]; i++; } } else {
/*NANDFLASH启动*/ //nand_init(); nand_read((unsigned int)src, dest, len); } }
clear_bss函数
void clear_bss(void) { extern int __bss_start, __bss_end; int *p = &__bss_start; for (; p < &__bss_end; p++) *p = 0; }
上面用到的地址都是在u-boot.lds中确定的
u-boot.lds
_start:0x33f80000
rodata:只读数据段起始地址
data :数据段起始地址
__bss_start: bss段起始地址
__bss_end :bss段结束地址
SECTIONS { . = 0x33f80000; .text : { *(.text) } . = ALIGN(4); .rodata : {*(.rodata*)} . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); __bss_start = .; .bss : { *(.bss) *(COMMON) } __bss_end = .; }