嵌入式linux驱动之路15:U-Boot 顶层 Makefile

学会 uboot 使用以后就可以尝试移植 uboot 到自己的开发板上了,但是在移植之前需要我们得先分析一遍 uboot的启动流程源码,得捋一下 uboot 的启动流程,否则移植的时候都不知道该修改那些文件.

uboot 文件

编译后的 uboot 源码文件:
在这里插入图片描述
在这里插入图片描述
1.顶层 Makefile 文件
Makefile 是支持嵌套的,也就是顶层 Makefile 可以调用子目录中的 Makefile 文件。一般大项目里面所有的源代码都不会放到同一个目录中,各个功能模块的源代码都是分开的,各自存放在各自的目录中。每个功能模块目录下都有一个 Makefile,这个 Makefile 只处理本模块的编译链接工作。
2…u-boot.xxx_cmd 文件
文件u-boot.cmd 使用到了 arm-linux-gnueabihf-ld.bfd,也就是链接工具,使用 ld.bfd 将各个 built-in.o 文件链接在一起就形成了 u-boot 文件。uboot 在编译的时候会将同一个目录中的所有.c 文件都编译在一起,并命名为 built-in.o,相当于将众多的.c 文件对应的.o 文件集合在一起,这个就是 u-boot 文件的来源。
文 件 .u-boot-nodtb.bin.cmd 就 是 用 于 生 成 uboot.nodtb.bin 的,用到了 arm-linux-gnueabihf-objcopy,使用 objcopy 将 ELF 格式的 u-boot 文件转换为二进制的 u-boot-nodtb.bin 文件。
cmd_u-boot.bin,此变量的值为“cp u-boot-nodtb.bin
u-boot.bin”,也就是拷贝一份 u-boot-nodtb.bin 文件,并且重命名为 u-boot.bin,这个就是 u-boot.bin的来源。
u-boot.imx 是在 u-boot.bin 文件的头部添加了 IVT、DCD 等信息。这个工作是由文件.u-boot.imx.cmd 来完成的工具 mkimage 就是读取文件 imximage-ddr512.cfg.cfgtmp 里面的信息,然后将其添加到文件 u-boot.bin 的头部,最终生成 u-boot.imx。
3.、.config 文件
uboot 配置文件,使用命令“make xxx_defconfig”配置 uboot 以后就会自动生成。.config 文件中都是以“CONFIG_”开始的配置项,这些配置项就是 Makefile 中的变量,因此后面都跟有相应的值,uboot 的顶层 Makefile 或子 Makefile 会调用这些变量值。在.config 中会有大量的变量值为‘y’,这些为‘y’的变量一般用于控制某项功能是否使能。

顶层 Makefile 分析

如果我们想其它的目录从 VSCode 中给屏蔽掉使用"search.exclude"里面是需要在搜索结果中排除的文件或者文件夹,"files.exclude"是左侧工程目录中需要排除的文件或者文件夹。
工程在编译的时候其主目录中的 Makefile 就可以调用子目录中的 Makefile,以此来完成所有子目录的编译。主目录的 Makefile 可以使用如下代码来编译这个子目录:
$(MAKE) -C subdir
$(MAKE)就是调用“make”命令,-C 指定子目录。有时候我们需要向子 make 传递变量,这个时候使用“export”来导出要传递给子 make 的变量即可。
uboot 可以将编译出来的目标文件输出到单独的目录中,在 make 的时候使用“O”来指定输出目录,比如“make O=out”就是设置目标文件输出到 out 目录中。
顶层 Makefile
1.一开始是版本号
2.MAKEFLAGS 变量
3.命令输出:短命令与长命令
4.静默输出,使用“make -s”编译的时候,“-s”会作为 MAKEFLAGS 变量的一部分传递给 Makefile。
5.uboot 可以将编译出来的目标文件输出到单独的目录中,在 make 的时候使用“O”来指定输出目录,比如“make O=out”就是设置目标文件输出到 out 目录中。
6.uboot 支持代码检查,使用命令“make C=1”使能代码检查
7.模块编译,在 uboot 中允许单独编译某个模块,使用命令“ make M=dir”即可。
8.获取主机架构和系统
9.设置目标架构、交叉编译器和配置文件
10.调用 scripts/Kbuild.include,在 uboot 的编译过程中会用到 scripts/Kbuild.include 中的这些变量
11.交叉编译工具变量设置上面我们只是设置了 CROSS_COMPILE 的名字,设置交叉编译器其他的工具
12.在顶层 Makefile 会导出很多变量
13.make xxx_defconfig 过程,“ make xxx_defconfig“配置 uboot 的时候如下两行命令会执行脚本scripts/Makefile.build:
@make -f ./scripts/Makefile.build obj=scripts/basic
scripts_basic 目标对应的命令
@make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig
%config 目标对应的命令
14. scripts_basic 目标的作用就是编译出 scripts/basic/fixdep 这个软件。__build 是默认目标,因为命令“@make -f ./scripts/Makefile.build obj=scripts/basic”没有指定目标,所以会使用到默认目标: __build。__build 最终为:
__build: scripts/basic/fixdep
@:
__build 依赖于 scripts/basic/fixdep,所以要先 scripts/basic/fixdep.c 编译,生成 fixdep,scripts_basic 目标的作用就是编译出 scripts/basic/fixdep 这个软件。
%config目标将其展开就是:
@ scripts/kconfig/conf --defconfig=arch/…/configs/xxx_defconfig Kconfig
1
上述命令用到了 xxx_defconfig 文件,比如 mx6ull_alientek_emmc_defconfig。这里会将mx6ull_alientek_emmc_defconfig 中的配置输出到.config 文件中,最终生成 uboot 根目录下的.config 文件。

15.make 过程
默认目标_all 依赖于 all, all 目标依赖$(ALL-y),ALL-y 里面有个 u-boot.bin,这个就是我们最终需要的 uboot 二进制可执行文件,u-boot.bin 依赖于 u-boot-nodtb.bin,目标 u-boot-nodtb.bin 又依赖于 u-boot,目标 u-boot 依赖于 u-boot_init、 u-boot-main 和 u-boot.lds
u-boot-init= arch/arm/cpu/armv7/start.o
$(libs-y)在顶层 Makefile 中被定义为 uboot 所有子目录下 build-in.o 的集合
以u-boot.lds 为链接脚本,将 arch/arm/cpu/armv7/start.o 和各个子目录下的 built-in.o 链接在一起生成 u-boot。
各子目录下的 built-in.o 是怎么生成的,以 drivers/gpio/built-in.o 为例,在drivers/gpio/目录下会有个名为.built-in.o.cmd 的文件,此文件内容如下:

cmd_drivers/gpio/built-in.o := arm-linux-gnueabihf-ld.bfd -r -o drivers/gpio/built-in.o drivers/gpio/mxc_gpio.o
从命令“cmd_drivers/gpio/built-in.o”可以看出, drivers/gpio/built-in.o 这个文件是使用 ld 命令由文件 drivers/gpio/mxc_gpio.o 生成而来的, mxc_gpio.o 是 mxc_gpio.c 编译生成的.o 文件,这个是 NXP 的 I.MX 系列的 GPIO 驱动文件。这里用到了 ld 的“-r”参数,参数含义如下:-r –relocateable: 产生可重定向的输出,比如,产生一个输出文件它可再次作为‘ld’ 的输入,这经常被叫做“部分链接”,当我们需要将几个小的.o 文件链接成为一个.o 文件的时候,需要使用此选项。
最终将各个子目录中的 built-in.o 文件链接在一起就形成了 u-boot。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值