u-boot分析之顶层Makefile、mkconfig结构分析

本文详细介绍了U-boot在全志A33平台上的代码分析,包括Bootloader的概念、顶层Makefile和mkconfig的结构及作用。通过分析Makefile的配置参数和mkconfig脚本,展示了如何构建和配置U-boot,并解释了编译过程中涉及的依赖关系和链接过程。
摘要由CSDN通过智能技术生成

本章uboot代码分析是基于全志A33平台,uboot代码版本是U-boot-2011.09。

Bootloader概念介绍:
在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000(视CPU而定)处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。
对应的示意图如下:
这里写图片描述


代码分析:
拿到uboot代码的第一我们可以使用指令来编译一下试试看,我分析的代码是基于全志A33平台的,编译代码指令如下:

make sun8iw5p1
make 

这个过程主要涉及到两个文件,顶层的Makefile文件和mkconfig文件,mkconfig文件是一个脚本,通过文件的注释可以了解到它的作用。

# Script to create header files and links to configure
# U-Boot for a specific board.
#
# Parameters:  Target  Architecture  CPU  Board [VENDOR] [SOC]

要了解整个程序的框架我们要从解析Makefile开始,打开根目录下的Makefile文件。

一般根目录下的Makefile会有很多个配置文件项,他们一般有如下参数:

Target    ARCH     CPU      Board name       Vendor      SoC      Options

这些参数会指名芯片的一些信息,uboot根据这些信息来编译生成目标,但是上面的这款芯片(sun8iw5p1)我没有在Makefile里面找到相关的目标定义,不过在Makefile看下来可以找到这样的一段代码:

sinclude $(obj).boards.depend
$(obj).boards.depend:  boards.cfg
    awk '(NF && $$1 !~ /^#/) { print $$1 ": " $$1 "_config; $$(MAKE)" }' $< > $@

一般obj为空,因此有一个隐藏文件 .boiards.depend
我们可以从根目录.boiards.depend里面找到下面这一句代码

sun8iw5p1: sun8iw5p1_config; $(MAKE)

执行的时候sun8iw5p1目标就是这里来的
上面那一句的意思如下:

$< >是输入文件(boards.cfg),$@是目标本身(.boards.depend) ,如果文件中某行不为空,第一个元素不为‘~’和‘#’就将其以print 
{ print $$1 ": " $$1 "_config; $$(MAKE)" }
" $$1 "_config; $$(MAKE)"的格式输出到文件$@中,最终生成的.boards.depend

也可以通过在uboot目录命令行执行下面语句得到这个.boards.depend

awk '(NF && $$1 !~ /^#/) { print $$1 ": " $$1 "_config; $$(MAKE)" }' boards.cfg  >.boards.depend

接着来看其中的意思:

sun8iw5p1:sun8iw5p1_config; $$(MAKE)
意思如下:
sun8iw5p1 依赖于 sun8iw5p1_config
$$(MAKE)的意思就是make
如果放在一行需要加个分号。换行的$(MAKE)用tab开头

所以整句的意思就是先构建 sun8iw5p1_config 随后执行 make

sun8iw5p1: sun8iw5p1_config; $$(MAKE)== make sun8iw5p1_config&&make

接着在Makefile里面可以看下下面的几行代码:

%_config::  unconfig
    @$(MKCONFIG) -A $(@:_config=)

%在Makefile中作为通配符用来通配任意长度的字符,因此当我们执行 make sun8iw5p1_config的时候就会匹配到%_config这条语句。::在Makefile中用来强制执行下面的命令,所以匹配到%_config之后,就会去执行 unconfig

unconfig:
    @rm -f $(obj)include/config.h $(obj)include/config.mk \
        $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \
        $(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep

unconfig的作用是去除原来的配置信息。然后去执行下面这条:

@$(MKCONFIG) -A $(@:_config=)

这条命令,@的作用是用来去除回显, $(MKCONFIG) 在前面被定义为

MKCONFIG    := $(SRCTREE)/mkconfig

这里可以试着将上面 MKCONFIG 前面的 @ 去掉,然后执行make sun8iw5p1_config,可以通过回显看到以下内容:

/……/u-boot-2011.09/mkconfig –A sun8iw5p1
Configuring for sun8iw5p1 board…

所以我们执行make sun8iw5p1 _config实际上被解析成:

/……/u-boot-2011.09/mkconfig –
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值