linux uboot 启动过程,【华清远见】Uboot启动过程浅析

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

一、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,就不需要搬运.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值