1_5.1.2_U-boot分析与使用_u-boot分析之Makefile结构分析_P

我们分析一个文件的时候,最好的方式就是看它的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/type.h>,那么在arm架构下就应该调用asm-arm文件夹下的type.h文件,在i386架构下就应该调用asm-i386文件夹下的type.h文件,使用不同架构的MCU,需要调用不同架构的文件。使用这样的软连接,就可以很方便的编译不同架构的文件。

接下来,删除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,我们可以知道:

  1. 第一个编译的文件:cpu/arm920t/start.S
  2. 链接脚本:/home/book/Desktop/test/042_uboot_test/u-boot-1.1.6/board/100ask24x0/u-boot.lds
  3. 链接地址:0x0+0x33f80000

这个0x33f80000怎么来的呢?可以通过greo “0x33F80000” * -nR来查找一下。

可以看到,这个值是根据TEXT_BASE这个变量来的,这个变量的设置是在board/100ask24xc/config.mk文件的25行定义的。
在这里插入图片描述

查看一下LDFLAGS,grep “LDFLAG” * -nR,出来很多信息,从上往下看。
在这里插入图片描述
可以看到是在config.mk文件的189行定义的,与之前的调试信息也吻合起来。
在这里插入图片描述
board/100ask24c0/config.mk被包含进来,这个文件里面定义了TEXT_BASE为0x33f80000。如果你想让u-boot改变位置,那么修改这个文件里面的TEXT_BASE变量就可以了。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值