BBS+U-Boot编译过程与启动入口分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
U-Boot编译过程与启动入口分析
作者:zenf E-Mail: zenf_zhao@
版权所有:作者保留文档中的任何文字和图片的版权,任何转载或者商业用途必须获得作者
的许可和授权。
(2007 年9 月)
说明:本文档基于hfrk 的S3C44B0 开发板配置平台
1.1 U-BOOT的编译
配置时采用make hfrks3c44b0_config配置,此时调用makefile中的配置功能:
hfrks3c44b0_config : unconfig
@./mkconfig $(@:_config=) arm s3c44b0 hfrks3c44b0 hfrk
命令解析为: ./mkconfig hfrks3c44b0 arm s3c44b0 hfrks3c44b0 hfrk
第一参数%1为板子;arm为参数%2 CPU类型;s3c44b0为%3的CPU型号; 后面分别板子名称和厂商。
再分析u-boot的目录中的mkconfig文件,其作用进入include目录,分别建立:asm 和asm-cpu/arch的库软链接,生成config.mk文件,生成config.h文件。
(分析该mkconfig,很简单)
即:echo "#include <configs/$1.h>" >>config.h
把用户配置的如hfrks3c44b0.h文件加入 config.h中,以被编译模块调用,从而实现自动配置功能。
主makefile的核心编译内容分析,内容如下:
#########################################################################
# U-Boot objects....order is important (i.e. start must be first)
OBJS = cpu/$(CPU)/start.o
ifeq ($(CPU),i386)
OBJS += cpu/$(CPU)/start16.o
OBJS += cpu/$(CPU)/reset.o
endif
ifeq ($(CPU),ppc4xx)
OBJS += cpu/$(CPU)/resetvec.o
endif
ifeq ($(CPU),mpc85xx)
OBJS += cpu/$(CPU)/resetvec.o
Endif
LIBS = lib_generic/libgeneric.a
LIBS += board/$(BOARDDIR)/lib$(BOARD).a
LIBS += cpu/$(CPU)/lib$(CPU).a
LIBS += lib_$(ARCH)/lib$(ARCH).a
LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a
LIBS += net/libnet.a
LIBS += disk/libdisk.a
LIBS += rtc/librtc.a
LIBS += dtt/libdtt.a
LIBS += drivers/libdrivers.a
LIBS += drivers/sk98lin/libsk98lin.a
LIBS += post/libpost.a post/cpu/libcpu.a
LIBS += common/libcommon.a
.PHONY : $(LIBS)
# Add GCC lib
PLATFORM_LIBS += --no-warn-mismatch -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) –lgcc
SUBDIRS = tools \
examples \
post \
post/cpu
.PHONY : $(SUBDIRS)
ALL = u-boot.srec u-boot.bin System.map
all: $(ALL)
u-boot.srec: u-boot
$(OBJCOPY) ${OBJCFLAGS} -O srec $< $@
u-boot.bin: u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
u-boot.img: u-boot.bin
./tools/mkimage -A $(ARCH) -T firmware -C none \
-a $(TEXT_BASE) -e 0 \
-n $(shell sed -n -e 's/.*U_BOOT_VERSION//p' include/version.h | \ sed -e 's/"[ ]*$$/ for $(BOARD) board"/') \
-d $< $@
u-boot.dis: u-boot
$(OBJDUMP) -d $< > $@
u-boot: depend $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
$(LD) $(LDFLAGS) $$UNDEF_SYM $(OBJS) \
--start-group $(LIBS) $(PLATFORM_LIBS) --end-group \
-Map u-boot.map -o u-boot
$(LIBS):
$(MAKE) -C `dirname $@`
$(SUBDIRS):
$(MAKE) -C $@ all
gdbtools:
$(MAKE) -C tools/gdb || exit 1
depend dep:
@for dir in $(SUBDIRS) ; do $(MAKE) -C $$dir .depend ; done
tags:
ctags -w `find $(SUBDIRS) include \
lib_generic board/$(BOARDDIR) cpu/$(CPU) lib_$(ARCH) \
fs/cramfs fs/fat fs/fdos fs/jffs2 \
net disk rtc dtt drivers drivers/sk98lin common \
\( -name CVS -prune \) -o \( -name '*.[ch]' -print \)`
etags:
etags -a `find $(SUBDIRS) include \
\( -name CVS -prune \) -o \( -name '*.[ch]' -print \)`
System.map: u-boot
@$(NM) $< | \
grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
sort > System.map
编译过程解析:
先编译tools, examples, post, post/cpu 四个目录关联文件,即depend相关联的生成.depend。
其次编译以上四个目录中的文件,即$(SUBDIRS)想关联的。
其三编译$(OBJS),对ARM来说只有start.o,来自cpu/arm/start.s。
取编译时的打印如下:
arm-elf-gcc -Wa,-gstabs -D__ASSEMBLY__ -g -Os -fno-strict-aliasing -fno-common -ffixed-r8 -mshort-load-bytes -msoft-float -D__KERNEL__ -DTEXT_BASE=0x0C700000 -I/usr/u-boot/include -fno-builtin -ffreestanding -nostdinc -isystem /usr/lib/gcc/i386-redhat-linux/3.4.3/include -pipe -DCONFIG_ARM -D__ARM__ -mapcs-32 -march=armv4 -mtune=arm7tdmi -msoft-float -Uarm -c -o cpu/s3c44b0/start.o /usr/u-boot/cpu/s3c44b0/start.S
其四编译库内容,即$(LIBS)指定内容。
目前的库内容有如下:
ülib_generic/libgeneric.a
üboard/$(BOARDDIR)/lib$(BOARD).a
ücpu/$(CPU)/lib$(CPU).a
ülib_$(ARCH)/lib$(ARCH).a
üfs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a
fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a
ünet/libnet.a
üdisk/libdisk.a
ürtc/librtc.a
üdtt/libdtt.a
üdrivers/libdrivers.a
üdrivers/sk98lin/libsk98lin.a
üpost/libpost.a post/cpu/libcpu.a
ücommon/libcommon.a
makefile中采用 $(LIBS): $(MAKE) -C `dirname $@` 去编译每一个库内容。
dirname $@的功能取每个目录的第一级目录,比如dirname disk/libdisk.a 的结果是disk目录,再如make第一库的过程结果如下:
make -C `dirname lib_generic/libgeneric.a`
make[1]: Entering directory `/usr/u-boot/lib_generic'
arm-elf-gcc -M -g -Os -fno-strict-aliasing -fno-common -ffixed-r8 -mshort-load-bytes -msoft-float -D__KERNEL__ -DTEXT_BASE=0x0C700000 -I/usr/u-boot/include -fno-builtin -ffreestanding -nostdinc -isystem /usr/local/lib/gcc-lib/arm-elf/2.95.3/include -pipe -DCONFIG_ARM -D__ARM__ -mapcs-32 -march=armv4 -mtune=arm7tdmi -msoft-float -Uarm -Wall -Wstrict-prototypes bzlib.c bzlib_crctable.c bzlib_decompress.c bzlib_randtable.c bzlib_huffman.c crc32.c ctype.c display_options.c ldiv.c string.c vsprintf.c zlib.c > .depend
make[1]: Leaving directory `/usr/u-boot/lib_generic'
make[1]: Entering directory `/usr/u-boot/lib_generic'
arm-elf-gcc -g -Os -fno-strict-aliasing -fno-common -ffixed-r8 -mshort-load-bytes -msoft-float -D__KERNEL__ -DTEXT_BASE=0x0C700000 -I/usr/u-boot/include -fno-builtin -ffreestanding -nostdinc -isystem /usr/local/lib/gcc-lib/arm-elf/2.95.3/include -pipe -DCONFIG_ARM -D__ARM__ -mapcs-32 -march=armv4 -mtune=arm7tdmi -msoft-float -Uarm -Wall -Wstrict-prototypes -c -o bzlib.o bzlib.c
......
arm-elf-gcc -g -Os -fno-strict-aliasing -fno-common -ffixed-r8 -mshort-load-bytes -msoft-float -D__KERNEL__ -DTEXT_BASE=0x0C700000 -I/usr/u-boot/include -fno-builtin -ffreestanding -nostdinc -isystem /usr/local/lib/gcc-lib/arm-elf/2.95.3/include -pipe -DCONFIG_ARM -D__ARM__ -mapcs-32 -march=armv4 -mtune=arm7tdmi -msoft-float -Uarm -Wall -Wstrict-prototypes -c -o zlib.o zlib.c
arm-elf-ar crv libgeneric.a bzlib.o bzlib_crctable.o bzlib_decompress.o bzlib_randtable.o bzlib_huffman.o crc32.o ctype.o display_options.o ldiv.o string.o vsprintf.o zlib.o
make[1]: Leaving directory `/usr/u-boot/lib_generic'
最后阶段的编译整合过程如下:
UNDEF_SYM=`arm-elf-objdump -x lib_generic/libgeneric.a board/hfrk/hfrks3c44b0/libhfrks3c44b0.a cpu/s3c44b0/libs3c44b0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/sk98lin/libsk98lin.a post/libpost.a post/cpu/libcpu.a common/libcommon.a |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
arm-elf-ld -Bstatic -T /usr/u-boot/board/hfrk/hfrks3c44b0/u-boot.lds -Ttext 0x0C700000 $UNDEF_SYM cpu/s3c44b0/start.o \
--start-group lib_generic/libgeneric.a board/hfrk/hfrks3c44b0/libhfrks3c44b0.a cpu/s3c44b0/libs3c44b0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/sk98lin/libsk98lin.a post/libpost.a post/cpu/libcpu.a common/libcommon.a --no-warn-mismatch -L /usr/local/lib/gcc-lib/arm-elf/2.95.3 -lgcc --end-group \
-Map u-boot.map -o u-boot
arm-elf-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec
arm-elf-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
编译后u-boot.map文件的部分内存空间分析:
Memory Configuration
Name Origin Length Attributes
*default* 0x00000000 0xffffffff
Linker script and memory map
0x00000000 . = 0x0
0x00000000 . = ALIGN (0x4)
.text 0x0c700000 0x1aaa4
cpu/s3c44b0/start.o(.text)
.text 0x0c700000 0x2d0 cpu/s3c44b0/start.o
0x0c7000e8 _bss_start
0x0c7000ec _bss_end
0x0c7000e4 _armboot_start (228=e4)
0x0c700000 _start
相对应的启动部分汇编代码如下:
_TEXT_BASE:
.word TEXT_BASE
.globl _armboot_start
_armboot_start:
.word _start
.globl _bss_start
_bss_start:
.word __bss_start
.globl _bss_end
_bss_end:
.word _end
#ifdef CONFIG_USE_IRQ
/* IRQ stack memory (calculated at run-time) */
.globl IRQ_STACK_START
IRQ_STACK_START:
.word 0x0badc0de
/* IRQ stack memory (calculated at run-time) */
.globl FIQ_STACK_START
FIQ_STACK_START:
.word 0x0badc0de
#endif
/*the actual reset code*/
reset:
/*set the cpu to SVC32 mode*/
mrs r0,cpsr
bic r0,r0,#0x1f
orr r0,r0,#0x13
msr cpsr,r0
.....
编译工具安装目录分析(典型选择):
./usr/local/arm-elf/
./usr/local/arm-elf/bin/
./usr/local/arm-elf/lib/
./usr/local/arm-elf/lib/libg.a
./usr/local/arm-elf/lib/libiberty.a
./usr/local/arm-elf/include/
./usr/local/arm-elf/include/linux/ 注:linux的includeW库目录
./usr/local/arm-elf/include/scsi/
./usr/local/arm-elf/include/fpu_control.h
./usr/local/arm-elf/include/asm-armnommu/
./usr/local/arm-elf/include/asm-arm/
./usr/local/arm-elf/stlport/
./usr/local/arm-elf/stlport/BC50/
./usr/local/arm-elf/stlport/BC50/algorith.h
./usr/local/arm-elf/stlport/stl/
./usr/local/lib/gcc-lib/arm-elf/ 注: gcc的库目录./usr/local/lib/gcc-lib/arm-elf/2.95.3/
./usr/local/lib/gcc-lib/arm-elf/2.95.3/include/
./usr/local/man/man1/arm-elf-addr2line.1
./usr/local/bin/arm-elf-addr2line
./usr/local/bin/arm-elf-ar
./usr/local/bin/arm-elf-as
./usr/local/bin/arm-elf-c++
./usr/local/bin/arm-elf-c++filt
./usr/local/bin/arm-elf-elf2flt
./usr/local/bin/arm-elf-flthdr
./usr/local/bin/arm-elf-g++
./usr/local/bin/arm-elf-gcc
./usr/local/bin/arm-elf-ld
./usr/local/bin/arm-elf-ld.real
./usr/local/bin/arm-elf-nm
./usr/local/bin/arm-elf-objcopy
./usr/local/bin/arm-elf-objdump
./usr/local/bin/arm-elf-protoize
./usr/local/bin/arm-elf-ranlib
./usr/local/bin/arm-elf-readelf
./usr/local/bin/arm-elf-size
./usr/local/bin/arm-elf-strings
./usr/local/bin/arm-elf-strip
./usr/local/bin/arm-elf-unprotoize
./usr/local/bin/genromfs
./usr/local/bin/elf2flt
./usr/local/bin/flthdr
1.2 U-BOOT的启动分析
U-BOOT u-boot.map 启动部分:
u-boot: file format elf32-little
u-boot
architecture: UNKNOWN!, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x0c700000
Program Header:
LOAD off 0x00008000 vaddr 0x0c700000 paddr 0x0c700000 align 2**15 filesz 0x00021310 memsz 0x00055c5c flags rwx
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0001aaa4 0c700000 0c700000 00008000 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .glue_7 00000000 0c71aaa4 0c71aaa4 00022aa4 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .glue_7t 00000000 0c71aaa4 0c71aaa4 00022aa4 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
3 .rodata 00005620 0c71aaa
4 0c71aaa4 00022aa4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .data 00000c10 0c7200c4 0c7200c4 000280c4 2**2
CONTENTS, ALLOC, LOAD, DATA
5 .u_boot_cmd 0000063c 0c720cd4 0c720cd4 00028cd4 2**2
CONTENTS, ALLOC, LOAD, DATA
6 .bss 0003494c 0c721310 0c721310 00029310 2**2
ALLOC
7 .stab 0000069c 00000000 00000000 00029310 2**2
CONTENTS, READONLY, DEBUGGING
8 .stabstr 00000060 00000000 00000000 000299ac 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_abbrev 000078cc 00000000 00000000 00029a0c 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_info 00079476 00000000 00000000 000312d8 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_line 0001ecab 00000000 00000000 000aa74e 2**0
CONTENTS, READONLY, DEBUGGING
12 .debug_pubnames 0000213d 00000000 00000000 000c93f9 2**0
CONTENTS, READONLY, DEBUGGING
13 .debug_aranges 00000720 00000000 00000000 000cb536 2**0
CONTENTS, READONLY, DEBUGGING
SYMBOL TABLE:
0c700000 l d .text 00000000 .text
0c71aaa4 l d .glue_7 00000000 .glue_7
0c71aaa4 l d .glue_7t 00000000 .glue_7t
0c71aaa4 l d .rodata 00000000 .rodata
0c7200c4 l d .data 00000000 .data
0c720cd4 l d .u_boot_cmd 00000000 .u_boot_cmd
0c721310 l d .bss 00000000 .bss
00000000 l d .stab 00000000 .stab
00000000 l d .stabstr 00000000 .stabstr
00000000 l d .debug_abbrev 00000000 .debug_abbrev
00000000 l d .debug_info 00000000 .debug_info
00000000 l d .debug_line 00000000 .debug_line
00000000 l d .debug_pubnames 00000000 .debug_pubnames
00000000 l d .debug_aranges 00000000 .debug_aranges
00000000 l d *ABS* 00000000 .shstrtab
00000000 l d *ABS* 00000000 .symtab
00000000 l d *ABS* 00000000 .strtab
00000000 l df *ABS* 00000000 /usr/u-boot/cpu/s3c44b0/start.S
00000000 l df *ABS* 00000000 /usr/u-boot/include/version.h
00000000 l df *ABS* 00000000 /usr/u-boot/cpu/s3c44b0/start.S
00000000 l df *ABS* 00000000 /usr/u-boot/include/config.h
00000000 l df *ABS* 00000000 /usr/u-boot/include/configs/hfrks3c44b0.h 00000000 l df *ABS* 00000000 /usr/u-boot/include/cmd_confdefs.h 00000000 l df *ABS* 00000000 /usr/u-boot/include/configs/hfrks3c44b0.h 00000000 l df *ABS* 00000000 /usr/u-boot/include/config.h
00000000 l df *ABS* 00000000 /usr/u-boot/cpu/s3c44b0/start.S
0c7000f0 l .text 00000000 reset
0c000004 l *ABS* 00000000 HandleUndef
0c000008 l *ABS* 00000000 HandleSWI
0c00000c l *ABS* 00000000 HandlePabort
0c000010 l *ABS* 00000000 HandleDabort
0c000018 l *ABS* 00000000 HandleIRQ
0c00001c l *ABS* 00000000 HandleFIQ
0c000084 l *ABS* 00000000 HandleEINT0
0c000080 l *ABS* 00000000 HandleEINT1
0c00007c l *ABS* 00000000 HandleEINT2
0c000078 l *ABS* 00000000 HandleEINT3
0c000074 l *ABS* 00000000 HandleEINT4567
0c000070 l *ABS* 00000000 HandleTICK
0c00006c l *ABS* 00000000 HandleZDMA0
0c000068 l *ABS* 00000000 HandleZDMA1
0c000064 l *ABS* 00000000 HandleBDMA0
0c000060 l *ABS* 00000000 HandleBDMA1
0c00005c l *ABS* 00000000 HandleWDT
0c000058 l *ABS* 00000000 HandleUERR01
0c000054 l *ABS* 00000000 HandleTIMER0
0c000050 l *ABS* 00000000 HandleTIMER1
0c00004c l *ABS* 00000000 HandleTIMER2
0c000048 l *ABS* 00000000 HandleTIMER3
0c000044 l *ABS* 00000000 HandleTIMER4
0c000040 l *ABS* 00000000 HandleTIMER5
0c00003c l *ABS* 00000000 HandleURXD0
0c000038 l *ABS* 00000000 HandleURXD1
0c000034 l *ABS* 00000000 HandleIIC
0c000030 l *ABS* 00000000 HandleSIO
0c00002c l *ABS* 00000000 HandleUTXD0
0c000028 l *ABS* 00000000 HandleUTXD1
0c000024 l *ABS* 00000000 HandleRTC
0c000020 l *ABS* 00000000 HandleADC
0c000000 l *ABS* 00000000 HandleReset
0c000014 l *ABS* 00000000 HandleReserved
0c7000e0 l .text 00000000 _TEXT_BASE
0c700170 l .text 00000000 cpu_init_crit
0c700108 l .text 00000000 relocate
0c700158 l .text 00000000 stack_setup
0c700128 l .text 00000000 copy_loop
0c7001c8 l .text 00000000 real_vectors
0c700148 l .text 00000000 vector_copy_loop
0c70016c l .text 00000000 _start_armboot
0c7001e8 l .text 00000000 undefined_instruction
0c7001f0 l .text 00000000 software_interrupt
0c7001f8 l .text 00000000 prefetch_abort
0c700200 l .text 00000000 data_abort
0c700208 l .text 00000000 not_used
0c700210 l .text 00000000 irq
0c700218 l .text 00000000 fiq
00000000 l df *ABS* 00000000 /usr/u-boot/board/hfrk/hfrks3c44b0/memsetup.S 00000003 l *ABS* 00000000 B0_Tacs
00000003 l *ABS* 00000000 B0_Tcos
00000007 l *ABS* 00000000 B0_Tacc
00000003 l *ABS* 00000000 B0_Tcoh
00000003 l *ABS* 00000000 B0_Tah
00000001 l *ABS* 00000000 B0_Tacp
00000000 l *ABS* 00000000 B0_PMC
00000000 l *ABS* 00000000 B1_Tacs
00000001 l *ABS* 00000000 B1_Tcos
00000002 l *ABS* 00000000 B1_Tacc
00000001 l *ABS* 00000000 B1_Tcoh
00000000 l *ABS* 00000000 B1_Tah
00000000 l *ABS* 00000000 B1_Tacp
00000000 l *ABS* 00000000 B1_PMC
00000000 l *ABS* 00000000 B2_Tacs
00000002 l *ABS* 00000000 B2_Tcos
00000004 l *ABS* 00000000 B2_Tacc
00000002 l *ABS* 00000000 B2_Tcoh
00000003 l *ABS* 00000000 B2_Tah
00000003 l *ABS* 00000000 B2_Tacp
00000000 l *ABS* 00000000 B2_PMC
00000003 l *ABS* 00000000 B3_Tacs
00000003 l *ABS* 00000000 B3_Tcos
00000007 l *ABS* 00000000 B3_Tacc
00000003 l *ABS* 00000000 B3_Tcoh 00000003 l *ABS* 00000000 B3_Tah 00000003 l *ABS* 00000000 B3_Tacp 00000000 l *ABS* 00000000 B3_PMC 00000003 l *ABS* 00000000 B4_Tacs 00000003 l *ABS* 00000000 B4_Tcos 00000007 l *ABS* 00000000 B4_Tacc 00000003 l *ABS* 00000000 B4_Tcoh 00000003 l *ABS* 00000000 B4_Tah 00000003 l *ABS* 00000000 B4_Tacp 00000000 l *ABS* 00000000 B4_PMC 00000000 l *ABS* 00000000 B5_Tacs 00000001 l *ABS* 00000000 B5_Tcos 00000004 l *ABS* 00000000 B5_Tacc 00000001 l *ABS* 00000000 B5_Tcoh 00000000 l *ABS* 00000000 B5_Tah 00000000 l *ABS* 00000000 B5_Tacp 00000000 l *ABS* 00000000 B5_PMC 00000003 l *ABS* 00000000 B6_Tacs 00000003 l *ABS* 00000000 B6_Tcos 00000007 l *ABS* 00000000 B6_Tacc 00000003 l *ABS* 00000000 B6_Tcoh 00000003 l *ABS* 00000000 B6_Tah 00000003 l *ABS* 00000000 B6_Tacp 00000000 l *ABS* 00000000 B6_PMC 00000003 l *ABS* 00000000 B7_Tacs 00000003 l *ABS* 00000000 B7_Tcos 00000007 l *ABS* 00000000 B7_Tacc 00000003 l *ABS* 00000000 B7_Tcoh 00000003 l *ABS* 00000000 B7_Tah 00000003 l *ABS* 00000000 B7_Tacp 00000000 l *ABS* 00000000 B7_PMC 00000003 l *ABS* 00000000 B6_MT 00000001 l *ABS* 00000000 B6_Trcd 00000000 l *ABS* 00000000 B6_SCAN 00000003 l *ABS* 00000000 B7_MT 00000001 l *ABS* 00000000 B7_Trcd 00000000 l *ABS* 00000000 B7_SCAN 00000001 l *ABS* 00000000 REFEN 00000000 l *ABS* 00000000 TREFMD 00000000 l *ABS* 00000000 Trp
00000003 l *ABS* 00000000 Trc
00000000 l *ABS* 00000000 Tchr
0000060e l *ABS* 00000000 REFCNT
0c7002d0 l .text 00000000 MEMORY_CONFIG 00000000 l df *ABS* 00000000 board.c
0c700318 l .text 00000000 .gcc2_compiled.
0c7200c4 l O .data 00000004 mem_malloc_start
0c7200c8 l O .data 00000004 mem_malloc_end
0c7200cc l O .data 00000004 mem_malloc_brk
0c700318 l F .text 00000048 mem_malloc_init
0c7003b8 l F .text 00000068 init_baudrate
0c700420 l F .text 00000058 display_banner
0c700478 l F .text 00000068 display_dram_config
0c7004e0 l F .text 00000030 display_flash_config
u-boot的OBJ文件反汇编结果:
u-boot: file format elf32-littlearm
Disassembly of section .text:
0c700000 <_start>:
c700000: ea00003a b c7000f0 <reset> --启动阶段跳至reset
c700004: e59ff214 ldr pc, [pc, #532] ; c700220 <fiq+0x8> c700008: e59ff214 ldr pc, [pc, #532] ; c700224 <fiq+0xc> c70000c: e59ff214 ldr pc, [pc, #532] ; c700228 <fiq+0x10> c700010: e59ff214 ldr pc, [pc, #532] ; c70022c <fiq+0x14> c700014: eafffffe b c700014 <_start+0x14>
c700018: e59ff210 ldr pc, [pc, #528] ; c700230 <fiq+0x18> c70001c: e59ff210 ldr pc, [pc, #528] ; c700234 <fiq+0x1c> c700020: e59ff210 ldr pc, [pc, #528] ; c700238 <fiq+0x20> c700024: e59ff210 ldr pc, [pc, #528] ; c70023c <fiq+0x24> c700028: e59ff210 ldr pc, [pc, #528] ; c700240 <fiq+0x28> c70002c: e59ff210 ldr pc, [pc, #528] ; c700244 <fiq+0x2c> c700030: e59ff210 ldr pc, [pc, #528] ; c700248 <fiq+0x30> c700034: e59ff210 ldr pc, [pc, #528] ; c70024c <fiq+0x34> c700038: eafffffe b c700038 <_start+0x38>
c70003c: eafffffe b c70003c <_start+0x3c>
c700040: e59ff208 ldr pc, [pc, #520] ; c700250 <fiq+0x38> c700044: e59ff208 ldr pc, [pc, #520] ; c700254 <fiq+0x3c> c700048: e59ff208 ldr pc, [pc, #520] ; c700258 <fiq+0x40> c70004c: e59ff208 ldr pc, [pc, #520] ; c70025c <fiq+0x44> c700050: e59ff208 ldr pc, [pc, #520] ; c700260 <fiq+0x48> c700054: e59ff208 ldr pc, [pc, #520] ; c700264 <fiq+0x4c> c700058: eafffffe b c700058 <_start+0x58>
c70005c: eafffffe b c70005c <_start+0x5c>
c700060: e59ff200 ldr pc, [pc, #512] ; c700268 <fiq+0x50> c700064: e59ff200 ldr pc, [pc, #512] ; c70026c <fiq+0x54> c700068: e59ff200 ldr pc, [pc, #512] ; c700270 <fiq+0x58> c70006c: e59ff200 ldr pc, [pc, #512] ; c700274 <fiq+0x5c> c700070: e59ff200 ldr pc, [pc, #512] ; c700278 <fiq+0x60> c700074: e59ff200 ldr pc, [pc, #512] ; c70027c <fiq+0x64> c700078: eafffffe b c700078 <_start+0x78>
c70007c: eafffffe b c70007c <_start+0x7c>
c700080: e59ff1f8 ldr pc, [pc, #504] ; c700280 <fiq+0x68> c700084: e59ff1f8 ldr pc, [pc, #504] ; c700284 <fiq+0x6c> c700088: e59ff1f8 ldr pc, [pc, #504] ; c700288 <fiq+0x70> c70008c: e59ff1f8 ldr pc, [pc, #504] ; c70028c <fiq+0x74> c700090: e59ff1f8 ldr pc, [pc, #504] ; c700290 <fiq+0x78> c700094: e59ff1f8 ldr pc, [pc, #504] ; c700294 <fiq+0x7c> c700098: eafffffe b c700098 <_start+0x98>
c70009c: eafffffe b c70009c <_start+0x9c>
c7000a0: e59ff1f0 ldr pc, [pc, #496] ; c700298 <fiq+0x80> c7000a4: eafffffe b c7000a4 <_start+0xa4>
c7000a8: eafffffe b c7000a8 <_start+0xa8>
c7000ac: eafffffe b c7000ac <_start+0xac>
c7000b0: eafffffe b c7000b0 <_start+0xb0>
c7000b4: eafffffe b c7000b4 <_start+0xb4>
c7000b8: eafffffe b c7000b8 <_start+0xb8>
c7000bc: eafffffe b c7000bc <_start+0xbc>
c7000c0: e59ff1d4 ldr pc, [pc, #468] ; c70029c <fiq+0x84> c7000c4: eafffffe b c7000c4 <_start+0xc4>
c7000c8: eafffffe b c7000c8 <_start+0xc8>
c7000cc: eafffffe b c7000cc <_start+0xcc>
c7000d0: eafffffe b c7000d0 <_start+0xd0>
c7000d4: eafffffe b c7000d4 <_start+0xd4>
c7000d8: eafffffe b c7000d8 <_start+0xd8>
c7000dc: eafffffe b c7000dc <_start+0xdc>
0c7000e0 <_TEXT_BASE>:
c7000e0: 0c700000 ldceql 0, cr0, [r0]
0c7000e4 <_armboot_start>:
c7000e4: 0c700000 ldceql 0, cr0, [r0]
0c7000e8 <_bss_start>:
c7000e8: 0c721310 ldceql 3, cr1, [r2], -#64
0c7000ec <_bss_end>:
c7000ec: 0c755c5c ldceql 12, cr5, [r5], -#368
0c7000f0 <reset>: //启动跳至的第二条执行指令
c7000f0: e10f0000 mrs r0, CPSR
c7000f4: e3c0001f bic r0, r0, #31 ; 0x1f
c7000f8: e3800013 orr r0, r0, #19 ; 0x13
c7000fc: e129f000 msr CPSR_fc, r0
c700100: eb00001a bl c700170 <cpu_init_crit>
c700104: eb00007e bl c700304 <memsetup>
0c700108 <relocate>:
c700108: e24f0e11 sub r0, pc, #272 ; 0x110
c70010c: e51f1034 ldr r1, [pc, #-52] ; c7000e0 <_TEXT_BASE>
c700110: e1500001 cmp r0, r1
c700114: 0a00000f beq c700158 <stack_setup>
c700118: e51f203c ldr r2, [pc, #-60] ; c7000e4 <_armboot_start>
c70011c: e51f303c ldr r3, [pc, #-60] ; c7000e8 <_bss_start>
c700120: e0432002 sub r2, r3, r2
c700124: e0802002 add r2, r0, r2
0c700128 <copy_loop>:
c700128: e8b007f8 ldmia r0!, {r3, r4, r5, r6, r7, r8, r9, sl}
c70012c: e8a107f8 stmia r1!, {r3, r4, r5, r6, r7, r8, r9, sl}
c700130: e1500002 cmp r0, r2
c700134: dafffffb ble c700128 <copy_loop>
c700138: e28f0088 add r0, pc, #136 ; 0x88
c70013c: e2802b01 add r2, r0, #1024 ; 0x400
c700140: e3a01303 mov r1, #201326592 ; 0xc000000
c700144: e2811008 add r1, r1, #8 ; 0x8
0c700148 <vector_copy_loop>:
c700148: e8b007f8 ldmia r0!, {r3, r4, r5, r6, r7, r8, r9, sl}
c70014c: e8a107f8 stmia r1!, {r3, r4, r5, r6, r7, r8, r9, sl}
c700150: e1500002 cmp r0, r2
c700154: dafffffb ble c700148 <vector_copy_loop>
0c700158 <stack_setup>:
c700158: e51f0080 ldr r0, [pc, #-128] ; c7000e0 <_TEXT_BASE>
c70015c: e2400803 sub r0, r0, #196608 ; 0x30000
c700160: e2400080 sub r0, r0, #128 ; 0x80
c700164: e240d00c sub sp, r0, #12 ; 0xc
c700168: e51ff004 ldr pc, [pc, #-4] ; c70016c <_start_armboot>
0c70016c <_start_armboot>: //此处定义的_start_armboot变量,保存0x0c700510的地址
c70016c: 0c700510 cfldr64eq mvdx0, [r0], -#64 //该地址为start_armboot函数入口
0c700170 <cpu_init_crit>:
c700170: e59f0128 ldr r0, [pc, #296] ; c7002a0 <fiq+0x88>
c700174: e3a01000 mov r1, #0 ; 0x0
c700178: e5801000 str r1, [r0]
c70017c: e59f1120 ldr r1, [pc, #288] ; c7002a4 <fiq+0x8c>
c700180: e59f0120 ldr r0, [pc, #288] ; c7002a8 <fiq+0x90>
c700184: e5810000 str r0, [r1]
c700188: e59f111c ldr r1, [pc, #284] ; c7002ac <fiq+0x94>
c70018c: e3a00e32 mov r0, #800 ; 0x320
c700190: e5c10000 strb r0, [r1]
c700194: e3a01776 mov r1, #30932992 ; 0x1d80000
c700198: e59f0110 ldr r0, [pc, #272] ; c7002b0 <fiq+0x98> c70019c: e5810000 str r0, [r1]
c7001a0: e59f110c ldr r1, [pc, #268] ; c7002b4 <fiq+0x9c> c7001a4: e59f010c ldr r0, [pc, #268] ; c7002b8 <fiq+0xa0> c7001a8: e5810000 str r0, [r1]
c7001ac: e59f0108 ldr r0, [pc, #264] ; c7002bc <fiq+0xa4> c7001b0: e3a01101 mov r1, #1073741824 ; 0x40000000
c7001b4: e5801000 str r1, [r0]
c7001b8: e59f0100 ldr r0, [pc, #256] ; c7002c0 <fiq+0xa8> c7001bc: e3a01101 mov r1, #1073741824 ; 0x40000000
c7001c0: e5801000 str r1, [r0]
c7001c4: e1a0f00e mov pc, lr
0c7001c8 <real_vectors>:
c7001c8: eaffffc8 b c7000f0 <reset>
c7001cc: ea000005 b c7001e8 <undefined_instruction>
c7001d0: ea000006 b c7001f0 <software_interrupt>
c7001d4: ea000007 b c7001f8 <prefetch_abort>
c7001d8: ea000008 b c700200 <data_abort>
c7001dc: ea000009 b c700208 <not_used>
c7001e0: ea00000a b c700210 <irq>
c7001e4: ea00000b b c700218 <fiq>
0c7001e8 <undefined_instruction>:
c7001e8: e3a06003 mov r6, #3 ; 0x3
c7001ec: eaffffbf b c7000f0 <reset>
0c7001f0 <software_interrupt>:
c7001f0: e3a06004 mov r6, #4 ; 0x4
c7001f4: eaffffbd b c7000f0 <reset>
0c7001f8 <prefetch_abort>:
c7001f8: e3a06005 mov r6, #5 ; 0x5
c7001fc: eaffffbb b c7000f0 <reset>
0c700200 <data_abort>:
c700200: e3a06006 mov r6, #6 ; 0x6
c700204: eaffffb9 b c7000f0 <reset>
0c700208 <not_used>:
c700208: e3a06007 mov r6, #7 ; 0x7
c70020c: eaffffb7 b c7000f0 <reset>
0c700210 <irq>:
c700210: e3a06008 mov r6, #8 ; 0x8
c700214: eaffffb5 b c7000f0 <reset>
0c700218 <fiq>:
c700218: e3a06009 mov r6, #9 ; 0x9
c70021c: eaffffb3 b c7000f0 <reset>
c700220: 0c000004 stceq 0, cr0, [r0], -#16 c700224: 0c000008 stceq 0, cr0, [r0], -#32 c700228: 0c00000c stceq 0, cr0, [r0], -#48 c70022c: 0c000010 stceq 0, cr0, [r0], -#64 c700230: 0c000018 stceq 0, cr0, [r0], -#96 c700234: 0c00001c stceq 0, cr0, [r0], -#112 c700238: 0c000084 stceq 0, cr0, [r0], -#528 c70023c: 0c000080 stceq 0, cr0, [r0], -#512 c700240: 0c00007c stceq 0, cr0, [r0], -#496 c700244: 0c000078 stceq 0, cr0, [r0], -#480 c700248: 0c000074 stceq 0, cr0, [r0], -#464 c70024c: 0c000070 stceq 0, cr0, [r0], -#448 c700250: 0c00006c stceq 0, cr0, [r0], -#432 c700254: 0c000068 stceq 0, cr0, [r0], -#416 c700258: 0c000064 stceq 0, cr0, [r0], -#400 c70025c: 0c000060 stceq 0, cr0, [r0], -#384 c700260: 0c00005c stceq 0, cr0, [r0], -#368 c700264: 0c000058 stceq 0, cr0, [r0], -#352 c700268: 0c000054 stceq 0, cr0, [r0], -#336 c70026c: 0c000050 stceq 0, cr0, [r0], -#320 c700270: 0c00004c stceq 0, cr0, [r0], -#304 c700274: 0c000048 stceq 0, cr0, [r0], -#288 c700278: 0c000044 stceq 0, cr0, [r0], -#272 c70027c: 0c000040 stceq 0, cr0, [r0], -#256 c700280: 0c00003c stceq 0, cr0, [r0], -#240 c700284: 0c000038 stceq 0, cr0, [r0], -#224 c700288: 0c000034 stceq 0, cr0, [r0], -#208 c70028c: 0c000030 stceq 0, cr0, [r0], -#192 c700290: 0c00002c stceq 0, cr0, [r0], -#176 c700294: 0c000028 stceq 0, cr0, [r0], -#160 c700298: 0c000024 stceq 0, cr0, [r0], -#144 c70029c: 0c000020 stceq 0, cr0, [r0], -#128 c7002a0: 01d30000 biceqs r0, r3, r0
c7002a4: 01e0000c mvneq r0, ip
c7002a8: 03fffeff mvneqs pc, #4080 ; 0xff0 c7002ac: 01d8000c biceqs r0, r8, ip
c7002b0: 00088042 andeq r8, r8, r2, asr #32 c7002b4: 01d80004 biceqs r0, r8, r4
c7002b8: 00007ff8 streqd r7, [r0], -r8
c7002bc: 01f80008 mvneqs r0, r8
c7002c0: 01f80028 mvneqs r0, r8, lsr #32
c7002c4: e1a00000 nop (mov r0,r0)
c7002c8: e1a00000 nop (mov r0,r0)
c7002cc: e1a00000 nop (mov r0,r0)
0c7002d0 <MEMORY_CONFIG>:
c7002d0: 01001102 tsteq r0, r2, lsl #2
c7002d4: 00007ff4 streqd r7, [r0], -r4
c7002d8: 00000a40 andeq r0, r0, r0, asr #20
c7002dc: 000014bc streqh r1, [r0], -ip
c7002e0: 00007ffc streqd r7, [r0], -ip
c7002e4: 00007ffc streqd r7, [r0], -ip
c7002e8: 00000c40 andeq r0, r0, r0, asr #24
c7002ec: 00018004 andeq r8, r1, r4
c7002f0: 00018004 andeq r8, r1, r4
c7002f4: 008c060e addeq r0, ip, lr, lsl #12
c7002f8: 00000010 andeq r0, r0, r0, lsl r0
c7002fc: 00000020 andeq r0, r0, r0, lsr #32
c700300: 00000020 andeq r0, r0, r0, lsr #32
0c700304 <memsetup>:
c700304: e24f003c sub r0, pc, #60 ; 0x3c
c700308: e8903ffe ldmia r0, {r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp} c70030c: e3a00772 mov r0, #29884416 ; 0x1c80000
c700310: e8803ffe stmia r0, {r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp} c700314: e1a0f00e mov pc, lr
0c700318 <mem_malloc_init>:
c700318: e1a0c00d mov ip, sp
c70031c: e92dd800 stmdb sp!, {fp, ip, lr, pc}
c700320: e59f202c ldr r2, [pc, #44] ; c700354 <mem_malloc_init+0x3c>
c700324: e24cb004 sub fp, ip, #4 ; 0x4
c700328: e59f1028 ldr r1, [pc, #40] ; c700358 <mem_malloc_init+0x40>
c70032c: e1a03000 mov r3, r0
c700330: e5823000 str r3, [r2]
c700334: e2832803 add r2, r3, #196608 ; 0x30000
c700338: e5812000 str r2, [r1]
c70033c: e59f1018 ldr r1, [pc, #24] ; c70035c <mem_malloc_init+0x44>
c700340: e0602002 rsb r2, r0, r2
c700344: e5813000 str r3, [r1]
c700348: e3a01000 mov r1, #0 ; 0x0
c70034c: eb003c81 bl c70f558 <memset>
c700350: e91ba800 ldmdb fp, {fp, sp, pc}
c700354: 0c7200c4 ldceql 0, cr0, [r2], -#784
c700358: 0c7200c8 ldceql 0, cr0, [r2], -#800
c70035c: 0c7200cc ldceql 0, cr0, [r2], -#816
0c700360 <sbrk>:。