以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例
[uboot] uboot流程系列:
[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)
[project X] tiny210(s5pv210)从存储设备加载代码到DDR
[uboot] (第一章)uboot流程——概述
[uboot] (第二章)uboot流程——uboot-spl编译流程
[uboot] (第三章)uboot流程——uboot-spl代码流程
[uboot] (第四章)uboot流程——uboot编译流程
[uboot] (番外篇)global_data介绍
[uboot] (番外篇)uboot relocation介绍
建议先看《[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)》,根据例子了解一下上电之后的BL0\BL1\BL2阶段,以及各个阶段的运行位置,功能。
建议先看《[uboot] (第二章)uboot流程——uboot-spl编译流程》,其编译流程基本上是类似的。最大区别在于dtb的编译。
=================================================================================
一、uboot编译和生成文件
0、说明
现在的uboot已经做得和kernel很像,最主要的一点是,uboot也使用了dtb的方法,将设备树和代码分离开来(当然可以通过宏来控制)。
project-x/u-boot/configs/tiny210_defconfig
CONFIG_OF_CONTROL=y
// 用于表示是否使用了dtb的方式
CONFIG_OF_SEPARATE=y
// 是否将dtb和uboot分离表一
所以在uboot的编译中,和spl的最大区别是还要编译dtb。 (前面我们将的spl是没有使用dtb的,当然好像也可以使用dtb,只是我没有试过)。
1、编译方法
在project X项目中,所有镜像,包括uboot、kernel、rootfs都是放在build目录下进行编译的。具体去参考该项目build的Makefile的实现。
假设config已经配置完成,在build编译命令如下:
make uboot
Makefile中对应的命令如下:
project-x/build/Makefile
BUILD_DIR=$(shell pwd)
OUT_DIR=$(BUILD_DIR)/out
UBOOT_OUT_DIR=$(OUT_DIR)/u-boot
UBOOT_DIR=$(BUILD_DIR)/../u-boot
uboot:
mkdir -p $(UBOOT_OUT_DIR)
make -C $(UBOOT_DIR) CROSS_COMPILE=$(CROSS_COMPILE) KBUILD_OUTPUT=$(UBOOT_OUT_DIR) $(BOARD_NAME)_defconfig
make -C $(UBOOT_DIR) CROSS_COMPILE=$(CROSS_COMPILE) KBUILD_OUTPUT=$(UBOOT_OUT_DIR)
## -C $(UBOOT_DIR) 指定了要在../uboot,也就是uboot的代码根目录下执行make
## CROSS_COMPILE=$(CROSS_COMPILE) 指定了交叉编译器
## KBUILD_OUTPUT=$(UBOOT_OUT_DIR) 指定了最终编译的输出目录是build/out/u-boot.
最终,相当于进入了uboot目录执行了make动作。
2、生成文件
最终编译完成之后,会在project-x/build/out/u-boot下生成如下文件:
arch common dts include net tools u-boot.cfg u-boot.lds u-boot.srec
board disk examples lib scripts System.map u-boot u-boot.dtb u-boot.map u-boot.sym
cmd drivers fs Makefile source test u-boot.bin u-boot-dtb.bin u-boot-nodtb.bin
其中,arch、common、dts、include、board、drivers、fs等等目录是对应代码的编译目录,各个目录下都会生成相应的built.o,是由同目录下的目标文件连接而成。
重点说一下以下几个文件:
文件 | 说明 |
---|---|
u-boot | 初步链接后得到的uboot文件 |
u-boot-nodtb.bin | 在u-boot的基础上,经过objcopy去除符号表信息之后的可执行程序 |
u-boot.dtb | dtb文件 |
u-boot-dtb.bin | 将u-boot-nodtb.bin和u-boot.dtb打包在一起的文件 |
u-boot.bin | 在需要dtb的情况下,直接由u-boot-dtb.bin复制而来,也就是编译u-boot的最终目标 |
u-boot.lds | uboot的连接脚本 |
System.map | 连接之后的符号表文件 |
u-boot.cfg | 由uboot配置生成的文件 |
二、uboot编译流程
1、编译整体流程
根据一、2生成的文件说明可知简单流程如下:
(1)各目录下built-in.o的生成
(2)由所有built-in.o以u-boot.lds为连接脚本通过连接来生成u-boot