当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > Uboot启动过程浅析
Uboot启动过程浅析
时间:2016-12-14作者:华清远见

一、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 <- current position of code */
        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,就不需要搬运.

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)