U-Boot系统基础入门

第15章:多阶段启动(SPL/TPL) - 解决小SRAM限制的启动方案

多阶段启动概述

在现代嵌入式系统中,由于硬件限制(特别是SRAM大小限制),U-Boot通常采用多阶段启动策略。这种策略将启动过程分为多个阶段,每个阶段负责特定的初始化任务,逐步加载更大的代码到内存中。

多阶段启动流程图

多阶段启动流程图

图1:典型的SPL/TPL多阶段启动流程

SPL (Secondary Program Loader)

SPL是U-Boot的第一阶段加载器,主要解决小SRAM限制下的启动问题。

SPL的主要特点

SPL的关键功能

  1. 基本的CPU和时钟初始化
  2. 最小化的DDR控制器初始化
  3. 存储设备驱动初始化
  4. 加载完整U-Boot到DDR内存
  5. 跳转到U-Boot执行
注意: SPL通常会被编译为u-boot-spl.bin文件,与主U-Boot镜像分开。

TPL (Tertiary Program Loader)

TPL是比SPL更早的执行阶段,用于资源极其受限的环境。

TPL的应用场景

SPL与TPL对比
特性 SPL TPL
执行顺序 第二阶段 第一阶段
内存需求 通常32KB+ 通常4KB-16KB
功能复杂度 中等 极简
典型任务 加载U-Boot 加载SPL

解决小SRAM限制的技术方案

1. 代码大小优化

2. 内存覆盖技术

在不同阶段重用相同的内存区域:

/* 典型的内存布局示例 */ #define SPL_TEXT_BASE 0x00000000 #define SPL_MAX_SIZE 0x10000 /* 64KB */ #define SPL_STACK (SPL_TEXT_BASE + SPL_MAX_SIZE)

3. 分阶段初始化

将硬件初始化分为多个阶段,每个阶段完成后可以释放部分资源。

4. 外部加载器支持

警告: 在极小的SRAM环境中,必须仔细计算堆栈使用和全局变量大小,避免内存溢出。

配置与编译SPL/TPL

1. 启用SPL支持

# 在U-Boot配置中启用SPL CONFIG_SPL=y CONFIG_SPL_BUILD=y

2. 配置SPL内存布局

# SPL特定的内存配置 CONFIG_SPL_TEXT_BASE=0x00000000 CONFIG_SPL_MAX_SIZE=0x10000 CONFIG_SPL_STACK=0x00010000

3. 选择SPL加载的存储设备

# 例如从MMC加载 CONFIG_SPL_MMC_SUPPORT=y CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x200

4. 编译命令

# 编译生成SPL镜像 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- spl

调试技巧

提示: 在开发初期,可以先用QEMU模拟器测试SPL功能,减少硬件调试时间。