该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一、uboot程序的入口地址
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
cpu/arm920t/start.o (.text)
*(.text)
}
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}
从ENTRY(_start)可以看出u-boot 的入口函数是_start,如果是自启动方式,这段代码运行在sram中,此时在搬运uboot代码至dram之前,需要对dram进行初始化。
二、SDRAM 初始化,lowleverl_init.S
_TEXT_BASE:
.globl lowlevel_init
lowlevel_init:
/* memory control configuration */
/* make r0 relative the current location so that it */
/* reads SMRDATA out of FLASH rather than memory ! */
ldr r0, =SMRDATA
ldr r1, _TEXT_BASE
sub r0, r0, r1
ldr r1, =BWSCON /* Bus Width Status Controller */
add r2, r0, #13*4
三、 UBOOT 启动代码重定位
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
adr 是小范围的地址读取伪指令,指令将基于PC 相对偏移的地址值读取到寄存器中;
ldr 是大范围的读取地址伪指令,用于加载32 为立即数或一个地址到指定的寄存器中。
在sram中运行时:r0 = 0,这个时候r0 != r1,就需要搬运。
在ram 中运行时:r0 = TEXT_BASE,这个时候r0 = r1,就不需要搬运.