u-boot版本: v2009.08
在分析代码前,我们需要先了解两个知识点。
1. 链接脚本
路径: uboot-imx/board/freescale/mx6q_sabresd/u-boot.lds
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
/* WARNING - the following is hand-optimized to fit within */
/* the sector layout of our flash chips! XXX FIXME XXX */
board/freescale/mx6q_sabresd/flash_header.o (.text.flasheader)
cpu/arm_cortexa8/start.o
board/freescale/mx6q_sabresd/libmx6q_sabresd.a (.text)
lib_arm/libarm.a (.text)
net/libnet.a (.text)
drivers/mtd/libmtd.a (.text)
drivers/mmc/libmmc.a (.text)
. = DEFINED(env_offset) ? env_offset : .;
common/env_embedded.o(.text)
*(.text)
}
......
}
有看到flash_header.S被作为u-boot运行的第一个文件,而不是start.S,请注意这点。
2. Program Image
听标题名字有点抽象,其实就是IMX平台内部自带ROM, 然后CPU从ROM开始运行,接着ROM会读取u-boot,
它需要知道当前u-boot的信息,所以默认规定了编译出来都需要一个所谓的Program Image, 由以下几部分组成:
Program Image的布局格式如下:
格式说明如下:
从上面第一条分析可知,ROM会先去执行flash_header.S里,来看flash_header.S.
#include <config.h>
#include <asm/arch/mx6.h>
#ifdef CONFIG_FLASH_HEADER
#ifndef CONFIG_FLASH_HEADER_OFFSET
# error "Must define the offset of flash header"
#endif
#define CPU_2_BE_32(l) \
((((l) & 0x000000FF) << 24) | \
(((l) & 0x0000FF00) << 8) | \
(((l) & 0x00FF000