ARM平台设备树配置与内核移植工程案例详解 - 第2节

2.1 ARM处理器模式

ARM架构定义了多种处理器模式(Processor Modes),用于隔离不同特权级别的代码执行环境。处理器模式是操作系统实现安全性和稳定性的硬件基础,也是设备树配置与内核移植中必须理解的核心概念。

2.1.1 处理器模式分类

ARMv7-A及之前的架构支持7种基本模式,ARMv8-A在AArch64状态下扩展为4个异常等级(Exception Levels, EL)。下表列出了ARMv7-A的7种模式及其特权级别:

模式名称缩写特权级别用途
用户模式USR非特权(PL0)普通应用程序执行
系统模式SYS特权(PL1)运行特权任务,使用与USR相同的寄存器组
管理模式SVC特权(PL1)操作系统内核,由SWI/SVC指令进入
中断模式IRQ特权(PL1)普通中断处理
快速中断模式FIQ特权(PL1)高速中断处理,拥有私有寄存器
中止模式ABT特权(PL1)数据/指令访问中止处理
未定义模式UND特权(PL1)未定义指令异常处理
内核移植要点:在Linux内核启动初期,CPU处于SVC模式。设备树解析、MMU初始化、中断控制器配置等关键操作都在SVC模式下完成。理解模式切换机制有助于调试启动阶段的异常问题。

2.1.2 模式切换与异常等级

ARMv8-A引入的异常等级(EL)体系更加清晰:

  • EL0:用户态,运行应用程序,非特权。
  • EL1:操作系统内核态,运行Linux内核,特权。
  • EL2:虚拟机监视器(Hypervisor),运行KVM或Xen,更高特权。
  • EL3:安全监控器(Secure Monitor),运行ATF(ARM Trusted Firmware),最高特权。

处理器模式切换通过异常(Exception)或中断触发,硬件自动完成以下操作:保存返回地址到LR、保存CPSR到SPSR、更新CPSR模式位、跳转到异常向量表对应入口。

ARMv8-A 异常等级与模式切换关系 EL3 (Secure Monitor) EL2 (Hypervisor) EL1 (Kernel) EL0 (User) 异常向量表 同步异常(SVC/数据中止) IRQ 中断 FIQ 快速中断 SError 系统错误 每个EL有独立的 向量表基地址 通过VBAR_ELx配置 异常等级切换规则: • 同级或高级→低级:直接 • 低级→高级:通过异常 • 高级→低级:通过ERET

2.2 寄存器组织

ARM处理器的寄存器组织因架构版本和处理器模式而异。理解寄存器结构是编写启动代码、中断处理程序和上下文切换代码的基础。

2.2.1 ARMv7-A 寄存器组

ARMv7-A共有37个32位寄存器,包括:

  • 16个通用寄存器(R0-R15),其中R13(SP)为栈指针,R14(LR)为链接寄存器,R15(PC)为程序计数器。
  • 当前程序状态寄存器(CPSR)和5个备份程序状态寄存器(SPSR)。
  • 每种特权模式拥有自己的R13(SP)和R14(LR),FIQ模式额外拥有R8-R12的私有副本。
寄存器别名功能描述模式私有
R0-R3—参数传递/临时变量全局共享
R4-R11—局部变量保存全局共享
R12IP过程间调用暂存全局共享
R13SP栈指针每种模式私有
R14LR链接寄存器,保存返回地址每种模式私有
R15PC程序计数器全局共享
CPSR—当前程序状态寄存器全局唯一
SPSR—备份程序状态寄存器每种模式私有

2.2.2 ARMv8-A AArch64 寄存器组

AArch64状态下的寄存器组织更加规整:

  • 31个通用寄存器(X0-X30),其中X30为LR,X29为FP(帧指针)。
  • 栈指针寄存器(SP_EL0, SP_EL1, SP_EL2, SP_EL3),每个异常等级有独立的SP。
  • 程序计数器(PC),独立寄存器,不在通用寄存器组中。
  • 状态寄存器(PSTATE),包含NZCV标志、异常等级、执行状态等。
  • 系统寄存器(System Registers),通过MSR/MRS指令访问,用于配置MMU、Cache、中断等。
AArch64 寄存器组织架构 通用寄存器 X0-X30 X0-X7:参数/返回值 X8-X18:临时/调用者保存 X19-X28:被调用者保存 X29(FP):帧指针 X30(LR):链接寄存器 XZR:零寄存器 专用寄存器 PC SP_ELx PSTATE VBAR_ELx SPSR_ELx 系统寄存器 TTBR0/1_ELx SCTLR_ELx MAIR_ELx TCR_ELx ICC_/GICD_

2.3 异常处理

异常处理是ARM处理器响应外部事件或内部错误的机制。在设备树配置和内核移植中,异常向量表的正确设置直接关系到系统稳定性和中断响应性能。

2.3.1 异常向量表

ARMv7-A的异常向量表固定位于0x00000000(低向量)或0xFFFF0000(高向量),由SCTLR寄存器的V位控制。ARMv8-A则通过VBAR_ELx寄存器配置每个异常等级的向量表基地址。

偏移地址异常类型触发条件进入模式
0x00复位上电或复位信号SVC
0x04未定义指令执行未定义指令UND
0x08软件中断(SVC)执行SVC指令SVC
0x0C预取中止指令预取失败ABT
0x10数据中止数据访问失败ABT
0x14保留——
0x18IRQ普通中断请求IRQ
0x1CFIQ快速中断请求FIQ

2.3.2 异常处理流程

当异常发生时,ARM处理器硬件自动执行以下步骤:

  1. 保存返回地址:将当前PC值保存到对应模式的LR寄存器(LR_mode)。
  2. 保存状态:将CPSR保存到对应模式的SPSR寄存器(SPSR_mode)。
  3. 更新CPSR:设置CPSR的模式位为异常模式,禁用中断(置位I/F位)。
  4. 跳转向量:将PC设置为异常向量表中对应的入口地址。
  5. 软件处理:在异常处理程序中保存现场、识别异常源、执行处理、恢复现场。
  6. 异常返回:执行MOVS PC, LR(ARMv7)或ERET(ARMv8)指令,恢复CPSR和PC。
ARM 异常处理完整流程 ① 异常发生 IRQ/FIQ/数据中止 ② 硬件自动保存 PC→LR, CPSR→SPSR ③ 跳转向量表 PC→向量表入口 ④ 软件处理 保存现场/识别源 ⑤ 执行处理函数 中断服务/异常处理 ⑥ 恢复现场 恢复寄存器/状态 ⑦ 异常返回 ERET/MOVS PC,LR ⑧ 恢复执行 继续被中断的程序 内核移植注意事项: • 向量表必须对齐到2KB边界 • 中断处理函数不能使用FPU • 需保存被调用者保存寄存器
常见移植错误:在设备树配置中,中断控制器(GIC)的reg属性必须与异常向量表基地址一致。如果GIC基地址配置错误,会导致所有中断无法正确路由,系统表现为“中断风暴”或“无中断响应”。

2.4 MMU与Cache基础

内存管理单元(MMU)和Cache是现代ARM处理器实现虚拟内存、内存保护和性能优化的核心硬件模块。在设备树配置和内核移植中,MMU和Cache的初始化参数直接影响系统稳定性和性能。

2.4.1 MMU工作原理

MMU负责将虚拟地址(VA)转换为物理地址(PA),并检查访问权限。ARMv7-A使用两级页表(L1/L2),ARMv8-A使用四级页表(L0/L1/L2/L3)。

特性ARMv7-AARMv8-A AArch64
页表级数2级(L1/L2)4级(L0/L1/L2/L3)
页大小4KB/64KB/1MB/16MB4KB/16KB/64KB/2MB/1GB
基地址寄存器TTBR0/TTBR1TTBR0_ELx/TTBR1_ELx
控制寄存器TTBCRTCR_ELx
地址空间4GB(32位)48位/52位虚拟地址
权限模型AP[2:0] + XNAP[2:1] + PXN/UXN

2.4.2 Cache层次结构

ARM处理器通常包含多级Cache,用于缓解CPU与内存之间的速度差距:

  • L1 Cache:分为指令Cache(I-Cache)和数据Cache(D-Cache),通常各16KB-64KB,与CPU同频。
  • L2 Cache:统一Cache(指令+数据),通常256KB-2MB,位于CPU核心内部或集群共享。
  • L3 Cache:可选,通常2MB-8MB,多核共享,位于CPU集群外部。
ARM 多级Cache与MMU架构 CPU Core 执行单元 L1 I-Cache L1 D-Cache MMU VA→PA转换 TLB L2 Cache (统一) L3 Cache 多核共享