• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

ARMv8-R中MRC指令详解

在 ARMv8-R 架构(面向实时应用的 R-Profile)中,MRC 指令是 "Move to ARM Register from Coprocessor" 的缩写。

它的核心功能是:将一个值从指定的协处理器寄存器读取到 ARM 通用寄存器中。

以下是关键点的详细解释:

  1. 协处理器访问:

    • ARM 架构(包括 A-Profile 和 R-Profile)历史上使用“协处理器”的概念来扩展处理器的功能。这些协处理器处理特定的任务,例如:
      • CP15 (System Control Coprocessor): 这是最重要的协处理器,用于系统配置和控制。它管理内存系统(MMU/MPU)、缓存、分支预测、系统特性配置(如对齐检查、端序)、性能监控、安全状态访问等。
      • CP10/CP11:传统上用于浮点和 NEON SIMD 操作(在 ARMv8-R 中,这些功能通常通过 VFP/SIMD 指令直接访问,而不是通过 MRC/MCR)。
    • MRC 指令是与这些协处理器(尤其是 CP15)交互的主要机制之一。
  2. 指令格式:

    MRC{cond} p#, <Opcode1>, <Rt>, <CRn>, <CRm>{, <Opcode2>}
    
    • {cond}:可选的条件码(如 EQ, NE)。
    • p#:协处理器编号(例如 p15 表示系统控制协处理器)。
    • <Opcode1>:协处理器特定的主操作码(通常是一个立即数,如 0)。
    • <Rt>:目标 ARM 通用寄存器(如 r0, r1),协处理器寄存器的值将被读取到这里。
    • <CRn>:源协处理器寄存器编号(指定协处理器内的主寄存器)。
    • <CRm>:源协处理器寄存器编号(通常用于指定 <CRn> 的附属寄存器或提供额外修饰)。
    • <Opcode2>:协处理器特定的次操作码(通常是一个立即数,如 0)。
  3. 用途 (主要与 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 (具体取决于计数器和事件)。
  4. 权限要求:

    • 访问大多数 CP15 寄存器(特别是系统控制、内存系统配置寄存器)需要特权模式(在 ARMv8-R 中通常是 EL2 或 EL1,具体取决于寄存器和安全状态配置)。
    • 在用户模式(EL0)执行 MRC p15 指令通常会导致未定义指令异常或权限错误。
  5. 与 MCR 的关系:

    • MRC 的逆操作是 MCR (Move to Coprocessor from ARM Register),用于将 ARM 通用寄存器中的值写入到协处理器寄存器(主要是 CP15)。系统配置通常需要成对使用 MRC(读取当前值)、修改、MCR(写回新值)。
  6. 在 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-R 中,MRC 指令用于从协处理器(主要是系统控制协处理器 CP15)的寄存器中读取一个值到 ARM 通用寄存器中。 它是进行底层系统配置查询(如读取 MMU/MPU 设置、缓存信息、处理器特性、控制寄存器状态等)的关键指令。访问通常需要特权模式权限。它是与 MCR(写入协处理器)相对应的读取操作。ARMv8-R 保留此指令以维持与现有实时软件的兼容性。

posted on 2025-08-01 22:06  SOC验证工程师  阅读(60)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3