Lazy loaded image
Uboot 启动过程分析
Words 998Read Time 3 min
2025-9-10
2026-4-20
type
Post
date
Sep 10, 2025
slug
uboot_boot_process_analysis
category
🥳嵌入式Linux开发
icon
password
参考资料
  1. 关于本项目 — [野火]嵌入式Linux镜像构建与部署——基于LubanCat-i.MX6ULL开发板 文档
  1. u-boot完全分析与移植_哔哩哔哩_bilibili
    1. 基于百问网的IMX6ULL或STM32MP157开发板,完全分析u-boot,并且移植一个新版本的u-boot
  1. m2m-telecomm2m-telecomU-boot initialization sequence - NetSoM
  1. Linux系统中u-boot启动流程分析(详解)-阿里云开发者社区

概念辨析:阶段划分 vs. SPL / Proper

两套术语的维度不同

第一阶段 / 第二阶段 描述的是 U-Boot 内部代码执行流程
  • 第一阶段:汇编代码(start.S)。在无 C 运行时的裸环境中执行,完成 CPU 模式切换、关闭 MMU/Cache、初始化栈,最终将自身重定位(relocate)到 DDR,跳入 C 环境。
  • 第二阶段:C 代码(board_init_fboard_init_r)。完成外设初始化、环境变量加载、命令行交互、引导内核等完整功能。
SPL / U-Boot Proper 描述的是构建产物与加载关系
  • SPL(Secondary Program Loader):独立编译的极简镜像,运行于片上 SRAM(OCRAM),尺寸严格受限(通常 ≤ 64 KB)。职责单一:初始化 DDR,将 U-Boot Proper 加载进内存,然后跳转。"Secondary"意指它是 Boot ROM(Primary Loader)之后的第二级加载器。
  • U-Boot Proper:完整功能的 U-Boot 镜像,运行于 DDR,无尺寸约束。"Proper"为英语"正式的、本体的"之意,相对于 SPL 这一前置辅助加载器,它才是"真正的 U-Boot"。

命名约定来源

SPL — Secondary Program Loader
  • Boot ROM 是固化在芯片内部的第一级加载器,行业通称 Primary Program Loader
  • SPL 由 Boot ROM 加载,是第二级,故称 Secondary
  • 该术语来自嵌入式行业惯例,U-Boot 社区沿用之,并非 U-Boot 独创。
  • 源码中通过 CONFIG_SPL 开关控制是否编译 SPL,对应产物文件名为 u-boot-spl.bin
Proper — 本体
  • 英语中 "proper" 有"本体的、正式的"含义(如 "the city proper" 指城区本身,不含郊区)。
  • 相对于 SPL 这一前置辅助镜像,完整的 U-Boot 才是"真正的 U-Boot 本体",社区约定称之为 U-Boot Proper
  • 这是非正式但约定俗成的术语,源于社区讨论习惯,官方文档中有时也以 "u-boot.bin" / "u-boot proper" 区分于 "u-boot-spl.bin"。

两者不是严格对应关系

⚠️
常见误区:将"第一阶段 = SPL、第二阶段 = Proper"。这是教学性简化,并非源码定义。
实际关系:SPL 内部自身也分第一阶段(汇编初始化)和第二阶段(C 功能),U-Boot Proper 同理。两套划分是正交的:
第一阶段(汇编)
第二阶段(C)
无 SPL 场景
U-Boot Proper 的 start.S
U-Boot Proper 的 C 初始化
有 SPL 场景
SPL 自身的汇编初始化
SPL 的 C 代码 → 跳转 Proper → Proper 自身也经历两阶段

正文

本文的叙述约定

本文采用教学性阶段划分,以整个启动链路为视角:
  • 第一阶段:U-Boot 汇编入口至完成 DDR 初始化与重定位
  • 第二阶段:DDR 中 C 环境的完整初始化流程
  • 加载内核阶段:读取内核镜像、传递设备树、移交控制权
iMX6ULL 野火板卡默认不启用 SPL(Boot ROM 通过 DCD 直接初始化 DDR 并加载 U-Boot Proper),因此本文中"第一阶段"即对应 U-Boot Proper 内部的汇编阶段,而非独立的 SPL 镜像。详见子页面:
iMX6ULL是否使用SPL?
IMX6ULL 完整内存映射布局表

Boot ROM 启动阶段(上电到 U-Boot _start)
Uboot 启动第一阶段
Uboot 启动第二阶段
Uboot 加载内核阶段

拓展

总结图

database
notion image
notion image
notion image
notion image
notion image
notion image
notion image
🧰
ARM32 嵌入式启动排错速查卡
上一篇
Linux 驱动基础
下一篇
Linux 驱动专题 - 输入设备驱动

Comments
Loading...