[uboot] (第二章)uboot流程——uboot-spl编译流程

以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例

[uboot] uboot流程系列
[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)

建议先看《[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)》,根据例子了解一下上电之后的BL0\BL1\BL2阶段,以及各个阶段的运行位置,功能。

=================================================================================

一、uboot-spl编译和生成文件

spl的编译是编译uboot的一部分,和uboot.bin走的是两条编译流程,这个要重点注意。
正常来说,会先编译主体uboot,也就是uboot.bin.再编译uboot-spl,也就是uboot-spl.bin,虽然编译命令是一起的,但是编译流程是分开的。

1、编译方法

在project X项目中,所有镜像,包括uboot、kernel、rootfs都是放在build目录下进行编译的。具体去参考该项目build的Makefile的实现。
假设config已经配置完成,在build编译命令如下:

make uboot

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动作。
也就是说spl的编译是编译uboot的一部分,和uboot.bin走的是两条编译流程,这个要重点注意。
正常来说,会先编译主体uboot,也就是uboot.bin.再编译uboot-spl,也就是uboot-spl.bin,虽然编译命令是一起的,但是编译流程是分开的。

2、生成文件
最终编译完成之后,会在project-x/build/out/u-boot/spl下生成如下文件:

arch   common   dts  include          u-boot-spl      u-boot-spl.cfg  u-boot-spl.map
board  drivers  fs   tiny210-spl.bin  u-boot-spl.bin  u-boot-spl.lds  u-boot-spl-nodtb.bin

其中,arch、common、dts、include、board、drivers、fs是对应代码的编译目录,各个目录下都会生成相应的built.o,是由同目录下的目标文件连接而成。
重点说一下以下几个文件:

文件 说明
u-boot-spl 初步链接后得到的spl文件
u-boot-spl-nodtb.bin 在u-boot-spl的基础上,经过objcopy去除符号表信息之后的可执行程序
u-boot-spl.bin 在不需要dtb的情况下,直接由u-boot-spl-nodtb.bin复制而来,也就是编译spl的最终目标
tiny210-spl.bin 由s5pv210平台决定,需要在u-boot-spl.bin的基础上加上16B的header用作校验
u-boot-spl.lds spl的连接脚本
u-boot-spl.map 连接之后的符号表文件
u-boot-spl.cfg 由spl配置生成的文件

二、uboot-spl编译流程

1、编译整体流程

根据零、2生成的文件说明可知简单流程如下:
(1)各目录下built-in.o的生成

Created with Raphaël 2.1.0 源文件、代码文件 编译、汇编 目标文件 同目录目标文件连接 built-in目标文件
### U-Boot SPL 启动过程详解 #### 定义与作用 U-Boot SPL (Secondary Program Loader) 是一种小型引导加载程序,在嵌入式系统的启动过程中起着至关重要的角色。由于 SRAM 存储器容量有限,通常仅有 48 KiB 可供使用[^3]。因此,SPL 被设计成能够快速初始化基本硬件资源,并将主要的 U-Boot 映像从外部存储介质(如 MMC/SD 卡)复制到 RAM 中。 #### 启动流程概述 SPL 的启动流程遵循 U-Boot 整体架构的设计原则,但在功能上有所简化和针对性优化: 1. **初始环境准备** - 上电复位后,CPU 开始执行位于 ROM 或者内部 SRAM 中最基础的指令集。 - 这些指令负责设置堆栈指针、清除 BSS 段等内容,为后续操作提供稳定的运行平台[^1]。 2. **低级硬件初始化** - 对 CPU 寄存器进行必要的配置调整,确保其工作状态适合进一步的操作需求。 - 初始化时钟源与时序控制器,使系统频率达到预期水平;同时激活电源管理单元以支持更多外设供电。 3. **内存子系统建立** - 如果目标设备具备 SDRAM 控制器,则需在此阶段完成相应的参数设定以及训练序列,从而让 DRAM 成功进入可读写模式。 - 配置好之后即可利用大容量随机访问存储作为临时缓冲区来装载完整的 U-Boot 影像文件。 4. **加载主引导镜像** - 使用 SPI Flash, eMMC 等接口读取预先烧录好的 U-Boot 主体部分数据流。 - 将获取的数据按照指定地址映射至之前预备完毕的工作区内存位置处。 5. **跳转执行全量版 U-Boot** - 设置 PC(program counter)寄存器指向新加载的 U-Boot 入口点偏移地址。 - 正式移交控制权给更高级别的固件组件继续处理剩余的任务直至最终启动 Linux 内核或其他操作系统实例[^4]。 ```c // 示例代码片段展示如何切换到新的 U-Boot 实例 void __attribute__((noreturn)) jump_to_uboot(unsigned long addr) { typedef void (*image_entry_point)(void); ((image_entry_point)addr)(); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值