前面的文章说到,编写Makefile文件的常用语句以及相应的语法,但也提到了MKCONFIG去控制Makefile文件的变量实现条件编译,在MKCONFIG过程中,常用的变量配置有例如架构配置、交叉编译工具链配置等,这些选项要么你去通过改写Makefile文件实现条件编译,要么在Makefile配置过程中,去实现对其参数的改变,不然的话,其会使用默认参数进行编译,既不符合你的架构要求又不符合你的交叉编译工具链版本,报一堆错告诉你编译不下去或者移植过程中启动失败,下面将以X210平台对一些常用的MKCONFIG变量参数进行说明。
不得不说的是,对于Makefile的配置,再怎么样也要对着文件里面的选项进行查看,网上去搜素一些主流的用于学习的平台,相关的配置方法都有,这些配置方法都是根据文件的选项进行配置的。
ARCH是架构选项,根据文件可用对你所使用的平台进行选择,具体要看两个方面,其一是平台的处理器使用的架构是什么,就不管其他架构,就arm架构就能分出armv6 v7什么的,再一点是要看该Makefile文件在ARCH选项中是否包含有你所要移植的这个架构的选项,如果二者都有那么皆大欢喜,因为一个主流的内核或者驱动都会对常用的架构或者芯片进行相应的配置,也就是直接写好了参数,如果没有的话就有点麻烦,可能要一步一步试着来配置了。
而且一般帮你配置好的参数,只是针对到该芯片的一般情况,而没有精确到对开发板级别的配置,所以有些地方还要自己去进行修改,不多。
CROSS_COMPILE是交叉编译工具链,需要绑定工具链的前缀,代表了后续将要使用到编译器的版本,只绑定前缀的原因是后面的内容是不一样的如-ar、-gcc、-g++等等,这些参数会在编译时自行匹配。
该参数一般可在make时直接make CROSS_COMPILE=xxx进行配置,如果在系统中已经导出了符号链接,那么可直接写作make CROSS_COMPILE=arm-linux- 具体情况还要看你导出的符号链接怎么写的。
x210_sd_config: unconfig
@$(MKCONFIG) $(@:_config) arm S5PC11X X210 Samsung S5pc110
来分析一下这段代码,$(@:_config)的意思是将$@代表的X210_sd_config的_config部分用空来代替,得到X210_sd。$1为参数X120_sd,$2为arm,$3为S5PC11X,$4为X210,$5为samsung,$6为S5PC110。这些参数将会成为Makefile的默认配置参数。通过Makefile去配置出config.h文件(X210_sd.h).
通过X210_sd.h文件可生成autoconfig.mk文件,该文件将会被Makefile引入,其本质就是一些宏,通过这些配置实现可移植性。在整个uboot中配置通过字符串匹配,所以在移植时较为严谨,需严格区分大小写。
这里提到了uboot就不得不说一下程序的入口到底是哪里——ENTRY(_start)这就是整个程序的入口地址,_start是汇编的起始位置。
指定程序链接地址的方法:(1)在Makefile中使用-Ttext指定位置。(2)在链接脚本中用.=0x......指定,当二者均存在时,以Makefile中以-Ttext的链接地址为准。
既然说到了链接脚本也就将其常用的一些参数进行说明吧。
.=ALIGN(4) 表示4字节对齐
.text 代码段标识
.rodata 只读数据段
.data 一般数据段
.bss bss段 存放未初始化的全局变量
在X210中,.text代码段最开始的16k会存放开机必须使用到的代码,后面才放其他代码。
指明那些代码因在前16k,那些代码应在16k之后。
使用链接脚本支持自定义段(编译器支持)。
启动校验头,常用于镜像文件需要的16字节校验头,对于X210的uboot文件而言如下所示:
#if define(CONFIG_EVTI) && !define(CONFIG_FUSED)
.word 0x2000
.word 0x0
.word 0x0
.word 0x0
#endif
这是一段汇编的伪指令,定义了4个字节的值,地址在#if开始位置。
对于X210而言,16字节校验头在usb启动是用不上的,其只在SD卡启动时在MKV210image.c
中会在镜像的头部进行添加,uboot中在start.S的开头占了16字节的位置,就是为了以后改写做准备(计算校验和sd_fusong中)。img=16+后面的内容,但这16字节不参与校验,校验和放在buf+8的位置。
文章写到这里其实已经讲到了开发板的启动过程了,所以先在这里断开,后面的内容将会续写汇编部分的内容,放到下一章继续。