参考HELPER2416_V2 开发板 LINUX 用户手册,知道可以通过
make smdk2416_config
make
这两条命令编译生成我们所需的u-boot.bin文件,第一条命令make smdk2416_config主要是完成一些配置工作的,那么这条命令具体完成了哪些配置工作呢?
以下参考《嵌入式Linux应用开发完全手册》对这两条命令做一些分析:
首先通过make smdk2416_config 完成配置
由于上面是从u-boot更目录下make的,所以找到u-boot更目录下的makefile文件,在文件中搜索关键字“smdk2416_config”定位到以下代码
再继续找到MKCONFIG的原形
由于是在个根目录下便编译的,则MKCONFIG就是根目录下的mkconfig文件,实际上就是一个脚本文件。那么当我们执行make smdk2416_config这条命令的时候,实际执行的就是下面这条命令:
./mkconfig smdk2416 arm s3c24xx smdk2416 samsuny s3c2416
$0 $1 $2 $3 $4 $5 $6
($0~$6是脚本的参数 ,先对应写出来,等下方便阅读。)
打开u-boot根目录下的mkconfig脚本文件,在第六行可以看到他的使用方法:
接着看看mkconfig这个脚本完成的工作。
1:确定开发板名称BOARD_NAME
while循环由于条件不成立,什么事都没干。执行到23行就有BOARD_NAME = smdk2416了,
2:创建到平台/开发板相关的头文件链接
由于33行的条件并不满足,所以直接执行else分支的代码:先进入到include目录下,然后删除asm文件,最后把再次建立asm并链接到 asm-arm目录。
接着
先删除asm-arm/arch目录,由于$6 =s3c2416,所以执行else分支,并且LNPREFIX为空,所以56行实际执行的就是“ln –s arch-s3c2416 asm-arm/arch”.
然后$3 = s3c24xx成立,执行这段代码
删除inlude目录下的regs.h文件,重新建立regs.h文件并链接到s3c2416.h文件,然后蛋疼了,又执行了一遍 rm –f asm-arm/arch…
继续往下看
条件成立,重新建立asm-arm/proc文件,并让它链接到proc-armv目录。
3:创建顶层Makefile包含的文件include/config.mk
很显然,创建的config.mk文件内容如下
ARCH = arm
CPU = s3c24xx
BOARD = smdk2416
VENDOR = samsuny
SOC = s3c2416
4:创建开发板相关头文件include/config.h
APPEND维持原值“no”,所以config.h被重新建立,它的内容如下:
/*Automatically generated - do not edit */
#include
从这里可以看出,如果要在board目录下新建一个开发板的目录,则在include/configs目录下也要建立一个文件.h,里面存放的就是开发板的配置信息
到这里make smdk2416_config的工作就全部完成了,总结一下就是完成了一下四项工作:
1:确定开发板名称BOARD_NAME
2:创建到平台/开发板相关的头文件链接
3:创建顶层Makefile包含的文件include/config.mk
4:创建开发板相关头文件include/config.h
接下来就是通过make 或者 make all 编译了
配置完后,执行”make all ”即可编译,还是从顶层Makefile文件开始分析。
首先
条件成立,包含了由上配置过程生成的include/config.mk文件,获得ARCH CPU BOARD VENDORSOC的信息,这几个值依次为arm s3c24xx smdk2416 samsuny s3c2416
接着根据上面ARCH变量的值确定编译器,之后包含顶层目录下的config.mk文件,通过上面5个变量的值进一步确定编译选项等。
顶层目录下config.mk文件部分内容如下所示
其中BOARDDIR 、LDFLAGS的值在接下来的Makefile分析中很重要。
在board/samsuny/smdk2416/config.mk中定义了” TEXT_BASE = 0xc3e00000”,那么具体的有:
BOARDDIR= samsuny/smdk2416
LDFLAGS中有“-T board/samsuny/smdk2416/u-boot.lds –Ttext0xc3e00000”。
继续来看Makefile文件
从187行得知,OBJS的第一个值为“cpu/$(CPU)/start.o”,即”cpu/s3c24xx/start.o”
接下来从201行开始指定了LIBS变量就平台/开发板相关的各个目录、通用目录下的库。
OBJS、LIBS所代表的.o、.a文件就是u-boot的构成,它们通过如下的命令由相应的源文件编译得到。
生成所有的.o、.a文件之后剩下的就是最后的连接了,对应了Makefile文件中的如下几行:
先由第320~325的规则得到elf格式的u-boot文件,最后转换为二进制文件格式u-boot.bin文件等。其中在根目录写的config.mk文件中定义的LDFLAGS确定了连接方式,其中的“-Tboard/samsuny/smdk2416/u-boot.lds –Ttext 0xc3e00000”指定了程序的布局、地址。
如下u-boot.lds的内容所示:
从上图可以知道 cpu/s3c24xx/start.o 被放在程序的最前面,所以整个u-boot的入口就在cpu/s3c24xx/start.o中,这样接下来u-boot的流程分析就可以从start.s 开始了。
最后总结下u-boot的编译流程。
1:首先编译cpu/$(CPU)/start.S
2:然后,对于平台/开发板相关的每个目录、每个通用目录都使用他们各自的Makefile生成相应的库、
3:将1、2步生成的.o、.a文件按照board/$(BOARDDIR)/config.mk文件中指定的代码段起始地址、board/$(BOARDDIR)/u-boot.lds连接进行连接。
4:第3步得到的是ELF格式的u-boot,后面Makefile还会将它转换为二进制格式。
下一步试着去分析u-boot源码!
论坛ID:yuanlai2010
发表时间:2014-07-27