一. 分析 uboot 的配置过程:
make 100ask24x0_config
查找:100ask24x0_config100ask24x0_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0查找:MKCONFIG
MKCONFIG := $(SRCTREE)/mkconfig相当于:
mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0打开:mkconfig
# mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0 # $0 $1 $2 $3 $4 $5 $6
# 生成链接文件: ln -s asm-$2 asm # ln -s asm-arm asm ln -s ${LNPREFIX}arch-$6 asm-$2/arch #ln -s arch-s3c24x0 asm-arm/arch ln -s ${LNPREFIX}proc-armv asm-$2/proc #ln -s proc-armv asm-arm/proc echo "ARCH = $2" > config.mk #生成config.mk echo "CPU = $3" >> config.mk #追加config.h echo "BOARD = $4" >> config.mk相当于:
ARCH = arm CPU = arm920t BOARD = 100ask24x0 SOC = s3c24x0生成 config.h 文件, 并写入下面内容
/* Automatically generated - do not edit */ #include <configs/100ask24x0.h>
make
查看makefile文件
一些obj
OBJS = cpu/$(CPU)/start.o # 相当于: OBJS = cpu/arm920t/start.o一些lib
LIBS = lib_generic/libgeneric.a LIBS += board/$(BOARDDIR)/lib$(BOARD).a LIBS += cpu/$(CPU)/lib$(CPU).a #相当于: LIBS = lib_generic/libgeneric.a LIBS += board/100ask24x0/lib100ask24x0.a LIBS += cpu/arm920t/libarm920t.a ......
找到 u-boot.bin 发现它依赖于u-boot
$(obj)u-boot.bin: $(obj)u-boot $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ $(obj)u-boot: depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT) UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\ cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \ --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \ -Map u-boot.map -o u-boot简单的办法是重新运行一下make可以得到如下信息:
从中还可以发现:
链接文件是 board/100ask24x0/u-boot.lds
uboot的地址 0x33F80000
1. 分析这个链接文件
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/ OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { . = 0x00000000; . = ALIGN(4); .text : { cpu/arm920t/start.o (.text) board/100ask24x0/boot_init.o (.text) *(.text) } . = ALIGN(4); .rodata : { *(.rodata) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); .got : { *(.got) } . = .; __u_boot_cmd_start = .; .u_boot_cmd : { *(.u_boot_cmd) } __u_boot_cmd_end = .; . = ALIGN(4); __bss_start = .; .bss : { *(.bss) } _end = .; }
第一个运行的文件 cpu\arm920t\start.s
grep "33F80000" * -nR
board/100ask24x0/config.mk:25:TEXT_BASE = 0x33F80000 board/smdk2410/config.mk:25:TEXT_BASE = 0x33F80000 board/mpl/vcma9/config.mk:24:TEXT_BASE = 0x33F80000 board/sbc2410x/config.mk:23:TEXT_BASE = 0x33F80000 u-boot.srec:2:S31533F80000170000EA14F09FE514F09FE514F09FE526 u-boot.srec:12195:S31533FAF9F0E4F9FA33F8000000626F6F746172677371 u-boot.srec:12400:S70533F80000CF
发现这个地址其实是由board/100ask24x0/config.mk来定义的.