ARMv8-R中MRC指令详解
在 ARMv8-R 架构(面向实时应用的 R-Profile)中,MRC 指令是 "Move to ARM Register from Coprocessor" 的缩写。
它的核心功能是:将一个值从指定的协处理器寄存器读取到 ARM 通用寄存器中。
以下是关键点的详细解释:
-
协处理器访问:
- ARM 架构(包括 A-Profile 和 R-Profile)历史上使用“协处理器”的概念来扩展处理器的功能。这些协处理器处理特定的任务,例如:
- CP15 (System Control Coprocessor): 这是最重要的协处理器,用于系统配置和控制。它管理内存系统(MMU/MPU)、缓存、分支预测、系统特性配置(如对齐检查、端序)、性能监控、安全状态访问等。
- CP10/CP11:传统上用于浮点和 NEON SIMD 操作(在 ARMv8-R 中,这些功能通常通过 VFP/SIMD 指令直接访问,而不是通过
MRC/MCR)。
MRC指令是与这些协处理器(尤其是 CP15)交互的主要机制之一。
- ARM 架构(包括 A-Profile 和 R-Profile)历史上使用“协处理器”的概念来扩展处理器的功能。这些协处理器处理特定的任务,例如:
-
指令格式:
MRC{cond} p#, <Opcode1>, <Rt>, <CRn>, <CRm>{, <Opcode2>}{cond}:可选的条件码(如EQ,NE)。p#:协处理器编号(例如p15表示系统控制协处理器)。<Opcode1>:协处理器特定的主操作码(通常是一个立即数,如0)。<Rt>:目标 ARM 通用寄存器(如r0,r1),协处理器寄存器的值将被读取到这里。<CRn>:源协处理器寄存器编号(指定协处理器内的主寄存器)。<CRm>:源协处理器寄存器编号(通常用于指定<CRn>的附属寄存器或提供额外修饰)。<Opcode2>:协处理器特定的次操作码(通常是一个立即数,如0)。
-
用途 (主要与 CP15 相关):
- 读取系统配置和控制寄存器: 这是
MRC最常见的用途。例如:- 读取
SCTLR(System Control Register):MRC p15, 0, <Rt>, c1, c0, 0 - 读取
TTBR0(Translation Table Base Register 0):MRC p15, 0, <Rt>, c2, c0, 0 - 读取
DACR(Domain Access Control Register):MRC p15, 0, <Rt>, c3, c0, 0 - 读取
MPU区域寄存器 (如PRBAR,PRLAR):MRC p15, 0, <Rt>, c6, cX, Y(X, Y 具体值取决于区域和属性) - 读取
VBAR(Vector Base Address Register):MRC p15, 0, <Rt>, c12, c0, 0 - 读取
CPACR(Coprocessor Access Control Register):MRC p15, 0, <Rt>, c1, c0, 2 - 读取进程 ID (
CONTEXTIDR) 或线程 ID (TPIDRURW,TPIDRURO,TPIDRPRW) 寄存器。 - 读取缓存维护操作的状态/结果。
- 读取
- 读取标识和特性寄存器: 获取处理器核心、架构版本、特性支持等信息。
- 读取
MIDR(Main ID Register):MRC p15, 0, <Rt>, c0, c0, 0 - 读取
CTR(Cache Type Register):MRC p15, 0, <Rt>, c0, c0, 1 - 读取
ID_PFR0/1(Processor Feature Register):MRC p15, 0, <Rt>, c0, c1, 0/1 - 读取
CCSIDR(Cache Size ID Register):MRC p15, 1, <Rt>, c0, c0, 0(需要先设置CSSELR)
- 读取
- 读取性能监控计数器:
MRC p15, 0, <Rt>, c9, c12, 5/6(具体取决于计数器和事件)。
- 读取系统配置和控制寄存器: 这是
-
权限要求:
- 访问大多数 CP15 寄存器(特别是系统控制、内存系统配置寄存器)需要特权模式(在 ARMv8-R 中通常是 EL2 或 EL1,具体取决于寄存器和安全状态配置)。
- 在用户模式(EL0)执行
MRC p15指令通常会导致未定义指令异常或权限错误。
-
与
MCR的关系:MRC的逆操作是MCR(Move to Coprocessor from ARM Register),用于将 ARM 通用寄存器中的值写入到协处理器寄存器(主要是 CP15)。系统配置通常需要成对使用MRC(读取当前值)、修改、MCR(写回新值)。
-
在 ARMv8-R/A 中的位置:
- 虽然 ARMv8-A 引入了新的
MSR/MRS语法(使用命名的系统寄存器,如mrs x0, sctlr_el1)来替代大部分MRC/MCR对 CP15 的访问,但 ARMv8-R 为了保持与经典 ARM 实时软件(尤其是使用 ARMv7-R 编写的软件)的兼容性,仍然主要依赖MRC和MCR指令来访问系统控制功能(CP15)。 - ARMv8-R 规范中明确包含了这些协处理器指令。访问 VFP/SIMD 寄存器通常使用专用的 VFP/SIMD 指令(
VMRS/VMSR用于状态和控制寄存器,VLDR/VSTR等用于数据)。
- 虽然 ARMv8-A 引入了新的
总结:
在 ARMv8-R 中,MRC 指令用于从协处理器(主要是系统控制协处理器 CP15)的寄存器中读取一个值到 ARM 通用寄存器中。 它是进行底层系统配置查询(如读取 MMU/MPU 设置、缓存信息、处理器特性、控制寄存器状态等)的关键指令。访问通常需要特权模式权限。它是与 MCR(写入协处理器)相对应的读取操作。ARMv8-R 保留此指令以维持与现有实时软件的兼容性。
浙公网安备 33010602011771号