自己写bootloader——mini2440(六、代码重新定位)

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 = .;
}

猜你喜欢

转载自www.cnblogs.com/liuyuchun/p/9137818.html