ARMv7-A 架构定义了多种处理器模式,每种模式都有不同的特权级别 、寄存器视图 和功能用途。理解这些模式是进行底层系统开发、异常处理和操作系统移植的基础。
1. 概述
ARMv7-A 架构定义了多种处理器运行模式,用于支持不同特权级别的软件执行、异常处理和系统安全扩展。处理器模式决定当前代码可以访问哪些资源、执行哪些特权指令,以及如何响应异常事件。
根据 ARM 官方架构参考手册,ARMv7-A 共定义了 9 种处理器模式:
1.1 九种模式一览
| 编号 | 模式名称 | 缩写 | 模式号 | 特权级别 | 主要用途 |
|---|---|---|---|---|---|
| 1 | User Mode | USR | 0x10 | PL0 (非特权) | 用户应用程序 |
| 2 | FIQ Mode | FIQ | 0x11 | PL1 | 快速中断处理 |
| 3 | IRQ Mode | IRQ | 0x12 | PL1 | 普通中断处理 |
| 4 | Supervisor Mode | SVC | 0x13 | PL1 | 操作系统内核、复位、软中断 |
| 5 | Monitor Mode | MON | 0x16 | PL1/PL2 | TrustZone 安全监视器 |
| 6 | Abort Mode | ABT | 0x17 | PL1 | 内存访问异常 |
| 7 | Hyp Mode | HYP | 0x1A | PL2 | 虚拟化 Hypervisor |
| 8 | Undefined Mode | UND | 0x1B | PL1 | 未定义指令异常 |
| 9 | System Mode | SYS | 0x1F | PL1 | 特权任务(共享用户寄存器) |
关于数量差异的说明 :许多入门资料仅介绍前 7 种模式,这是因为 Monitor 模式和 Hyp 模式属于可选扩展 (需要芯片实现 TrustZone 或虚拟化扩展),且在 ARMv6 及更早架构中不存在。但从 ARMv7-A 架构完整定义来看,9 种模式才是准确的答案。
1.2. CPSR 中的模式位编码
CPSR 的 M[4:0] 五个位决定当前处理器模式:
cpp
// CP15 中 M[4:0] 位的完整编码
#define USR_MODE 0x10 // 10000
#define FIQ_MODE 0x11 // 10001
#define IRQ_MODE 0x12 // 10010
#define SVC_MODE 0x13 // 10011
#define MON_MODE 0x16 // 10110 ← TrustZone
#define ABT_MODE 0x17 // 10111
#define HYP_MODE 0x1A // 11010 ← 虚拟化
#define UND_MODE 0x1B // 11011
#define SYS_MODE 0x1F // 11111
2. 处理器模式层级关系图




3. 各模式详细解析
3.1 User Mode(用户模式)
唯一非特权模式,用户应用程序的标准运行环境。
| 属性 | 说明 |
|---|---|
| 模式号 | 0x10 |
| CPSR.M[4:0] | 10000 |
| 特权级别 | PL0(非特权) |
| SPSR | 无 |
限制:不能执行特权指令(如 MCR/MRC 访问 CP15),不能修改 CPSR 的中断屏蔽位(I/F 位),无法直接访问系统控制寄存器。
典型用途:运行用户态应用程序、Linux 用户空间进程。
3.2 Supervisor Mode(管理模式)
操作系统内核的标准运行模式,ARMv7-A 中最常用的特权模式。
| 属性 | 说明 |
|---|---|
| 模式号 | 0x13 |
| CPSR.M[4:0] | 10011 |
| 特权级别 | PL1 |
| SPSR | 有 |
进入方式:
- 系统复位(Reset)
- 执行 SVC 指令产生软中断
- 某些异常从其他模式转入
典型用途:
-
Linux 内核运行在此模式
-
RTOS 的内核代码
-
Bootloader 主逻辑
; 从用户模式调用系统调用
SVC #0x80 ; 触发软中断,进入 SVC 模式
3.3 IRQ Mode(中断模式)
处理普通外部中断(可屏蔽中断)。
| 属性 | 说明 |
|---|---|
| 模式号 | 0x12 |
| CPSR.M[4:0] | 10010 |
| 特权级别 | PL1 |
| SPSR | 有 |
特点:
- 中断优先级低于 FIQ
- 可通过 CPSR.I 位屏蔽
- 进入时自动保存返回地址到 R14_irq,CPSR 到 SPSR_irq
典型用途:处理外设中断(定时器、UART、GPIO、I2C 等)。

3.4 FIQ Mode(快中断模式)
处理高优先级、低延迟中断,拥有专用寄存器组。
| 属性 | 说明 |
|---|---|
| 模式号 | 0x11 |
| CPSR.M[4:0] | 10001 |
| 特权级别 | PL1 |
| SPSR | 有 |
核心优势:
- 独立寄存器 R8_fiq ~ R12_fiq:无需保存这些寄存器的现场,响应最快
- 优先级高于 IRQ,可通过 CPSR.F 位屏蔽
- 位于向量表最后位置 0x1C
FIQ vs IRQ 对比:
| 特性 | FIQ | IRQ |
|---|---|---|
| 优先级 | 高 | 低 |
| 私有寄存器 | R8~R12(5个) | 无 |
| 中断延迟 | 极短 | 标准 |
| 典型场景 | DMA、实时控制 | 普通外设 |
3.5 Monitor Mode(监视器模式)------ TrustZone 安全扩展
该模式必须实现 TrustZone 安全扩展才存在。
| 属性 | 说明 |
|---|---|
| 模式号 | 0x16 |
| CPSR.M[4:0] | 10110 |
| 特权级别 | PL1(或 PL2 on some implementations) |
| SPSR | 有 |
功能 :在安全世界 和非安全世界之间切换,隔离安全敏感代码。
SMC #0 ; Secure Monitor Call,进入 Monitor 模式
典型用途:DRM 保护、安全支付、可信执行环境(TEE)。
3.6 Abort Mode(中止模式)
处理内存访问异常。
| 属性 | 说明 |
|---|---|
| 模式号 | 0x17 |
| CPSR.M[4:0] | 10111 |
| 特权级别 | PL1 |
| SPSR | 有 |
两种中止类型:
| 类型 | 触发原因 | 返回地址修正 |
|---|---|---|
| Prefetch Abort | 指令预取失败 | SUBS PC, LR, #4 |
| Data Abort | 数据访问失败 | SUBS PC, LR, #8 |
典型用途:缺页异常处理(Page Fault)、内存权限保护、虚拟内存管理。
3.7 Hyp Mode(虚拟化模式)------ 虚拟化扩展
该模式必须启用 Virtualization Extensions 才存在。
| 属性 | 说明 |
|---|---|
| 模式号 | 0x1A |
| CPSR.M[4:0] | 11010 |
| 特权级别 | PL2(高于 PL1) |
| SPSR | 有 |
功能 :运行 Hypervisor(虚拟机监控器),在多个操作系统之间进行隔离和调度。
HVC #0 ; Hypervisor Call,进入 Hyp 模式
3.8 Undefined Mode(未定义模式)
处理未定义指令异常。
| 属性 | 说明 |
|---|---|
| 模式号 | 0x1B |
| CPSR.M[4:0] | 11011 |
| 特权级别 | PL1 |
| SPSR | 有 |
触发条件:CPU 遇到无法识别的指令码、未实现的协处理器指令。
典型用途:软件模拟协处理器指令(如无硬件的 FPU 通过软件仿真浮点运算)、自定义指令扩展。
3.9 System Mode(系统模式)
与 User Mode 共享寄存器组,但拥有全特权。
| 属性 | 说明 |
|---|---|
| 模式号 | 0x1F |
| CPSR.M[4:0] | 11111 |
| 特权级别 | PL1 |
| SPSR | 无 |
核心优势 :拥有所有特权能力,但 R0~R14 寄存器与 User 模式完全相同,无需额外保存恢复。
进入方式 :通过 MSR 指令主动切换实现。
; 从 User 模式进入 System 模式
MRS R0, CPSR
BIC R0, R0, #0x1F
ORR R0, R0, #0x1F
MSR CPSR_c, R0
4. 运行模式与寄存器
ARMv7-A 采用部分银行式寄存器设计,不同模式拥有独立的 SP(R13)、LR(R14)和 SPSR。
| 寄存器 | User | System | Supervisor | IRQ | FIQ | Abort | Undef | Monitor | Hyp |
|---|---|---|---|---|---|---|---|---|---|
| R0-R7 | 共享 | 共享 | 共享 | 共享 | 共享 | 共享 | 共享 | 共享 | 共享 |
| R8-R12 | 共享 | 共享 | 共享 | 共享 | 独立 | 共享 | 共享 | 共享 | 共享 |
| R13 (SP) | SP_usr | SP_usr | SP_svc | SP_irq | SP_fiq | SP_abt | SP_und | SP_mon | SP_hyp |
| R14 (LR) | LR_usr | LR_usr | LR_svc | LR_irq | LR_fiq | LR_abt | LR_und | LR_mon | LR_hyp |
| R15 (PC) | PC | PC | PC | PC | PC | PC | PC | PC | PC |
| CPSR | CPSR | CPSR | CPSR | CPSR | CPSR | CPSR | CPSR | CPSR | CPSR |
| SPSR | 无 | 无 | SPSR_svc | SPSR_irq | SPSR_fiq | SPSR_abt | SPSR_und | SPSR_mon | SPSR_hyp |
说明 :System Mode 与 User Mode 完全共享 R0-R14,这是 System Mode 的核心特性。
5. 运行模式与特权等级
ARMv7-A 架构定义了多个运行模式 ,每个模式属于特定的特权等级(Exception Level)。特权等级决定了代码可以访问哪些系统资源、执行哪些特权指令。
5.1. 特权等级定义
ARMv7-A 架构定义了三个特权等级(Exception Levels):
| 特权等级 | 名称 | 权限 | 说明 |
|---|---|---|---|
| PL0 | 非特权模式 (Unprivileged) | 最低 | 只能访问受限资源,不能执行特权指令 |
| PL1 | 特权模式 (Privileged) | 中等 | 操作系统内核、异常处理程序 |
| PL2 | 虚拟化模式 (Hypervisor) | 最高 | 虚拟机监控器,控制多个操作系统 |
运行模式与特权等级的对应关系:
| 特权等级 | 包含的模式 |
|---|---|
| PL2 (最高) | Hyp Mode |
| PL1 (特权) | SVC, IRQ, FIQ, ABT, UND, SYS, MON |
| PL0 (非特权) | User Mode |
5.2. 特权等级详解
5.2.1 PL0(非特权级)
唯一模式:User Mode
典型用途:运行应用程序(Linux 用户空间、RTOS 任务)。
5.2.2 PL1(特权级)
包含 7 种模式,共享特权能力:
| 模式 | 特权级 | 特殊能力 |
|---|---|---|
| SVC | PL1 | 操作系统内核主模式 |
| IRQ | PL1 | 中断处理 |
| FIQ | PL1 | 快速中断(有私有寄存器) |
| ABT | PL1 | 内存异常处理 |
| UND | PL1 | 未定义指令处理 |
| SYS | PL1 | 与 User 模式共享寄存器 |
| MON | PL1 | TrustZone 安全监控 |
所有 PL1 模式共享的特权能力:
- 可以执行所有特权指令
- 可以访问 CP15(系统控制协处理器)
- 可以修改 CPSR 的中断控制位
- 可以管理 MMU/Cache
5.2.3 PL2(最高特权级)
唯一模式:Hyp Mode(虚拟化扩展)
| 特性 | 说明 |
|---|---|
| 权限 | 高于 PL1,可以控制虚拟机 |
| 指令 | HVC (Hypervisor Call) |
| 返回 | ERET 指令 |
| 典型用途 | KVM、Xen 等 Hypervisor |
5.3. 特权级对应的控制寄存器
| 特权级 | 可访问的控制寄存器 |
|---|---|
| PL0 | 无(只能通过 SVC/HVC 请求服务) |
| PL1 | SCTLR, TTBR0/1, DACR, VBAR, CPACR 等 |
| PL2 | HCR (Hypervisor Configuration Register), HTCR 等 |
5.4. 特权级转换方式
5.5. 特权级判断方法
在代码中识别当前特权等级的方法:
cpp
; 方法1:读取 CPSR 模式位
MRS R0, CPSR
AND R0, R0, #0x1F
; R0 = 0x10 (USR) → PL0
; R0 = 其他值 → PL1 或 PL2
; 方法2:尝试访问 CP15(权威方法)
MRC p15, 0, R0, c0, c0, 0 ; 读 MIDR
; 如果成功 → PL1/PL2
; 如果触发未定义异常 → PL0
; 方法3:读取 SCR 寄存器(仅 Monitor 模式可用)
MRC p15, 0, R0, c1, c1, 0 ; 读 SCR
; 如果成功 → Monitor 模式
使用C语言进行特权级检测
cpp
#include <stdio.h>
#include <signal.h>
// 检测当前特权等级
int get_privilege_level(void) {
unsigned int cpsr;
__asm__ volatile (
"MRS %0, CPSR\n"
: "=r" (cpsr)
);
unsigned int mode = cpsr & 0x1F;
if (mode == 0x10) return 0; // User → PL0
if (mode == 0x1A) return 2; // Hyp → PL2
return 1; // 其他 → PL1
}
int main() {
int pl = get_privilege_level();
printf("当前特权等级: PL%d\n", pl);
if (pl == 0) {
printf("运行在用户模式,无特权访问\n");
} else if (pl == 1) {
printf("运行在特权模式,可以访问 CP15\n");
} else if (pl == 2) {
printf("运行在 Hypervisor 模式,最高特权\n");
}
return 0;
}
5.6. 各模式与特权级汇总表
| 模式 | 特权级 | 核心用途 | 是否必须 |
|---|---|---|---|
| User | PL0 | 应用程序 | 是 |
| Supervisor (SVC) | PL1 | 操作系统内核 | 是 |
| IRQ | PL1 | 普通中断 | 是 |
| FIQ | PL1 | 快速中断 | 是 |
| Abort | PL1 | 内存异常 | 是 |
| Undefined | PL1 | 未定义指令 | 是 |
| System | PL1 | 特权任务 | 是 |
| Monitor | PL1 | TrustZone | 可选 |
| Hyp | PL2 | 虚拟化 | 可选 |
| 要点 | 说明 |
|---|---|
| PL0 | 仅 User Mode,非特权,性能最低 |
| PL1 | 7 种模式共享特权能力,权限中等 |
| PL2 | 仅 Hyp Mode,最高特权,用于虚拟化 |
| 模式转换 | 只能从低特权向高特权切换 |
| 异常返回 | 唯一从高特权回到低特权的合法途径 |
理解运行模式与特权等级的对应关系,是进行安全 RTOS/OS 开发的基础。例如:
- Linux 内核运行在 PL1 (SVC 模式)
- Linux 用户程序运行在 PL0 (User 模式)
- 特权切换通过 SVC 指令 实现系统调用
- 不涉及 TrustZone 时,Monitor 模式透明
- 不涉及虚拟化时,Hyp 模式不可见,所有 PL1 模式对操作系统透明
6. 模式切换方式
| 切换方式 | 说明 | 示例 |
|---|---|---|
| 硬件自动切换 | 异常/中断发生时 CPU 自动切换模式 | IRQ 信号 → IRQ 模式 |
| MSR 指令 | 特权模式下主动修改 CPSR.M 位 | MSR CPSR_c, #0x13 |
| 异常返回 | 执行 MOVS PC, LR 从 SPSR 恢复 CPSR | MOVS PC, LR |
| 复位 | 上电自动进入 SVC 模式 | - |


代码示例:主动切换模式
; 切换到 SVC 模式
MRS R0, CPSR
BIC R0, R0, #0x1F
ORR R0, R0, #0x13
MSR CPSR_c, R0
; 切换回 User 模式
MRS R0, CPSR
BIC R0, R0, #0x1F
ORR R0, R0, #0x10
MSR CPSR_c, R0
7. 总结
| 层级 | 模式 | 特权级 | 核心用途 |
|---|---|---|---|
| PL2 | Hyp Mode | 最高 | 虚拟机监控器 |
| PL1 | SVC, IRQ, FIQ, ABT, UND, MON, SYS | 高 | 内核、中断、异常、安全监控 |
| PL0 | User Mode | 低 | 用户应用程序 |
核心要点:
- ARMv7-A 完整定义 9 种模式 ,Monitor 和 Hyp 属于可选扩展
- User Mode 是唯一非特权模式,无法执行特权指令
- FIQ 拥有 5 个私有寄存器,可实现最快中断响应
- System Mode 复用 User 寄存器,适合无需保存现场的特权任务
理解运行模式是进行底层系统开发、操作系统移植和安全架构实现的基础。不同模式的特权级别设计,共同构建了 ARMv7-A 安全、高效的执行环境。