uboot移植详解
g.mk))#config.mk存在
all:
sinclude$(obj)include/autoconf.mk.dep
sinclude$(obj)include/autoconf.mk
……
else #config.mk不存在
……
@echo"Systemnotconfigured-seeREADME">&2
@exit1
……
endif #config.mk
若include/config.mk文件存在,则$(wildcard$(obj)include/config.mk)命令执行的结果是“$(obj)include/config.mk”展开的字符串,否则结果为空。由于include/config.mk是“make
117 include$(obj)include/config.mk
118 export ARCHCPUBOARDVENDORSOC
119
127 ifeq($(HOSTARCH),arm)
128 CROSS_COMPILE=arm-linux-
127 endif
163 #loadotherconfiguration
164 include$(TOPDIR)/config.mk
第117和164行用于包含其他的config.mk文件,第117行所包含的文件就是在上面的配置过程中制造出来的include/config.mk文件,其中定义了ARCH、CPU、BOARD、SOC等4个变量的值为arm、arm920t、TX2440、s3c24x0。第164行包含顶层的config.mk文件,它根据上面4个变量的值确定了编译器、编译选项。其中对我们理解编译过程有帮助的是BOARDDIR、LDFLAGS的值
#U-Bootobjects....orderisimportant(i.e.startmustbefirst)
169 OBJS=cpu/$(CPU)/start.o
LIBS+=cpu/$(CPU)/lib$(CPU).a
ifdefSOC
LIBS+=cpu/$(CPU)/$(SOC)/lib$(SOC).a
endif
ifeq($(CPU),ixp)
LIBS+=cpu/ixp/npe/libnpe.a
endif
LIBS+=lib_$(ARCH)/lib$(ARCH).a
LIBS+=fs/cramfs/libcramfs.afs/fat/libfat.afs/fdos/libfdos.afs/jffs2/libjffs2.a\
fs/reiserfs/libreiserfs.afs/ext2/libext2fs.afs/yaffs2/libyaffs2.a\
fs/ubifs/libubifs.a
……
LIBS+=common/libcommon.a
LIBS+=libfdt/libfdt.a
LIBS+=api/libapi.a
LIBS+=post/libpost.a
LIBS:=$(addprefix$(obj),$(LIBS))
LIBS变量指明了U-Boot需要的库文件,包括平台/开发板相关的目录、通用目录下相应的库,都通过相应的子目录编译得到的。
OBJS、LIBS所代表的.o、.a文件就是U-Boot的构成,他们通过如下命令由相应的源文件或相应的子目录下的文件编译得到
268 $(OBJS):
269 $(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@))
271 $(LIBS):
272 $(MAKE) -C $(dir $(subst $(obj),,$@))
274 $(SUBDIRS):
275$(MAKE) -C $@ all
第268、269两行的规则表示,对于OBJS中的每个成员,都将进入cpu/$(cpu)目录编译他们。现在OBJS为cpu/arm920t/start.o,它将由cpu/arm920t/start.s编译得到。第271、272两行规则表示,对于LIBS中的每个成员,都将进入相应的子目录执行“make”命令。这些子目录中的Makefile,结构相似,他们将Makefile中指定的文件编译、链接成一个库文件。
当所有的OBJS、LIBS所表示的.o、.a文件都生成后就剩下链接了,这对用Makefile中如下代码
245 $(obj)u-boot.srec:$(obj)u-boot
246 $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@
248 $(obj)u-boot.bin:$(obj)u-boot
249$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
251 $(obj)u-boot.img:$(obj)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 $(VERSION_FILE) | \
sed -e s/"[ ]*$$/ for $(BOARD) board"/) \
-d $< $@
263 $(obj)u-boot.dis:$(obj)u-boot
254 $(OBJDUMP) -d $< > $@
265 $(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) \
266 --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
267 -Map u-boot.map -o u-boot
263到267的规则链接到ELF格式的U-Boot,最后转换为二进制格式的U-Boot.bin、S-Record格式的U-Boot.srec。LDFLAGS确定了连接的方式。(前面有提到)。
分析完这些对移植的整体轮廓应该有了一个认识,了解其原理了。具体要修改什么就要根据实际需要了。
uboot移植详 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)