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