近三个礼拜,一直在读u-boot的源代码,网上有关u-boot移植的文档不少,但对u-boot框架进行深入分析的指导文档基本上没有,u-boot官方网站也只提供了面向用户的使用参考手册,下面,我就结合自己阅读代码的实践,来写些面向开发人员的参考文档吧。
我手头的项目是基于ARM9的,所以我具体的分析过程就放在ARM9代码树上。
1. 粗读代码
首先,凭经验结合调试器,对从系统上电到u-boot启动完成整个过程做了一次跟踪,了解u-boot执行的大致路线:
u-boot-1.1.4/cpu/arm920t/start.S:首先初始化CPU、内存、异常/中断向量表等;
u-boot-1.1.4/lib_arm/board.c:重新初始化主频和外设;
u-boot-1.1.4/common/main.c:启动shell。
有 了这些初步了解,接下来就按次序,将这几个关键文件以及里面的函数扫一遍;再接下来,结合分析Makefile文件,了解它是怎样实现多平台配置的;到 此,对u-boot 基本就有个完整的概貌了。下一步可以进入深入阅读阶段,至上而下或至下而上阅读都可以,重点是理解掌握那些靠近底层的抽象数据结构,它们是整个上层应用的 基础,其实不外乎是一些链表及对它们进行各种操作的函数。
2. 分析Makefile
从上面的描述可知,其实我最先看的并不是Makefile,但从逻辑上来说,它是系统最基本的框架,所以还是放在前面来分析。
2.1 u-boot-1.1.4/Makefile
它负责配置u-boot的编译方式,具体说来包括:使用何种指令集,需包含哪些接口驱动、库等。
Makefile的内容从上到下分别是:分定义编译环境:使用何种编译器、编译方式、目标文件的生成及它们最终镜像中的链接次序等。下面对Makefile代码作注:
2.2 u-boot-1.1.4/mkconfig
它根据Makefile是相关的板卡定义,生成config.mk文件,即make xxx_config实际上就是调用它完成的。
注意一下u-boot对板卡的分类方法:
Target:宿主机平台
Architecture:定义芯片架构(如MIPS、POWERPC、ARM等)
CPU:定义芯片指令集版本(如ARM7、ARM9、ARM11等)
Board:芯片厂商,它细分为两类
[VENDOR]:按厂商划分(如AT9200、S3C44B0等)
[SOC]:按SOC类型(如S3C2440、S3C2410等)
2.3 u-boot-1.14/config.mk
应 该说这才是真正的Makefile,以上介绍的两个脚本完成了环境配置之后,在该文件中才定义具本的编译规则,所以你会发现在各个子模块(board、 cpu、lib_xxx、net、disk...)目录中的Makefile第一句就是:include $(TOPDIR)/config.mk
3. 小结
根据上面的分析,可以清晰的
附:对u-boot-1.1.4/Makefile文件的简单注释
#检查宿主机环境
HOSTARCH := $(shell uname -m | \
sed -e s/i.86/i386/ \
-e s/sun4u/sparc64/ \
......
#如果include/config.mk文件已存在,就从里面获取目标板构架信息,
#否则就要执行make xxx_config来生成该文件
ifeq (include/config.mk,$(wildcard include/config.mk))
# load ARCH, BOARD, and CPU configuration
include include/config.mk
......
#定义交叉编译器
ifndef CROSS_COMPILE
ifeq ($(HOSTARCH),ppc)
CROSS_COMPILE =
......
# 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
......
#最后是针对类板卡的生成特定的配置文件,实现不同的编译方案。
#========================================================================
# PowerPC
#========================================================================
#########################################################################
## MPC5xx Systems
#########################################################################
canmb_config: unconfig
@./mkconfig -a canmb ppc mpc5xxx canmb
cmi_mpc5xx_config: unconfig
......
The End.
附:
当你的GNU Make从3.80升级到3.81时,会遇到“*** No rule to make target `xxxxxx'......”类似提示而无法完成编译,只需将该目标文件所在的目录中的Makefile时间更新一下,重新编译即可。
阅读(1854) | 评论(0) | 转发(0) |