news 2026/5/4 22:22:59

嵌入式知识篇---BootROM 与 Bootloader 的关系

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式知识篇---BootROM 与 Bootloader 的关系

它们是启动流程中先后衔接的两个阶段,可以概括为:BootROM 加载并启动 Bootloader


一、BootROM(只读存储器中的启动代码)

本质

芯片出厂时固化的掩膜 ROM,用户无法修改。位于芯片内部,上电后 CPU 第一个执行的代码。

主要职责

  1. 基本硬件初始化:设置堆栈指针、关看门狗、初始化时钟(部分芯片)、配置启动引脚采样

  2. 选择启动介质:根据 BOOT 引脚电平,决定从 NAND、SD、UART、USB 等哪个设备读取

  3. 加载第一级启动代码:将启动介质前 4KB~64KB 内容复制到内部 SRAM

  4. 验证并跳转执行:通常有简单签名校验,成功后跳转到 SRAM 执行

约束条件

  • 容量极小:4KB~64KB(内部 SRAM 宝贵)

  • 功能受限:只能支持最基础的驱动(如简单 NAND 读、UART 协议)

  • 无法初始化 DDR:DDR 需要复杂时序配置,BootROM 通常不包含完整 DDR 初始化

典型例子

SoCBootROM 大小支持启动介质
STM32约 16KBUART、USB、SPI、I2C
i.MX6约 32KBNAND、SD、SPI NOR、UART、USB
RK3399约 64KBeMMC、SD、NAND、SPI NOR、USB

二、Bootloader(引导加载程序)

本质

存储在外部非易失存储器(Flash、eMMC、SD 卡)中的可升级软件,用户可自由修改。

主要职责

  1. 完整硬件初始化:初始化 DDR 内存、时钟树、存储控制器、显示、网络等

  2. 加载操作系统:从文件系统或裸分区读取 Linux Kernel、DTB 或 RTOS 镜像

  3. 提供交互界面:命令行(如 U-Boot 的 CLI)、脚本支持、环境变量

  4. 支持多种启动方式:从网络(TFTP)、USB、MMC 等灵活选择

  5. 固件升级:通常在 Bootloader 中实现 flash 烧写命令

容量与复杂度

  • 容量:通常 100KB~1MB(压缩后)

  • 功能强大:包含文件系统驱动(FAT、EXT4)、网络协议栈(TCP/IP)、USB 主机栈

典型例子

Bootloader常见平台特点
U-BootARM、MIPS、RISC-V最主流,功能最全
ATF + U-BootARMv8(如 RK3399、树莓派4)安全启动分离
Corebootx86/ARM主要用于 PC/服务器
RedBoot嵌入式较老,eCos 生态
厂商私有如 Rockchip MiniLoader简化版,只负责加载 U-Boot

三、两者关系:级联启动模型

为什么不能跳过 BootROM?

  • 没有 BootROM:CPU 无法知道从哪个地址取第一条指令(存储器可能是空的或未初始化)

  • 为什么需要 Bootloader:BootROM 太小,无法处理复杂存储介质(如文件系统、网络协议)

为什么 BootROM 不直接加载操作系统?

原因说明
容量限制BootROM 只有几十 KB,无法包含驱动完整文件系统、USB、网络协议栈
内存限制内部 SRAM 只有几十~几百 KB,无法容纳 Linux Kernel(几 MB)
灵活性BootROM 固化的,无法修复 bug 或适配新硬件
安全边界BootROM 只做最小信任根,复杂逻辑交给可升级的 Bootloader

四、实际芯片案例

案例1:STM32(无外置 DDR,裸机/RTOS)

上电 → BootROM → [可选:System Bootloader (UART/USB/SPI)] → 用户程序
  • 没有独立的 Bootloader:BootROM 可直接跳转到用户 Flash

  • System Bootloader 是 BootROM 内的可选模式,不是独立程序

案例2:i.MX6(带 DDR,运行 Linux)

上电 → BootROM → 加载 SPL (4KB) → SPL 初始化 DDR → 加载 U-Boot → 加载 Kernel
  • 三级启动:BootROM → SPL → U-Boot → Kernel

  • SPL 是 Bootloader 的一部分,但由 BootROM 加载

案例3:RK3399(ARMv8,ATF 架构)

上电 → BootROM → 加载 ddr.bin (初始化 DDR) → 加载 U-Boot SPL → 加载 ATF → 加载 U-Boot → 加载 Kernel
  • 更复杂:安全监控(ATF)介入,启动链更长


五、关键区别总结表

特性BootROMBootloader
存储位置芯片内部掩膜 ROM外部 Flash、eMMC、SD 卡
可修改性❌ 不可修改(出厂固化)✅ 可升级、可配置
大小4KB~64KB100KB~1MB+
执行位置芯片内部 SRAM 或 XIP FlashDDR 内存(初始化后)
初始化能力极简硬件,通常无法初始化 DDR完整硬件初始化
功能加载第一级启动代码加载 OS、提供命令行、网络启动
典型代码汇编 + 简单 CU-Boot、Coreboot、RedBoot
存在必要性必须(CPU 第一条指令的来源)非必须(裸机可以直接被 BootROM 加载)
开发难度芯片厂商实现,用户无法修改用户可移植、可定制

六、常见理解误区

❌ 误区1:“Bootloader 就是 U-Boot”

  • 正确:U-Boot 是 Bootloader 的一种实现,还有 Coreboot、RedBoot、GRUB(x86)等

❌ 误区2:“BootROM 也算 Bootloader”

  • 正确:BootROM 是“启动程序”,但不是通常说的 Bootloader。术语上 Bootloader 特指存储在外部、可升级的程序

❌ 误区3:“所有芯片都需要 Bootloader”

  • 正确:单片机(无 OS)用户程序可直接被 BootROM 加载,不需要额外 Bootloader;有 OS 或需要复杂启动配置的才需要

❌ 误区4:“BootROM 可以初始化 DDR”

  • 正确:部分 SoC(如 i.MX6)的 BootROM 不初始化 DDR,需由 SPL 初始化;少数 SoC(如某些 TI 芯片)BootROM 支持简单 DDR 配置

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/4 22:16:29

Docker 如何查询挂载的目录

Docker 如何查询挂载的目录 要查询 Docker 容器的挂载目录,最核心、最准确的方法是使用 docker inspect 命令。下面为你介绍几种从简到繁的实用方法。 🎯 方法一:使用格式化命令(最推荐) 这是最高效的方式,…

作者头像 李华
网站建设 2026/5/4 21:58:40

基于Godot引擎的FPS游戏框架:模块化设计与核心系统实现

1. 项目概述:一个开箱即用的FPS游戏框架如果你正在用Godot引擎开发第一人称射击游戏,并且厌倦了从零开始搭建移动、射击、敌人AI这些基础系统,那么Droivox/Godot-Engine-FPS这个开源项目,很可能就是你一直在找的“脚手架”。这不是…

作者头像 李华
网站建设 2026/5/4 21:57:53

OPC UA在.NET 8中高性能通信实现(工业物联网落地必备手册)

更多请点击: https://intelliparadigm.com 第一章:OPC UA在.NET 8中的技术定位与工业物联网价值 OPC UA(Open Platform Communications Unified Architecture)作为跨平台、安全、可扩展的工业通信标准,已深度融入 .NE…

作者头像 李华