CP15协处理器
CP15协处理器
RM 特权等级(Exception Levels)
ARMv7/ARMv8 使用 Exception Levels (EL) 表示特权级,类似于 x86 的 Ring 0-3:
- EL0:用户态(User Mode),运行普通应用。
- EL1:内核态(Kernel Mode),运行操作系统内核。
- EL2:Hypervisor 模式(虚拟化)。
- EL3:Secure Monitor(安全监控模式,如 TrustZone)。
中断触发后,CPU 会自动从 EL0 提升到 EL1(或更高,取决于配置)
CP15(Co-Processor 15)是 ARM 架构中用于系统控制的协处理器,主要用于管理 CPU 核心的关键系统配置,如:
- 内存管理单元(MMU)(页表、TLB 控制)
- 缓存(Cache)控制
- 系统寄存器访问(如 SCTLR、ACTLR)
- 安全状态切换(TrustZone 相关)
- 性能监控(PMU 配置)
CP15 的寄存器只能通过 MRC(读) 和 MCR(写) 指令在特权模式(如内核态)下访问,用户态尝试访问会触发异常。
CP15 协处理器一般用于存储系统管理,但是在中断中也会使用到, CP15 协处理器一共有16 个 32 位寄存器
格式
CP15 协处理器的访问通过如下另个指令完成:
MRC: 将 CP15 协处理器中的寄存器数据读到 ARM 寄存器中。
MCR: 将 ARM 寄存器的数据写入到 CP15 协处理器寄存器中。
MRC 就是读 CP15 寄存器, MCR 就是写 CP15 寄存器, MCR 指令格式如下:
MCR{cond} p15, <opc1>, <Rt>, <CRn>, <CRm>, <opc2>
cond:指令执行的条件码,如果忽略的话就表示无条件执行。
opc1:协处理器要执行的操作码。
Rt: ARM 源寄存器,要写入到 CP15 寄存器的数据就保存在此寄存器中。
CRn: CP15 协处理器的目标寄存器。
CRm: 协处理器中附加的目标寄存器或者源操作数寄存器,如果不需要附加信息就将
CRm 设置为 C0,否则结果不可预测。
opc2: 可选的协处理器特定操作码,当不需要的时候要设置为 0。核心
在使用 MRC 或者 MCR 指令访问这 16 个寄存器的时候,指令中的 CRn、 opc1、 CRm 和 opc2 通过不同的搭配,其得到的寄存器含义是不同的。
相当于寄存器复用

例子

MCR操作c12,相当于操作的是VBAR寄存器
总结一下
1.通过 c0 寄存器可以获取到处理器内核信息;通过 c1 寄存器可以使能或禁止 MMU、 I/D Cache 等;通过 c12 寄存器可以设置中断向量偏移;通过 c15 寄存器可以获取 GIC 基地址
2.若所有寄存器都能直接通过内存地址访问,用户态程序(EL0)可能通过地址映射篡改内核控制寄存器(如 VBAR_EL1),导致系统崩溃或被攻击。
解决方案
CP15 的寄存器只能通过 MRC/MCR 指令访问,而这两条指令在用户态执行时会触发异常。
类比*:就像银行金库需要专用钥匙(特权指令),而非普通门卡(内存访问)。
3.思考:为什么要通过CP15协处理器来访问VBAR等用户态不能访问的寄存器?不能直接操作MRC/MCR吗?
答:可以,ARM内核版本不同,
- ARMv7:必须通过
MRC/MCR+ CP15 访问系统寄存器。 - ARMv8:优先使用
MRS/MSR+ 命名寄存器,CP15 仅用于兼容。

MRS/MSR在 ARMv8 中已独立,无需 CP15 即可访问大多数系统寄存器。- CP15 是 ARMv7 的遗留机制,ARMv8 为兼容性保留,但新代码应避免使用。
ARMv8 的设计正是为了解决 ARMv7 的复杂性,让系统寄存器访问更直观。

