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位于引导加载层,是硬件与操作系统之间的桥梁。
嵌入式系统的硬件核心组件包括:
- 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的主要作用:
- 硬件初始化:设置CPU工作模式、配置系统时钟、初始化DDR控制器、使能Cache、设置中断控制器。
- 设备枚举与驱动:通过设备树(Device Tree)或板级代码枚举板载设备,加载串口、网卡、存储控制器等驱动。
- 引导加载:从NAND Flash、eMMC、SD卡、网络(TFTP/NFS)或USB等介质加载操作系统内核映像。
- 交互式调试:提供命令行接口(CLI),支持内存读写、寄存器查看、设备测试、环境变量修改等调试功能。
- 启动参数传递:将内核启动参数(ATAG或设备树)传递给操作系统,指定根文件系统位置、控制台设备等。