1 Uboot存放地址
Uboot是是运行完固化的Boot Code后,Boot Code会跳转到选定设备的指定地址去运行,以EMMC为例,见下图
起始的前0x200即512B为MBR,接着的是预留的Second Image Table,Boot Image( uboot)应该放在0x400(1024)的地址,即烧写uboot的时候,就应该烧写在emmc主分区的1024位置,这也和烧录uboot的脚本“sudo dd if=./u-boot.bin of=./u-boot-no-padding.bin bs=1024 skip=1; sync”相对应。
2 Uboot启动
Uboot启动一般认为是由两个阶段来运行,一是汇编start.s运行阶段,二是由其他C语言完成的第二阶段,一下做简要分析。
2.1 第一阶段分析
第一阶段主要是start.s的运行,主要完成定义入口地址、设置异常向量、设置CPU的频率、初始化内存控制器、加载Uboot第二阶段代码代码到RAM、初始化堆栈、跳转到RAM运行第二阶段程序。按照规定的0x400存放这段代码,BOOT CODE会加载这段代码到内部RAM运行,根据不同的boot device,具体加载的偏移地址和加载程序范围如下图:
可见到,对于emmc来说,加载的偏移地址为0x400,大小为2Kbyte。
通过make mx53_smd_android_config配置自己的板子,查看uboot-imx下的Makefile可知
mx53_smd_android_config :unconfig
$(MKCONFIG) $(@:_config=) arm arm_cortexa8 mx53_smd freescale mx53。
2.1.1 链接文件u-boot.lds
在看链接文件之前,我们先看一下,生成的map文件如下(仅截取memory map一部分):
Memory Configuration
Name Origin Length Attributes
*default* 0x00000000 0xffffffff
Linker script and memory map
0x00000000 . = 0x0
0x00000000 . = ALIGN (0x4)
.text 0x77800000 0x258a8
board/freescale/mx53_mpvceo/flash_header.o(.text.flasheader)
.text.flasheader
0x77800000 0x5cc board/freescale/mx53_mpvceo/flash_header.o
cpu/arm_cortexa8/start.o()
*fill* 0x778005cc 0x14 00
.text 0x778005e0 0x440 cpu/arm_cortexa8/start.o
0x77800620 _end_vect
0x77800628 _bss_start
0x7780062c _bss_end
0x77800624 _armboot_start
0x778005e0 _start
0x77800960 v7_flush_dcache_all
.data