理解ARM7上的MRC

11

我是ARM的新手,正在尝试理解MRC指令。

据我所知,MRC是读取协处理器寄存器并将其放入主核心寄存器的指令。

现在,协处理器连接到主核心并用于控制主核心的存储子系统。协处理器是如何连接到主核心处理器的?有人能指向一些好的图表吗?

现在,在arm7 cpu核心上执行以下指令:

  /* workaround to disable secure state */
     mrc     p15, #0, r0, c1, c1, #0
     orr     r0, r0, #1
     mcr     p15, #0, r0, c1, c1, #0
     isb

现在我只是找不到mrc指令中发生了什么。

1.mrc的第一个参数是协处理器编号(p0与p15有何不同)。

2.第二个参数是协处理器的opcode1(不确定)。

3.第三个参数是主核心寄存器(没问题)。

4.第四和第五个参数是协处理器寄存器(c1,#0的结果是否存储为c1)?

5.最后一个参数是opcode2(不确定)。

谢谢。


请查看协处理器问题。例如什么是MRC命令Peter Cockerell等。 - artless noise
MRC/MCR指令是通用的。您必须参考特定的文档,如VFPNeonCP15CP15是一个捕获所有不内置到指令集中并且面向操作系统程序员的东西。它可能包括MMU、缓存控制、保护单元、快速上下文切换、写缓冲区、TrustZone、HyperVisor、向量表等。与指令集不同,CP15不保持向后兼容性。 - artless noise
感谢@artlessnoise提供这些有用的链接。 - Amit Singh Tomar
2
你是不是想说ARMv7而不是ARM7? - old_timer
1个回答

30

协处理器在ARM中是一个误导性概念。它是可选功能的简称,不通过核心指令集公开。ARM CPU 是模块化的。CPU 硬件中有一些位和组件,架构实现者可能会或可能不会放置在芯片上。内存管理单元(MMU)就是其中一个例子;还有其他硬件调试设备。这些确实用协处理器编号(pXX)标识,以使多个协处理器可以同时存在。MMU 的协处理器号传统上为 p15。p0..p14 协处理器与内存管理无关,可能不存在。例如,调试子系统为 p14。

MRC 和 MCR 命令用于向协处理器发送命令。助记符再次有些误导性——命令的效果可能不止是寄存器移动。它更像是 MRC 代表“向协处理器发送命令并获取一些数据”,而 MCR 则是“向协处理器发送命令并传递一些数据”。就这样思考吧。这就是操作码的含义——这是传递给协处理器的命令。有时,具有特定协处理器号和操作码的 MCR/MRC 命令甚至会在汇编程序中获得单独的助记符 (例如 FPU 命令)。

协处理器操作码和寄存器编号的确切细节因一个协处理器而异。由于您感兴趣的是 MMU,请阅读有关该特定 MMU 的文档;它将解释特定操作如何映射到操作码和协处理器寄存器编号。


感谢@Seva的友善回答。也许这是一个愚蠢的问题,但我可以说协处理器不是一个物理实体,它只是另一组指令运行和控制各种子系统,如MMU子系统吗?此外,您能否提供一些文档,让我可以阅读您建议我阅读的内容。 - Amit Singh Tomar
2
像缓存和FPU等,它们都是物理实体。您应该能够查看ARM核心的技术参考手册,以查看可选的跳线带,以启用/禁用逻辑等。但有些内容您可能无法在没有ARM逻辑本身的情况下看到。请注意,浮点单元一直只是协处理器,这可以从指令的机器编码中看出来。 - old_timer
1
它不是一个独立的芯片,但它确实是物理存在的。它是CPU芯片上实现功能的一个区域。 - Seva Alekseyev
2
可以说MMU子系统是一个协处理器,FPU是另一个协处理器。 - Seva Alekseyev
1
这基本上是正确的。CP15MMU更多,它是ARM实现的额外功能。普通的用户空间不应该需要接触CP15代码;而使用其他类型的协处理器用户模式下是常见/可能的。请参见:ldccdpstc以及特殊目的指令。Heyrick的协处理器命令也是一个很好的参考。一般来说,在所有现代ARMs中,Seva是正确的,它们都在同一芯片中。然而,由于它们被实现为协处理器,这通常是一个选项 - artless noise
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接