MIPS架构的启动地址随笔

MIPS架构的cpu在上电、重启的入口地址为0xBFC0 0000,这段空间在 kseg1 (0xA000 0000 ~ 0xBFFF FFFF) 512M Bytes。这段地址空间通过把最高三位清零的方法来映射到物理地址,映射到(0x0 ~ 0x1FFF FFFF)物理地址。

因此MIPS cpu的启动地址在物理地址 0x1FC0 0000。

MIPS芯片如果有内置ROM,其地址就在这个地址,然后再通过内部ROM跳转、加载后续的程序(例如bootloader或者uboot)。

以LINUX系统为例,跑完芯片的BOOTROM后,需要跳转执行uboot。

\buildroot\output\build\alistarter-BL7.8.0-20220506-Auto\arch\mips\cpu\u-boot.lds

uboot的ld文件定义了uboot的入口地址:

ENTRY(_start)

_start函数原型在下面函数定义:

.\buildroot\output\build\alistarter-BL7.8.0-20220506-Auto\arch\mips\cpu\start.S

	.globl _start
	.text
_start:
	/* U-boot entry point */
	b	reset
	 nop

从uboot.map中可以找到其地址:

 *(.text*)
 .text          0x0000000082af2000      0xaa0 arch/mips/cpu/start.o
                0x0000000082af2000                _start

0x82af2000这个地址位于kseg0地址段(0x8000 0000~0x9FFF FFFF)512M Bytes,这段空间的特点是将最高位清零,将其转换到低512M物理地址。这段区域是通过高速缓存来存取的,因此在高速缓存初始化之前不能使用。

所以我们可以倒推回去,bootrom一定是:

1.先初始化了高速缓。

2.将flash中UBOOT的程序段加载到0x82af2000这个地址。

以下是反推追踪:

\buildroot\output\build\alistarter-BL7.8.0-20220506-Auto\Makefile中有如下定义

ifneq ($(CONFIG_SYS_TEXT_BASE),)
LDFLAGS_u-boot += -Ttext $(CONFIG_SYS_TEXT_BASE)
endif

LDFLAGS_u-boot是链接uboot.bin时用到的变量,man ld查看-Ttext选项的意思是定义text段的起始链接地址。-T选型是指定链接脚本。

因此uboot会被链接到CONFIG_SYS_TEXT_BASE指定的地址上。

加载时地址就是程序放置的地址,运行地址就是程序定位的绝对地址,也即在编译连接时定位的地址。如果程序是在flash里运行,则运行地址和加载地址是相同的。如果程序是在ram里运行,但程序是存储在flash里,则运行地址指向ram,而加载地址是指向flash。

可以这样理解:

链接地址<==>运行地址
存储地址<==>加载地址

ali_3702_mips.h中有定义CONFIG_SYS_TEXT_BASE

./include/configs/ali_3702_mips.h:216:#define CONFIG_SYS_TEXT_BASE    0x82af2000

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值