原文参考:http://hi.baidu.com/wuqi19881003/item/d4b9c325ba096480af48f50f
协处理器(coprocessor),一种芯片,用于减轻系统微处理器的特定处理任务。
ARM 微处理器可支持多达 16 个协处理器用于各种协处理操作。
在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略 ARM 处理器和其他协处理器的指令。
ARM 的协处理器指令主要用于 ARM 处理器初始化 ARM 协处理器的数据处理操作,以及在ARM 处理器的寄存器和协处理器的寄存器之间传送数据,和在 ARM 协处理器的寄存器和存储器之间传送数据。
ARM协处理器包括以下5条:
CDP:协处理器数操作指令。
LDC:协处理器数据加载指令。
STC:协处理器存储指令。
MCR:ARM处理器寄存器到协处理器寄存器的数据传送指令。(ARM->协)
MRC:协处理器寄存器到ARM处理器寄存器的数据传送指令。(协->ARM)
1、CDP指令
CDP指令的格式为:
CDP{条件} 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。
CDP指令用于ARM处理器通知ARM协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,目的寄存器和源寄存器均为协处理器的寄存器,指令不涉及ARM处理器的寄存器和存储器。
指令示例:
CDP P3,2,C12,C10,C3,4 ;该指令完成协处理器P3的初始化
2、LDC指令
LDC指令的格式为:
LDC{条件}{L} 协处理器编码,目的寄存器,[源寄存器]
LDC指令用于将源寄存器所指向的存储器中的字数据传送到目的寄存器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输。
指令示例:
LDC P3,C4,[R0] ;将ARM处理器的寄存器R0所指向的存储器中的字数据传送到协处理器P3的寄存器C4中。
3、STC指令
STC指令的格式为:
STC{条件}{L} 协处理器编码,源寄存器,[目的寄存器]
STC指令用于将源寄存器中的字数据传送到目的寄存器所指向的存储器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输。
指令示例:
STC P3,C4,[R0] ;将协处理器P3的寄存器C4中的字数据传送到ARM处理器的寄存器R0所指向的存储器中。
4、MCR指令
MCR指令的格式为:
MCR{条件} 协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2。
MCR指令用于将ARM处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,源寄存器为ARM处理器的寄存器,目的寄存器1和目的寄存器2均为协处理器的寄存器。
指令示例:
MCR P3,3,R0,C4,C5,6 ;该指令将ARM处理器寄存器R0中的数据传送到协处理器P3的寄存器C4和C5中。
5、MRC指令
MRC指令的格式为:
MRC{条件} 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。
MRC指令用于将协处理器寄存器中的数据传送到ARM处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,目的寄存器为ARM处理器的寄存器,源寄存器1和源寄存器2均为协处理器的寄存器。
指令示例:
MRC P3,3,R0,C4,C5,6 ;该指令将协处理器P3的寄存器中的数据传送到ARM处理器寄存器中。
下面重点分析一下MCR/MRC指令的参数,寄存器指令编码共32位。
MRC/MCR{条件} 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。
{条件}:在ARM的指令编码表中,统一占用编码的最高四位【31:28】来表示“条件吗”。
协处理器编码:p15,这个没什么好说的,代表的是协处理器。
协处理器操作码1【23:30】:协处理器代码。定义协处理器特定码,在CP15中为c15。
目的寄存器【15:21】:ARM寄存器,定义向协处理器传输数据的ARM寄存器。如果选择了R15(PC),则结果无法预测。
源寄存器1【19:16】:协处理器寄存器。定义目的协处理器寄存器。
源寄存器2【3:0】:特定的协处理器操作。确定特定的协处理器操作,其值取决于CP15寄存器。
协处理器操作码2【7:5】:确定特定的协处理器操作码,默认情况为0。
CP15协处理器总共有16个寄存器,我写一下几个主要的:
寄存器0:包含了硬件信息。该寄存器为只读寄存器,读访问内容由操作码2域值确定。
寄存器1:控制寄存器,通过读该寄存器,将得到各种控制为,在程序执行之前,首先要通过协处理器指令来配置控制寄存器每一位的值。
寄存器7:只写寄存器,用于管理指令缓存(I-Cache)和数据缓存(D-Cache)。
寄存器8:TLB工作寄存器或转换后备缓冲器工作寄存器,用于管理指令TLB与数据TLB。使用操作码2及写CP15寄存器8的MRC指令中的源寄存器2域选定TLB工作。
关于两个操作吗,我也没搞明白,请高手指点。。。。