Cortex-A7的运行模式

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 安全、高效的执行环境。

相关推荐
zhangrelay2 小时前
三分钟云课实践速通--C/C++程序设计--
linux·c语言·c++·笔记·学习·ubuntu
Max_uuc2 小时前
【调度心法】别用 Mutex 制造“人质危机”!撕碎互斥锁的防御幻觉,论优先级反转与火星探测器的史诗级瘫痪
linux·运维·制造
孙同学_2 小时前
【Linux篇】NTA机制与网络地址转换原理详解
linux·网络·智能路由器
小趴菜要进步2 小时前
Kali/Linux 更改国内镜像源
linux·运维·服务器
ZHANG13HAO2 小时前
海思 Hi3516+ML307 双模 4G 在线方案:KOL 视频 AI 不掉线、长连接稳在线
arm开发
cookies_s_s2 小时前
C++ 内存模型与无锁编程:从底层原理到实战
linux·服务器·开发语言·c++
郝学胜-神的一滴3 小时前
Python 鸭子类型:优雅的多态哲学,让代码更自由
linux·服务器·开发语言·python·网络协议
北冥湖畔的燕雀3 小时前
POSIX信号量操作全解析
linux·运维·服务器
feng_you_ying_li4 小时前
linux之重定向原理与缓冲区基本介绍
linux