U-Boot启动流程分析与ARM嵌入式移植实战工程 - 第2节

2. ARM处理器基础

ARM架构起源于1980年代英国Acorn Computers公司的研发项目。1985年,首个ARM处理器——ARM1诞生,其设计哲学是“精简指令集(RISC)”,以极低的晶体管数量实现高效能。此后,ARM架构经历了从ARMv1到ARMv9的多次迭代,逐步从嵌入式微控制器扩展到移动计算、服务器和AI领域。

关键里程碑:
  • 1985年:ARM1(26位地址,3µm工艺)
  • 1990年:ARM6(ARMv3,首次支持32位地址)
  • 1998年:ARM9TDMI(ARMv4T,引入Thumb指令集)
  • 2005年:Cortex-A8(ARMv7-A,首次实现超标量)
  • 2011年:Cortex-A57(ARMv8-A,引入64位AArch64)
  • 2021年:ARMv9(强化安全与AI向量扩展)

ARM架构的成功不仅在于技术演进,更在于其独特的IP授权模式:ARM公司不直接生产芯片,而是将处理器设计授权给全球数百家半导体厂商(如高通、三星、联发科、华为海思),形成庞大的生态系统。

2.2 Cortex-A/R/M系列区别:三大产品线定位

ARM在ARMv7时代将产品线清晰划分为三大系列:Cortex-A(Application)、Cortex-R(Real-time)、Cortex-M(Microcontroller)。三者面向完全不同的应用场景,在性能、实时性、功耗和硬件特性上差异显著。

特性 Cortex-A Cortex-R Cortex-M
目标应用 智能手机、平板、服务器、Linux/Android 实时控制、汽车ADAS、硬盘控制器 MCU、IoT、传感器、电机控制
操作系统 Linux、Android、Windows、QNX RTOS(FreeRTOS、ThreadX) 裸机、RTOS
MMU/MPU MMU(内存管理单元) MPU(内存保护单元) 无/可选MPU
指令集 ARM + Thumb2 + NEON ARM + Thumb2 Thumb/Thumb2
中断延迟 高(受Cache/MMU影响) 极低(硬件中断嵌套) 极低(Tail-Chaining)
典型频率 1~3 GHz 200~800 MHz 16~400 MHz
功耗 高(数瓦) 中(数百毫瓦) 极低(微瓦级)
U-Boot支持 ✅ 完整支持 ✅ 部分支持 ❌ 不支持
U-Boot关联提示:U-Boot主要面向Cortex-A系列处理器,因为只有Cortex-A具备MMU,能够运行Linux等复杂操作系统。Cortex-R和Cortex-M通常使用裸机或RTOS,不需要U-Boot这样的Bootloader。

下图展示了ARM三大产品线的定位差异与典型应用场景:

ARM Cortex-A / R / M 系列定位对比 Cortex-A 高性能应用处理器 MMU / Linux / Android U-Boot 主战场 Cortex-R 实时控制处理器 MPU / RTOS 汽车 / 工业控制 Cortex-M 微控制器 裸机 / FreeRTOS IoT / 传感器 性能 → 功耗 → Cortex-M Cortex-R Cortex-A

2.3 ARMv7与ARMv8架构对比:32位到64位的跨越

ARMv7是32位时代的巅峰,而ARMv8是ARM架构史上最重要的变革——引入了64位执行状态(AArch64)。对于U-Boot移植而言,理解这两个架构的差异是编写正确启动代码的前提。

2.3.1 核心差异总览

对比维度 ARMv7 (32位) ARMv8 (64位)
执行状态 AArch32 AArch32 + AArch64
通用寄存器 16个(R0-R15) 31个(X0-X30)
寄存器宽度 32位 64位(AArch64)
指令集 ARM + Thumb2 A64(固定32位指令)
异常模型 7种异常模式(FIQ/IRQ/SVC等) 4个异常等级(EL0-EL3)
MMU页表 二级页表(L1/L2) 三级/四级页表(L0-L3)
虚拟地址宽度 32位(4GB) 48位(256TB)
NEON/SIMD 32×64位寄存器 32×128位寄存器
典型处理器 Cortex-A9/A15/A7 Cortex-A53/A72/A76

2.3.2 异常模型变革:从7种模式到4个等级

ARMv7的异常模型基于处理器模式(User、FIQ、IRQ、Supervisor、Abort、Undefined、System),切换模式需要修改CPSR寄存器。ARMv8引入了更清晰的异常等级(Exception Level)模型:

  • EL0:用户态(非特权)
  • EL1:操作系统内核(特权)
  • EL2:虚拟机监视器(Hypervisor)
  • EL3:安全监控(Secure Monitor)
U-Boot移植要点:在ARMv8平台上,U-Boot通常运行在EL1或EL2等级。启动时,处理器从EL3(如ATF/Trusted Firmware)跳转到U-Boot,U-Boot需要正确配置异常向量表(VBAR_EL1/EL2)和页表,才能正常引导Linux内核。

下图展示了ARMv7与ARMv8异常模型的对比:

ARMv7 vs ARMv8 异常模型对比 ARMv7 异常模式(7种) User (USR) FIQ IRQ Supervisor (SVC) Abort Undefined System ARMv8 异常等级(4级) EL0 - 用户态 EL1 - 操作系统内核 EL2 - 虚拟机监视器 EL3 - 安全监控

2.3.3 U-Boot启动代码中的架构差异

在U-Boot的启动流程中,ARMv7和ARMv8的汇编入口代码存在显著差异。以下是一个简化的对比示例:

ARMv7 启动入口(arch/arm/cpu/armv7/start.S)

reset:
    /* 设置SVC模式,关闭中断 */
    mrs     r0, cpsr
    bic     r0, r0, #0x1f
    orr     r0, r0, #0xd3
    msr     cpsr, r0

    /* 初始化C运行时环境 */
    ldr     sp, =(CONFIG_SYS_INIT_SP_ADDR)
    bic     sp, sp, #7       /* 8字节对齐 */

    /* 跳转到C代码 */
    bl      board_init_f

ARMv8 启动入口(arch/arm/cpu/armv8/start.S)

reset:
    /* 读取当前异常等级 */
    mrs     x0, CurrentEL
    cmp     x0, #0x4         /* EL1? */
    b.eq    el1_entry
    cmp     x0, #0x8         /* EL2? */
    b.eq    el2_entry
    /* 默认EL3处理 */
    bl      armv8_switch_to_el2

el1_entry:
    /* 设置SP_EL1 */
    ldr     x0, =(CONFIG_SYS_INIT_SP_ADDR)
    mov     sp, x0

    /* 跳转到C代码 */
    bl      board_init_f
关键差异总结:
  • ARMv7使用mrs/msr操作CPSR切换模式;ARMv8使用CurrentEL系统寄存器判断异常等级。
  • ARMv7寄存器为R0-R15(32位);ARMv8为X0-X30(64位),且SP、LR等有独立系统寄存器。
  • ARMv8需要处理EL3→EL2→EL1的异常等级切换,而ARMv7只需设置SVC模式。

2.4 本章小结

ARM处理器从ARMv1发展到ARMv9,经历了从简单微控制器到复杂应用处理器的蜕变。Cortex-A/R/M三大系列分别面向应用处理、实时控制和微控制器市场,其中Cortex-A是U-Boot的主要运行平台。ARMv8引入的64位架构和异常等级模型,为U-Boot移植带来了新的挑战——开发者需要理解AArch64执行状态、4级异常模型和新的页表机制,才能正确编写启动代码。