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) | 未定义指令异常处理 |
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模式位、跳转到异常向量表对应入口。
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 | — | 局部变量保存 | 全局共享 |
| R12 | IP | 过程间调用暂存 | 全局共享 |
| R13 | SP | 栈指针 | 每种模式私有 |
| R14 | LR | 链接寄存器,保存返回地址 | 每种模式私有 |
| R15 | PC | 程序计数器 | 全局共享 |
| 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、中断等。
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 | 保留 | — | — |
| 0x18 | IRQ | 普通中断请求 | IRQ |
| 0x1C | FIQ | 快速中断请求 | FIQ |
2.3.2 异常处理流程
当异常发生时,ARM处理器硬件自动执行以下步骤:
- 保存返回地址:将当前PC值保存到对应模式的LR寄存器(LR_mode)。
- 保存状态:将CPSR保存到对应模式的SPSR寄存器(SPSR_mode)。
- 更新CPSR:设置CPSR的模式位为异常模式,禁用中断(置位I/F位)。
- 跳转向量:将PC设置为异常向量表中对应的入口地址。
- 软件处理:在异常处理程序中保存现场、识别异常源、执行处理、恢复现场。
- 异常返回:执行MOVS PC, LR(ARMv7)或ERET(ARMv8)指令,恢复CPSR和PC。
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-A | ARMv8-A AArch64 |
|---|---|---|
| 页表级数 | 2级(L1/L2) | 4级(L0/L1/L2/L3) |
| 页大小 | 4KB/64KB/1MB/16MB | 4KB/16KB/64KB/2MB/1GB |
| 基地址寄存器 | TTBR0/TTBR1 | TTBR0_ELx/TTBR1_ELx |
| 控制寄存器 | TTBCR | TCR_ELx |
| 地址空间 | 4GB(32位) | 48位/52位虚拟地址 |
| 权限模型 | AP[2:0] + XN | AP[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集群外部。