1. 嵌入式系统概述:ARM处理器体系结构、嵌入式系统组成、U-Boot在系统中的地位与作用

1.1 ARM处理器体系结构

ARM(Advanced RISC Machines)处理器采用精简指令集计算机(RISC)架构,以其低功耗、高性能和可扩展性成为嵌入式系统领域的事实标准。ARM体系结构经历了从ARMv4到ARMv8-A的演进,当前主流嵌入式应用集中在ARM Cortex-A(应用处理器)、Cortex-R(实时处理器)和Cortex-M(微控制器)三大系列。

特性 ARM Cortex-A ARM Cortex-R ARM Cortex-M
典型应用 Linux/Android、多媒体 实时控制、汽车电子 IoT、传感器、电机控制
内存管理 MMU(内存管理单元) MPU(内存保护单元) 无/可选MPU
中断延迟 中等(~100周期) 低(~20周期) 极低(~12周期)
指令集 ARM/Thumb/Thumb-2 ARM/Thumb-2 Thumb/Thumb-2
典型频率 1~3 GHz 200~800 MHz 16~400 MHz
U-Boot支持 完全支持 部分支持 不支持(使用其他Bootloader)

ARM处理器的核心特性包括:

  • 加载/存储架构:只有加载(LDR)和存储(STR)指令访问内存,运算操作在寄存器之间完成。
  • 条件执行:大多数指令可依据CPSR(当前程序状态寄存器)中的条件标志有条件地执行,减少分支开销。
  • 多级流水线:现代ARM Cortex-A系列采用13~15级超标量流水线,支持乱序执行。
  • 异常模型:支持复位、未定义指令、SWI(软件中断)、预取中止、数据中止、IRQ(普通中断)、FIQ(快速中断)七种异常模式。
关键概念:ARM处理器上电后从复位向量(通常为0x00000000或0xFFFF0000)开始执行第一条指令。此时系统处于SVC(超级用户)模式,MMU关闭,CPU以最高特权级运行——这正是U-Boot启动的起点。

1.2 嵌入式系统组成

一个典型的ARM嵌入式系统由硬件平台和软件栈两部分构成。硬件平台以SoC(片上系统)为核心,软件栈则从底层固件逐层向上构建。

嵌入式系统分层模型:从硬件到应用,嵌入式系统通常分为五层:硬件层 → 引导加载层 → 操作系统内核层 → 驱动与中间件层 → 应用层。U-Boot位于引导加载层,是硬件与操作系统之间的桥梁。
嵌入式系统组成与U-Boot位置 应用层(Application) 中间件与库(Middleware / Libraries) 操作系统内核(Linux / RTOS Kernel) 引导加载层(U-Boot Bootloader) 硬件初始化 → 内存初始化 → 加载内核 硬件层(Hardware Platform) SoC / RAM / Flash / 外设接口 用户空间 内核空间 固件层 启动流程 ① 上电复位 ② ROM BootROM ③ U-Boot SPL ④ U-Boot Proper ⑤ 加载内核 ⑥ 内核初始化 ⑦ 挂载根文件系统 ⑧ 启动用户应用

嵌入式系统的硬件核心组件包括:

  • SoC(片上系统):集成CPU核心、GPU、内存控制器、I/O接口(USB、UART、I2C、SPI、Ethernet等)于单一芯片。
  • 存储子系统:包括片内SRAM(通常用于BootROM)、片外DDR SDRAM(主内存)、NAND Flash/eMMC(非易失存储)、SPI NOR Flash(启动设备)。
  • 时钟与电源管理:晶振、PLL(锁相环)倍频、电源域划分、DVFS(动态电压频率调整)。
  • 调试接口:JTAG/SWD用于硬件调试,UART用于控制台输出。

1.3 U-Boot在系统中的地位与作用

U-Boot(Das U-Boot,Universal Bootloader)是嵌入式Linux系统中最广泛使用的引导加载程序。它遵循GPLv2许可证,支持超过200种嵌入式板卡和数十种CPU架构(ARM、MIPS、RISC-V、x86等)。

U-Boot的核心地位:在嵌入式系统的启动链中,U-Boot位于BootROM之后、操作系统内核之前。它承担着从硬件原始状态到操作系统可运行环境的全部过渡工作。

启动阶段 执行位置 主要任务 代码体积
BootROM SoC片内ROM 初始化基本时钟、检测启动设备、加载SPL ~32 KB
SPL(Secondary Program Loader) 片内SRAM 初始化DDR控制器、加载U-Boot Proper到DDR ~64 KB
U-Boot Proper DDR SDRAM 完整硬件初始化、外设驱动、环境变量、加载内核 ~256 KB~1 MB
Linux Kernel DDR SDRAM 操作系统初始化、进程调度、驱动加载 ~2~10 MB
常见误区:初学者常认为U-Boot只是"把内核从Flash拷贝到内存"。实际上,U-Boot在启动过程中需要完成CPU模式设置、PLL时钟配置、DDR时序训练、MMU/TLB初始化、中断向量表重定位、串口/网口/存储控制器驱动等一系列底层硬件初始化工作。这些初始化如果出错,内核根本无法启动。

U-Boot的主要作用:

  1. 硬件初始化:设置CPU工作模式、配置系统时钟、初始化DDR控制器、使能Cache、设置中断控制器。
  2. 设备枚举与驱动:通过设备树(Device Tree)或板级代码枚举板载设备,加载串口、网卡、存储控制器等驱动。
  3. 引导加载:从NAND Flash、eMMC、SD卡、网络(TFTP/NFS)或USB等介质加载操作系统内核映像。
  4. 交互式调试:提供命令行接口(CLI),支持内存读写、寄存器查看、设备测试、环境变量修改等调试功能。
  5. 启动参数传递:将内核启动参数(ATAG或设备树)传递给操作系统,指定根文件系统位置、控制台设备等。
U-Boot启动流程与硬件初始化阶段 BootROM 片内ROM固件 基本时钟/启动设备检测 SPL 片内SRAM执行 DDR初始化/加载U-Boot U-Boot Proper DDR中执行 完整硬件初始化/驱动 Linux Kernel 操作系统 进程/驱动/文件系统 U-Boot硬件初始化详细步骤 ① 设置CPU为SVC模式,关闭中断(CPSR寄存器) ② 初始化异常向量表(设置中断服务程序入口) ③ 配置PLL锁相环,设置CPU/总线/外设时钟频率 ④ 初始化DDR控制器:时序参数、ZQ校准、DQS门控训练 ⑤ 初始化串口(UART),输出启动日志 ⑥ 初始化存储控制器(NAND/eMMC/SD),加载内核映像 ⑦ 解析设备树(FDT),设置内核启动参数,跳转到内核入口

1.4 本章小结