我们分析一个文件的时候,最好的方式就是看它的makefile。
之前体验编译uboot时,我们第一步是配置uboot,第二步是编译。
分析配置uboot指令
配置uboot使用的指令是make 100ask24x0_config。
首先找到Makefile,用vim打开,查找100ask24x0_config,定位如下:
那么make 100ask24x0_config其实就是执行@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0指令,下面分析这条指令。
最左边的@符号表示执行该命令时不在终端显示该命令,然后是一个变量MKCONFIG,查找该变量的定义,可以看到该变量指向的是当前目录下的mkconfig文件。(CURDIR变量是makefile的内嵌变量,表示的是当前目录)
然后$(@:_config=)中@符号表示的是目标文件,(@:_config=)就是将目标文件名中的_config替换为空,这里就是将100askx0_config替换为100ask24x0。
所以@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0指令其实就是
@./mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0。
下面解析@mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0指令。
打开mkconfig 文件,从上往下开始分析。
其中"$ #“表示的是所有参数的个数(PS:”$ @"表示所有参数),-gt是大于0的意思(greater than),所以这个while循环的意思是,如果参数个数大于0,那么执行do,如果第一个变量符合哪个格式,那么执行相应的操作,这里的$1是100ask24x0,所以直接break不执行任何操作,直接退出。
-gt是大于的意思(greater than)。
-eq是等于的意思(equal)。
-ne是不等于的意思(no equal)。
-ge是大于等于的意思(greater equal)。
-lt是小于的意思(less than)。
-le是小于等于的意思(less equal)。
这条指令的指令流程是先左边,如果左边成立就不执行后面的操作。
在文件的开始有将BOARD_NAME设为"",所以这里会执行后面那个操作,将BOARD_NAME设为$1,也就是100ask24x0。
所以执行完这条指令,BOARD_NAME = “100ask24x0”。
然后判断参数的个数是否小于4,如果小于则退出,大于6的话也退出。
然后在中断上输出一个信息。
判断SRCTREE和OBJTREE是否相等。
查看Makefile,SRCTREE为当前目录。
如果BUILD_DIR定义了的话,那么OBJTREE等于 $ (BUILD_DIR),否则等于 $ (CURDIR)。
查看BUILD_DIR,没有定义o,所以BUILD_DIR也没有定义,那么OBJTREE也为当前目录。
所以SRCTREE == OBJTREE,那么执行else的操作。切换到当前目录下的include文件夹,删除asm文件夹,将asm-arm链接为asm,也就是以后执行asm,就替换为执行asm-arm。(ln是链接指令,-s表示建立符号链接,这是一种软连接,类似windows系统下的快捷方式,命令格式为ln -s 源文件名称 软链接文件名称)
为什么要这样链接呢?这是因为编译不同架构的MCU时,使用的asm是不同的。
比如有这样一行指令#include 接下来,删除asm-arm/arch文件夹。 然后,-z表示长度为0则为真,也就是字符串为空时为真,这里$6为s3c24x0,所以执行else的操作。 查看makefile,LNPREFIX为空,所以 ln -s ${LNPREFIX}arch-$6 asm-$2/arch 就是 ln -s arch-s3c24x0 asm-arm/arch。 也就是建立一个链接,将asm-arm/arch指向了arch-s3c24x0 。 接下来类似,$2 = arm,所以删除asm-arm/proc文件夹,建立一个asm-arm/proc到proc-armv的链接。 然后建立一个config.mk文件,文件第一行是ARCH = arm,第二行是CPU = arm920t,第三行是BOARD = 100ask24x0,第四行是SOC = s3c24x0。 其中,>表示建立一个文件,>>表示在这个文件的末尾加上某些信息。 APPEND 默认是no,所以就创建一个config.h文件,在里面添加相关两行。 可以看出,配置的主要操作是设置相关变量并将需要的文件包含进来。 分析编译uboot指令 编译uboot使用的指令是:make 打开makefile,从上往下看,可以看到包含了make 100ask24x0_config生成的config.mk文件,通过这条代码就将两条指令链接起来了。 然后包含了cpu/arm920t/start.o文件,该文件是由start.S文件编译生成的,将该文件传回本地,分析源码时会用上。注意注释中的说明,obj文件的顺序不可以随意改动,并且一定要将start文件放在最前面。 再往下看可以发现有很多.a文件,.a文件是静态库文件,这些库文件都是编译好了被打包成库,然后编译的时候调用。 LIBS += board/( B O A R D D I R ) / l i b (BOARDDIR)/lib(BOARDDIR)/lib(BOARD).a就是LIBS += board/100ask24x0/lib100ask24x0.a。 LIBS += cpu/( C P U ) / l i b (CPU)/lib(CPU)/lib(CPU).a就是LIBS += cpu/arm920t/libarm920t.a。 然后是all,当我们使用make指令不添加任何参数时,makefile就会将文件中的第一个目标当做参数,一般就是all。这里我们主要是要生成u-boot.bin文件。 u-boot.bin则依赖于u-boot,这里的u-boot是elf格式的,目标的u-boot则是二进制的。 可以看到u-boot依赖于许多文件。可以直接展开来分析该语句,也可以执行make指令,在编译的最后面应该有这些指令的展开。 可以看到,在编译的最后有如下的展开。 通过这个指令,可以看到makefile指定的链接脚本,使用的代码段的基地址,以及生成的u-boot的文件位置分布,处在最前面的应该是start.o文件。 打开u-boot.lds链接脚本,之后分析u-boot就从start.S入手,这是一个汇编文件。 分析编译过程:make,我们可以知道: 第一个编译的文件:cpu/arm920t/start.S 链接脚本:/home/book/Desktop/test/042_uboot_test/u-boot-1.1.6/board/100ask24x0/u-boot.lds 链接地址:0x0+0x33f80000 这个0x33f80000怎么来的呢?可以通过greo “0x33F80000” * -nR来查找一下。 可以看到,这个值是根据TEXT_BASE这个变量来的,这个变量的设置是在board/100ask24xc/config.mk文件的25行定义的。 个变量来的,这个变量的设置是在board/100ask24xc/config.mk文件的25行定义的。 查看一下LDFLAGS,grep “LDFLAG” * -nR,出来很多信息,从上往下看。 可以看到是在config.mk文件的189行定义的,与之前的调试信息也吻合起来。 board/100ask24c0/config.mk被包含进来,这个文件里面定义了TEXT_BASE为0x33f80000。如果你想让u-boot改变位置,那么修改这个文件里面的TEXT_BASE变量就可以了。
上一篇:1_5.1.1_U-boot分析与使用_u-boot分析之编译体验_P
下一篇:1_5.1.3_U-boot分析与使用_u-boot分析之源码第1阶段_P
推荐阅读最新更新时间:2024-11-23 12:29