uboot启动第一部分

本文详细解析了U-Boot的启动过程,从_start接口开始,包括初始化GOT全局偏移量表、设置CP0、缓存初始化,到board_earlyinit和mips74k_cpuinit等步骤。在内存重新定位过程中,涉及到了代码和数据的复制、栈指针设置、全局数据初始化,最终调用board_init_r进入RAM中继续执行。
摘要由CSDN通过智能技术生成

 在BOOT标题uboot.lds分析中可知boot的编译地址的基地址为0x9fc00000(记住编译地址并不等同于运行地址)。那么难道boot启动的起始地址就是0x9fc00000吗?

这样看上去没什么道理,因为大家都知道设备上电后在flash的起始地址开始运行,在uboot.lds中我们指定了代码段的起始入口为_start接口,那么_start的编译地址为

0x9fc00000,但是在flash上的运行地址为0x00000000。设备一上电就会找到_start入口开始执行,该入口在start.S文件中,也是boot启动的第一部分。

start.S:

这里我们可以看见_start

_start: 执行RVECENT这个宏,那么我们来看看这个宏都做了什么

这个宏执行无条件跳转b跳转到reset

reset:

    /* Initialize GOT pointer.

*********************************
初始化GOT Global Offset Table(GOT全局偏移量表) 指针
编译器在数据段开始的地方创建了一个表.叫做全局偏移量表(global offset table.GOT)。
GOT包含每个被这个目标模块引用的全局数据目标的表目。
编译器还为GOT中每个表目生成一个重定位记录。在加载时,动态链接器会重定位GOT中的每个表目,
使得它包含正确的绝对地址。

跳转到下面标签1,执行,并把返回地址保存到ra寄存器。
最后定义了1个字, 值 ==   _GLOBAL_OFFSET_TABLE_
标号_GLOBAL_OFFSET_TABLE_可能驻留在.got section的中间,允许负的和非负
的下标索引这个数组。

*********************************
    */
    bal     1f /*转移指令*/
    nop
    .word   _GLOBAL_OFFSET_TABLE_
    1:
    move    gp, ra
    lw      t1, 0(ra)
    move    gp, t1

    .set reorder
    /* Initialize CS, enable cache.

初始化时钟,使能cache
    */

    JAL_KSEG1(board_earlyinit)

/*这里我们可以看到JAL_KSEG1的宏定义

#define JAL_KSEG1(x) LA t9,x ; or t9,K1BASE; jalr t9; nop

通过该宏可知,跳转到board_earlyinit | K1BASE 的地址行去并保存返回地址

那么K1BASE是怎么得到的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值