从cyclone v spl程序说uboot镜像生成过程

    上篇文章分析了uboot在进行编译preloader与uboot时的总体过程,主要是配置过程所做的勾当。这里将以spl程序生成为例分析一下镜像生成那些事。追踪这个过程还是需要从makefile入手,跟踪一下它做的工作。


再进入uboot顶层makefile,可以找到该目标:


这个依赖与depend,在执行完depend后,会进入spl目录,执行make all。

1)depend依赖

那个这个镜像生成需要的第一个依赖就是depend,对于SUBDIR_TOOLS这里忽略.


从上面可以看到执行depend,会进入各个目录及子目录,执行_depend,生成各子目录下面的.depend文件。该文件列出了每个目标文件所依赖的文件,board/altera/socfpgag下面的.depend文件内容如图所示:


2)、ALL-y依赖


从上面可知ALL-y由固定的u-boot.srec u-boot.bin System.map.u-boot.srec,u-boot为motorola S-record格式,u-boot.bin为烧到板子上可以直接运行的程序,System.map为u-boot的符号表,u-boot为elf格式。在spl的makefile中有

CONFIG_SPL_BUILD := y

export CONFIG_SPL_BUILD

故此次ALL-y还包括了u-boot-spl.bin


从u-boot中可知,要生成u-boot,需要执行7个依赖。

3)OBJS依赖

$(OBJS): depend

$(MAKE) -C $(CPUDIR) $(if $(REMOTE_BUILD),$@,$(notdir $@))

由上面可以OBJS是进入arch/arm/cpu/armv7,执行得到的.O文件。

4)LIBS依赖

$(LIBS): depend $(SUBDIR_TOOLS)

$(MAKE) -C $(dir $(subst $(obj),,$@))

分别进入相应的目录,生成.a库。比较进入COMMON目录,生成libcommon.a。

5)LIBBOARD依赖

$(LIBBOARD): depend $(LIBS)

$(MAKE) -C $(dir $(subst $(obj),,$@))

生成lib$(BOARD).a文件。

6)LDSCRIPT依赖

$(LDSCRIPT): depend

$(MAKE) -C $(dir $@) $(notdir $@)

这一步是跳到cpu/armv7目录下,执行make u-boot.lds

而make u-boot.lds则是将cpu/armv7/u-boot.lds输出到顶层目录。

最后就是生成镜像的过程GEN_UBOOT.

这个段就是生成elf格式的u-boot。它是生成其它格式的基础。注意了解一下下面的几个链接过程

-Bstatic:使用静态链接

-T:指定连接脚本

-Ttext:指定代码段的起始地址

--start-group --end-group:指定使用的库

-Map u-boot.map:指定符号表文件

 -o u-boot:输出格式。


最后生成u-boot-spl.bin。

通过上面可知,spl程序与uboot程序使用的同一套库,那程序存在那里的差异呢。

在整个连接过程中,有一处偷梁换柱了。这个函数就是board_init_r,该函数在common\spl\spl.c及arch\arm\lib\board.c中均有定义。但是在arch/arm/lib/Makefile中有这样的定义。


由于我们spl/Makefile中定义了CONFIG_SPL_BUILD,所以说spl的程序在board_init_r处不同,导致了不同的流程分支。

最后要说的一点是关于代码段起始地址CONFIG_SYS_TEXT_BASE的定义,该平台是在socfpga_common.h中定义的。

#define CONFIG_SYS_TEXT_BASE 0x01000040

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值