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支持 | ✅ 完整支持 | ✅ 部分支持 | ❌ 不支持 |
下图展示了ARM三大产品线的定位差异与典型应用场景:
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)
下图展示了ARMv7与ARMv8异常模型的对比:
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级异常模型和新的页表机制,才能正确编写启动代码。