U-Boot版本:1.1.6
以U-Boot中的SMDK2410和JZ2440为目标板进行学习
0x30000000 : SDRAM起始地址
//include\configs\smdk2410.h中定义宏起始地址和大小
#define PHYS_SDRAM_1 0x30000000 /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE 0x04000000 /* 64 MB */
0x30000100: 传给内核的TAG参数列表起始地址
//board/smdk2410/smdk2410.c中board_init函数中设置
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410; /* arch number of SMDK2410-Board */
gd->bd->bi_boot_params = 0x30000100; /* adress of boot parameters */
0x30007FC0: Linux内核的64byte的头的地址
//include\configs\smdk2410.h文件中的宏,定义了环境变量"bootcmd"
#define CONFIG_BOOTCOMMAND "nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0"
// 当超时后执行环境变量bootcmd中的2个命令,先将将内核复制到 0x30007FC0,然后执行do_bootm,
if (argc < 2) {//bootm 后面不带地址时
addr = load_addr;
} else { //将0x30007FC0赋给addr,
addr = simple_strtoul(argv[1], NULL, 16);
}
//然后对头部的Magic Number比较,CRC校验,CPU架构等等一些比较、处理,调用lib_arm/ArmLinux.c中的do_bootm_linux函数
// 从64byte的头中取出内核起始地址ih_ep 0x30008000,然后启动内核
theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep);
theKernel (0, bd->bi_arch_number, bd->bi_boot_params);
0x30008000:Linux内核的起始地址ih_ep,由U-Boot的工具制作uImage时在内核头部添加64byte
0x33F80000: 链接地址,U-Boot在SDRAM中的地址,在board/smdk2410/config.mk中定义 TEXT_BASE=0x33f80000
0x40000:CFG_ENV_OFFSET 宏定义的环境变量在flash中的地址,saveenv之后才会存储。CFG_ENV_SIZE 环境变量空间长度