U-Boot启动流程分析与ARM嵌入式移植实战 - 第3节
3.1 Bootloader 的定义与核心功能
Bootloader(引导加载程序)是嵌入式系统上电后执行的第一段软件代码。它负责完成硬件初始化、建立内存映射、加载操作系统内核,并将控制权移交给内核。在 ARM 嵌入式系统中,Bootloader 是连接硬件与操作系统的桥梁,其正确性与稳定性直接决定系统能否正常启动。
3.1.1 Bootloader 的定义
Bootloader 是一段固化在非易失性存储介质(如 NOR Flash、NAND Flash、eMMC、SD 卡)中的小程序。系统复位后,CPU 从预定义的启动地址(ARM 架构通常为 0x00000000 或 0xFFFF0000)取指执行,这段代码就是 Bootloader 的入口。
关键概念:Bootloader 的“引导”包含两层含义:一是引导硬件从复位状态进入可工作状态;二是引导操作系统从存储介质加载到内存并启动。U-Boot 是目前 ARM 嵌入式领域最主流的 Bootloader。
3.1.2 Bootloader 的核心功能
| 功能模块 | 具体职责 | 典型实现 |
|---|---|---|
| 硬件初始化 | 设置 CPU 模式、关闭看门狗、初始化时钟、配置内存控制器、初始化串口 | start.S、lowlevel_init.S |
| 内存映射建立 | 配置 MMU 页表(可选)、建立 DDR 控制器时序、完成内存检测 | board_init_f()、dram_init() |
| 存储介质驱动 | 支持从 NOR/NAND Flash、eMMC、SD 卡、SPI Flash 读取数据 | drivers/mtd/、drivers/mmc/ |
| 内核加载与启动 | 从存储介质读取内核映像到内存,设置启动参数,跳转到内核入口 | bootm、bootz、booti 命令 |
| 交互式命令行 | 提供串口控制台,允许用户中断自动启动,执行调试命令 | HUSH shell、命令行解析器 |
| 环境变量管理 | 保存启动参数、IP 地址、启动延迟等配置到持久化存储 | env 子系统(env_{nor,nand,mmc}.c) |
3.2 Bootloader 的启动模式
根据应用场景和开发阶段的不同,Bootloader 通常支持以下三种启动模式:
- 自举模式(Self-booting):系统上电后自动完成硬件初始化并加载内核,无需人工干预。这是产品发布后的标准启动方式。
- 交互模式(Interactive):在启动过程中检测到用户按键(如空格键),进入命令行控制台,允许开发者执行内存读写、Flash 烧写、网络下载等调试操作。
- 下载模式(Download):通过串口(XMODEM/YMODEM)、以太网(TFTP)、USB(DFU)等接口将新固件或内核下载到目标板内存或 Flash 中。
开发实践:在嵌入式开发初期,建议将 Bootloader 的启动延迟(bootdelay)设置为 3~5 秒,并开启串口控制台。这样既能在调试时中断启动流程,又能在量产时通过设置
bootdelay=0 实现快速自启。
3.3 Bootloader 与 BIOS 的区别
虽然 Bootloader 和 BIOS(Basic Input/Output System)都承担系统初始化的职责,但两者在架构、复杂度、硬件耦合度上存在本质差异。下表从多个维度进行对比:
| 对比维度 | BIOS(x86 平台) | Bootloader(ARM 嵌入式) |
|---|---|---|
| 硬件平台 | x86 架构,标准化程度高(IBM PC 兼容) | ARM 架构,SoC 厂商定制,硬件差异大 |
| 代码规模 | 通常 1~16 MB,包含 POST、中断向量表、运行时服务 | 通常 64 KB ~ 2 MB,精简高效 |
| 硬件抽象 | 提供标准中断接口(INT 10h/13h/16h)供操作系统调用 | 不提供运行时服务,初始化后即交出控制权 |
| 启动流程 | POST → 加载 MBR → 启动引导扇区 → 加载操作系统 | 一级 BootROM → 二级 Bootloader(SPL)→ U-Boot → 内核 |
| 可移植性 | 绑定 x86 指令集,不可移植到其他架构 | U-Boot 支持 ARM、RISC-V、MIPS、x86 等多架构 |
| 交互能力 | 通常仅提供基础设置界面(CMOS Setup) | 提供完整命令行 Shell,支持脚本、网络、文件系统 |
| 固件更新 | 需专用工具,更新风险高 | 支持 TFTP、USB、SD 卡等多种在线更新方式 |
常见误区:不要将 U-Boot 视为“嵌入式 BIOS”。BIOS 在操作系统运行后仍提供中断服务,而 U-Boot 在跳转到内核后即完全退出,不再参与系统运行。U-Boot 更接近 x86 平台上的 GRUB 或 UEFI 引导管理器,而非 BIOS。
3.4 Bootloader 在 ARM 系统中的启动流程概览
为了直观理解 Bootloader 在 ARM 嵌入式系统中的位置和作用,下图展示了从系统上电到操作系统启动的完整流程:
从上图可以看出,Bootloader 在 ARM 系统中承担着从 BootROM 到操作系统内核的承上启下作用。其中 SPL(Secondary Program Loader)是 U-Boot 为了适应小容量 SRAM 而引入的二级引导机制,将在后续章节详细分析。
3.5 U-Boot 的软件架构
U-Boot 的代码组织采用分层模块化设计,便于移植到不同硬件平台。下图展示了 U-Boot 的主要软件层次:
移植要点:当为一块新的 ARM 板卡移植 U-Boot 时,开发者主要关注板级支持层和硬件抽象层。具体需要修改的文件包括:
board/<vendor>/<board>/ 目录下的板级初始化代码、include/configs/<board>.h 头文件中的配置宏,以及 arch/arm/mach-<soc>/ 下的 SoC 相关代码。
3.6 本章小结
- Bootloader 是嵌入式系统上电后执行的第一段软件,负责硬件初始化、内核加载和系统引导。
- U-Boot 支持自举、交互、下载三种启动模式,满足开发与量产的不同需求。
- Bootloader 与 BIOS 在架构、规模、硬件耦合度、运行时服务等方面存在本质区别,不可混为一谈。
- ARM 嵌入式系统的典型启动链为:BootROM → SPL → U-Boot → Linux 内核 → 根文件系统。
- U-Boot 采用分层架构,移植工作主要集中在板级支持层和硬件抽象层。