ARM 协处理器(Coprocessor)是 ARM 架构中用于扩展处理器功能的模块,通过专用指令(如 MCR
、MRC
)与主处理器(CPU)协同工作。协处理器通常用于实现系统控制、浮点运算、硬件加速等高级功能。以下是 ARM 协处理器的核心概念及典型应用:
一、协处理器基本概念
特性 | 说明 |
---|---|
数量 | ARM 架构支持最多 16 个协处理器(CP0-CP15) |
功能 | 每个协处理器有独立指令和寄存器,用于扩展 CPU 能力 |
访问权限 | 协处理器操作通常需在 特权模式(如 SVC、ABT)下执行 |
常见协处理器 | - CP15 :系统控制(MMU、缓存、内存保护) - CP14 :调试功能 - CP10/CP11:浮点运算(VFP/NEON) |
二、协处理器指令
1. 核心指令
指令 | 格式 | 功能 |
---|---|---|
MCR |
MCR{cond} p#, <op1>, Rt, CRn, CRm, <op2> |
将 CPU 寄存器写入协处理器寄存器 |
MRC |
MRC{cond} p#, <op1>, Rt, CRn, CRm, <op2> |
从协处理器寄存器读取到 CPU 寄存器 |
参数说明:
p#
:协处理器编号(如p15
表示 CP15)op1
/op2
:操作码(定义具体操作)CRn
:目标协处理器寄存器CRm
:附加寄存器(通常用于扩展操作)Rt
:CPU 通用寄存器
2. 示例
armasm
; 读取 CP15 的 Main ID 寄存器(MIDR)到 R0
MRC p15, 0, R0, c0, c0, 0
; 将 R1 的值写入 CP15 的 控制寄存器(SCTLR)
MCR p15, 0, R1, c1, c0, 0
三、关键协处理器:CP15(系统控制协处理器)
CP15 是 ARM 系统中最重要的协处理器,用于管理核心硬件功能:
1. 主要功能
寄存器 | 功能 | 典型操作 |
---|---|---|
c0 | 系统信息(MIDR、CTR) | 读取 CPU ID、缓存类型 |
c1 | 系统控制(SCTLR) | 启用 MMU、缓存、对齐检查 |
c2 | 地址翻译(TTBR0/TTBR1) | 配置页表基地址 |
c3 | 域访问控制(DACR) | 定义内存域权限 |
c7 | 缓存维护(C7) | 无效化缓存/TLB |
c12 | 异常基址(VBAR) | 设置异常向量表地址 |
2. 典型应用
启用 MMU:
armasm
MRC p15, 0, R0, c1, c0, 0 ; 读取 SCTLR
ORR R0, R0, #(1 << 0) ; 设置 M 位(启用 MMU)
MCR p15, 0, R0, c1, c0, 0 ; 写回 SCTLR
ISB ; 确保指令生效
无效化指令缓存:
armasm
MOV R0, #0
MCR p15, 0, R0, c7, c5, 0 ; ICIALLU(无效化所有指令缓存)
DSB ; 数据同步屏障
ISB ; 指令同步屏障
四、其他协处理器
1. CP10/CP11(浮点与 SIMD)
-
功能:支持浮点运算(VFP)和 SIMD(NEON)指令
-
启用步骤 :
armasm; 启用 CP10/CP11 访问权限 MRC p15, 0, R0, c1, c0, 2 ; 读取 CPACR ORR R0, R0, #(0xF << 20) ; 设置 CP10/CP11 权限位 MCR p15, 0, R0, c1, c0, 2 ; 写回 CPACR ISB ; 启用 VFP/NEON VMRS R0, FPEXC ORR R0, R0, #(1 << 30) ; 设置 FPEXC.EN 位 VMSR FPEXC, R0
2. CP14(调试)
-
功能:管理硬件断点、观察点、调试状态
-
典型操作 :
armasm; 设置硬件断点 MCR p14, 0, R0, c0, c0, 0 ; 写入调试地址到 DBGDTR
五、注意事项
- 特权模式 :协处理器指令需在 特权模式(如 SVC、ABT)下执行,用户模式会触发异常。
- 内存屏障 :修改系统配置后需使用
DSB
/ISB
确保操作完成。 - 兼容性:不同 ARM 架构(如 ARMv7-A 与 ARMv8-A)的协处理器行为可能不同。
六、参考文档
- 《ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition》
- 《Cortex-A7 Technical Reference Manual》
- 《ARMv8-A Architecture Reference Manual》
协处理器是 ARM 系统级编程的核心工具,深入理解其使用对开发 Bootloader、内核驱动和性能优化至关重要。