什么是协处理器

  协处理器是一种芯片,用于减轻系统微处理器的特定处理任务。例如,数学协处理器可以控制数字处理;图形协处理器可以处理视频绘制。例如,intel pentium微处理器就包括内置的数学协处理器。
  协处理器可以附属于ARM处理器。一个协处理器通过扩展指令集或提供配置寄存器来扩展内核处理功能。一个或多个协处理器可以通过协处理器接口与ARM内核相连。
  协处理器可以通过一组专门的、提供load-store类型接口的ARM指令来访问。例如协处理器15(CP15),ARM处理器使用协处理器15的寄存器来控制cache、TCM和存储器管理。
  协处理器也能通过提供一组专门的新指令来扩展指令集。例如,有一组专门的指令可以添加到标准ARM指令集中,以处理向量浮点(VFP)运算。
  这些新指令是在ARM流水线的译码阶段被处理的。如果在译码阶段发现是一条协处理器指令,则把它送给相应的协处理器。如果该协处理器不存在,或不认识这条指令,则ARM认为发生了未定义指令异常。这也使得编程者可以用软件来仿真协处理器的行为(使用未定义指令异常服务子程序)。
  80486CPU之前有协处理器,提高浮点运算能力,那时cpu较弱才有的协处理器,现在速度是原来数百倍不止,pc机一般不存在协处理器了。
  ARM 微处理器可支持多达 16 个协处理器,用于各种协处理操作,在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略 ARM 处理器和其他协处理器的指令。ARM 的协处理器指令主要用于:ARM 处理器初始化,ARM 协处理器的数据处理操作,以及在ARM 处理器的寄存器和协处理器的寄存器之间传送数据,和在 ARM 协处理器的寄存器和存储器之间传送数据。ARM 协处理器指令包括以下 5 条:
— CDP 协处理器数操作指令

— LDC 协处理器数据加载指令

— STC 协处理器数据存储指令

— MCR ARM处理器寄存器到协处理器寄存器的数据传送指令

— MRC 协处理器寄存器到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 处理器寄存器中.
再举个例子:
mrc p15,0,r0,c1,c0,0;将协处理器p15的寄存器中的数据传送到ARM处理器的寄存器r0中,其中1是协处理器操作码1,0是协处理器操作码2,c1存放第一个操作数的协处理器寄存器,c0存放第二个操作数的协处理器寄存器

CP15协处理器详解

1、CP15的作用及指令

  CP15-系统控制协处理器 (the system control coprocessor)他通过协处理器指令MCR和MRC提供具体的寄存器来配置和控制caches、MMU、保护系统、配置时钟模式(在bootloader时钟初始化用到)。CP15的寄存器只能被MRC和MCR(Move to Coprocessor from ARM Register )指令访问,其格式如下:

MCR{cond} p15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>
MRC{cond} p15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>
  • 1
  • 2

cond:为指令执行的条件码。当cond忽略时指令为无条件执行。
Opcode_1:协处理器的特定操作码. 对于CP15寄存器来说,opcode1永远为0,不为0时,操作结果不可预知
Rd:作为源寄存器的ARM寄存器,其值将被传送到协处理器寄存器中,或者将协处理器寄存器的值传送到该寄存器里面
CRn:作为目标寄存器的协处理器寄存器,其编号可能是C0,C1,…,C15。
CRm:协处理器中附加的目标寄存器或源操作数寄存器。如果不需要设置附加信息,将CRm设置为c0,否则结果未知
Opcode_2:可选的协处理器特定操作码。(用来区分同一个编号的不同物理寄存器,当不需要提供附加信息时,指定为0)
  在基于ARM的嵌入式系统中,存储系统通常是通过系统控制协处理器CP15完成的。CP15可以包含16个32位的寄存器,其编号为0-15。实际上对于某些编号的寄存器可能对应有多个物理寄存器。在指令中指定特定的标志位(CRm和Opcode_2)来区分这些物理寄存器。有些类似于ARM寄存器中,处于不同的处理器模时,ARM某些寄存器可能不同。

2、CP15的寄存器介绍

CP15 的寄存器列表如下表所示:

2.1 CP15 的寄存器 C0

  CP15 中寄存器 C0 对应两个标识符寄存器,由访问 CP15 的寄存器指令指定要访问哪个具体物理寄存器,与两个标识符寄存器的对应关系如下所示:

opcode2 编码 对应的标识符号寄存器
0b000 主标识符寄存器
0b001 cache类型标识符寄存器
其 他 保留

1、主标识符寄存器
指令格式:MRC P15,0,R0,C0,C0,0 #将主标示符寄存器的内容读到AMR寄存器R0中
主标示符的编码格式对于不同的ARM处理器版本有所不同。对于AMR7之后的处理器,其主标示符编码格式如下 :

30~24 23~20 19~16 15~4 3~0
由生产商确定 产品子编号 ARM 体系版本号 产品主编号 处理器版本号

各部分的编码详细含义如下表所示:

2、cache类型标识符寄存器
指令格式:MRC P15,0,R0,C0,C0,1 #将cache类型标识符寄存器的内容读到AMR寄存器R0中
ARM 处理器中 cache 类型标识符寄存器的编码格式如下所示:

31~29 28~25 24 23~12 11~0
000 属性字段 S 数据 cache 相关属性 指令cache 相关属性

各部分的编码详细含义如下表所示:

含义
位[28: 25] 主要用于定义对于写回类型的cache的一些属性
位[24] 定义系统中的数据 cache 和指令 cache 是分开的还是统一的:
0: 系统的数据 cache 和指令 cache 是统一的
1: 系统的数据 cache 和指令 cache 是分开的
位 [23: 12] 定义数据 cache 的相关属性,如果位 [24] 为 0 ,本字段定义整个cache 的属性
位 [31: 24] 定义指令 cache 的相关属性,如果位 [24] 为 0 ,本字段定义整个cache 的属性

控制字段位 [28 : 25] 的含义
主要用于定义对于写回类型的cache的一些属性,cache 类型标识符寄存器的控制字段位 [28 : 25]:

编 码 cache 类型 cache 内容清除方法 cache 内容锁定方法
0b0000 写通类型 不需要内容清除 不支持内容锁定
0b0001 写回类型 数据块读取 不支持内容锁定
0b0010 写回类型 由寄存器 C7 定义 不支持内容锁定
0b0110 写回类型 由寄存器 C7 定义 支持格式 A
0b0111 写回类型 由寄存器 C7 定义 支持格式 B

控制字段位 [23 : 12] 及控制字段位 [11 : 0] 含义
[23:12]用于定义数据cache的属性,[11: 0]用于定义指令cache的属性。编码格式如下:

11~9 8~6 5~3 2 1~0
000 cache 容量 cache 相联特性 M 块大小

其中bits[1:0]含义如下:

编 码 cache 块大小
0b00 2 个 字( 8 字节)
0b01 4 个 字( 16 字节)
0b10 8 个 字( 32 字节)
0b11 16 个 字( 64 字节)

其中bits[5:3]含义如下:

编 码 M=0 时含义 M=1 时含义
0b000 1 路 相联(直接映射) 没有 cache
0b001 2 路 相联 3 路 相联
0b010 4 路 相联 6 路 相联
0b011 8 路 相联 12 路 相联
0b100 16 路 相联 24 路 相联
0b101 32 路 相联 48 路 相联
0b110 64 路 相联 96 路 相联
0b111 128 路相联 192 路相联

其中bits[8:6]含义如下:

编 码 M=0 时含义 M=1时含义
0b000 0.5KB 0.75 KB
0b001 1 KB 1.5 KB
0b010 2 KB 3 KB
0b011 4 KB 6 KB
0b100 8 KB 12 KB
0b101 16 KB 24 KB
0b110 32 KB 48 KB
0b111 64 KB 96 KB

2.2 CP15 的寄存器 C1

CP15中的寄存器C1是一个控制寄存器,它包括以下控制功能:

  • 禁止或使能MMU以及其他与存储系统相关的功能
  • 配置存储系统以及ARM处理器中的相关部分的工作

指令如下:
mrc p15, 0, r0, c1, c0{, 0} ;将 CP15 的寄存器 C1 的值读到 r0 中
mcr p15, 0, r0, c1, c0{, 0} ;将 r0 的值写到 CP15 的寄存器 C1 中
CP15 中的寄存器 C1 的编码格式及含义说明如下:

C1中的控制位 含义
M(bit[0]) 0 :禁止 MMU 或者 PU
1 :使能 MMU 或者 PU
如果系统中没有MMU及PU,读取时该位返回0,写入时忽略该位。
A(bit[1]) 0 :禁止地址对齐检查
1 :使能地址对齐检查
C(bit[2]) 当数据cache和指令cache分开时,本控制位禁止/使能数据cache。当数据cache和指令cache统一时,该控制位禁止/使能整个cache。
0 :禁止数据 / 整个 cache
1 :使能数据 / 整个 cache
如果系统中不含cache,读取时该位返回0.写入时忽略
当系统中不能禁止cache 时,读取时返回1.写入时忽略
W(bit[3]) 0 :禁止写缓冲
1 :使能写缓冲
如果系统中不含写缓冲时,读取时该位返回0.写入时忽略
当系统中不能禁止写缓冲时,读取时返回1.写入时忽略
P(bit[4]) 对于向前兼容26位地址的ARM处理器,本控制位控制PROG32控制信号
0 :异常中断处理程序进入 32 位地址模式
1 :异常中断处理程序进入26 位地址模式
如果本系统中不支持向前兼容26位地址,读取该位时返回1,写入时忽略
D(bit[5]) 对于向前兼容26位地址的ARM处理器,本控制位控制DATA32控制信号
0 :禁止 26 位地址异常检查
1 :使能 26 位地址异常检查
如果本系统中不支持向前兼容26位地址,读取该位时返回1,写入时忽略
L(bit[6]) 对于ARMv3及以前的版本,本控制位可以控制处理器的中止模型
0 :选择早期中止模型
1 :选择后期中止模型
B(bit[7]) 对于存储系统同时支持big-endian和little-endian的ARM系统,本控制位配置系统的存储模式
0 : little endian
1 : big endian
对于只支持little-endian的系统,读取时该位返回0,写入时忽略
对于只支持big-endian的系统,读取时该位返回1,写入时忽略
S(bit[8]) 在基于 MMU 的存储系统中,本位用作系统保护
R(bit[9]) 在基于 MMU 的存储系统中,本位用作 ROM 保护
F(bit[10]) 由生产商定义
Z(bit[11]) 对于支持跳转预测的ARM系统,本控制位禁止/使能跳转预测功能
0 :禁止跳转预测功能
1 :使能跳转预测功能
对于不支持跳转预测的ARM系统,读取该位时返回0,写入时忽略
I(bit[12]) 当数据cache和指令cache是分开的,本控制位禁止/使能指令cache
0 :禁止指令 cache
1 :使能指令 cache
如果系统中使用统一的指令cache和数据cache或者系统中不含cache,读取该位时返回0,写入时忽略。当系统中的指令cache不能禁止时,读取时该位返回1,写入时忽略
V(bit[13]) 对于支持高端异常向量表的系统,本控制位控制向量表的位置
0 :选择低端异常中断向量 0x0~0x1c
1 :选择高端异常中断向量0xffff0000~ 0xffff001c
对于不支持高端异常向量表的系统,读取时该位返回0,写入时忽略
PR(bit[14]) 如果系统中的cache的淘汰算法可以选择的话,本控制位选择淘汰算法
0 :常规的 cache 淘汰算法,如随机淘汰
1 :预测性淘汰算法,如round-robin 淘汰算法
如果系统中cache的淘汰算法不可选择,写入该位时忽略。读取该位时,根据其淘汰算法是否可以比较简单地预测最坏情况返回0或者1
L4(bit[15]) 对于ARM版本5及以上的版本,本控制位可以提供兼容以前的ARM版本的功能
0 :保持 ARMv5 以上版本的正常功能
1 :将 ARMv5 以上版本与以前版本处理器 兼容,不根据跳转地址的 bit[0] 进行 ARM 指令和 Thumb 状态切换: bit[0] 等于 0 表示 ARM 指令,等于 1 表示 Thumb 指令
Bits[31:16]) 这些位保留将来使用,应为UNP/SBZP

2.3 CP15 的寄存器 C2

C2寄存器的别名:Translation table base (TTB) register
C2寄存器用来保存页表的基地址,即一级映射描述符表的基地址。其编码格如下所示:

31                                                0
一级映射描述符表的基地址(物理地址)

2.4 CP15 的寄存器 C3

CP15 中的寄存器 C3 定义了 ARM 处理器的 16 个域的访问权限。

在 CP15的C3寄存器中,划分了 16个域,每个区域由两位构成,这两位说明了当前内存的检查权限:
00:当前级别下,该内存区域不允许被访问,任何的访问都会引起一个domain fault,这时 AP位无效
01:当前级别下,该内存区域的访问必须配合该内存区域的段描述符中AP位进行权检查
10:保留状态(我们最好不要填写该值,以免引起不能确定的问题)
11:当前级别下,对该内存区域的访问都不进行权限检查。 这时 AP位无效
所以只有当相应域的编码为 01 时,才会根据 AP位 和协处理器CP15中的C1寄存器的R,S位进行权限检查

2.4 CP15 的寄存器 C5

CP15 中的寄存器 C5 是失效状态寄存器,分为指令状态失效和数据状态失效。
MRC p15, 0, , c5, c0, 0 访问数据失效状态寄存器
MRC p15, 0, , c5, c0, 1 访问指令状态失效寄存器
编码格式如下所示:

31~9 8 7~4 3~0
UNP/SBZP 0 域标识 状态标识

其中,域标识bit[7:4]表示存放引起存储访问失效的存储访问所属的域。状态标识 bit[3:0] 表示放引起存储访问失效的存储访问类型,该字段含义如下表所示(优先级由上到下递减)。

2.5 CP15的寄存器C6

CP15 中的寄存器 C6 是失效地址寄存器,其中保存了引起存储访问失效的地址,分为数据失效地址寄存器和指令失效地址寄存器。
MRC p15, 0, , c6, c0, 0 访问数据失效地址寄存器
MRC p15, 0, , c6, c0, 2 访问指令失效地址寄存器
编码格式如下所示:

31                                                0
失效地址(虚拟地址)

2.6 CP15的寄存器C7

CP15 的 C7 寄存器用来控制 cache 和写缓存,它是一个只写寄存器,读操作将产生不可预知的后果。访问 CP15 的 C7 寄存器的指令格式为:mcr p15, 0, Rd, CRn, CRm, opcode_2 。具体含义如下表所示(表中的数据是指Rd中的数据)

2.7 CP15的寄存器C8

系统协处理器CP15的寄存器C8就是清除TLB内容的相关操作。它是一个只写的寄存器。
MCR p15,0,Rd,c8,CRm,opcode_2
Rd中为要写入C8寄存器的内容,CRm和opcode_2的不同组合决定指令执行的不同操作。

2.8 CP15的寄存器C12

CP15寄存器C12用来设置异常向量基地址,其编码格式如下所示:
MCR p15, 0, , c12, c0, 0 ;Rd中存放要修改的异常向量基地址

31~5 4~0
异常向量基地址 Reserve

注:只有ARM11和cortex-a 可以任意修改异常向量基地址。arm7,ARM9,ARM10只可以在0地址或0xffff0000中

2.9 CP15的寄存器C13

CP15中的寄存器C13用于快速上下文切换。其编码格式如下所示

31~25 24~0
PID

其中, 在读操作时,结果中位[31::25]返回PID,其他位 的数值是不可以预知的。写操作将设置PID的值。当PID的值为0时,MVA = VA | (0(PID)<<25),MVA=VA,相当于禁止了FCSE。系统复位后PID即为0。当PID的值不为0时,相当于使能了FCSE。

ARM协处理器(CP15)指令介绍相关推荐

  1. ARM协处理器CP15介绍

    概述 在基于ARM的嵌入式应用系统中,存储系统的操作通常是由协处理器CP15完成的.CP15包含16个32位的寄存器,其编号为0-15.而访问CP15寄存器的指令主要是MCR和MRC这两个指令. MR ...

  2. (转)ARM协处理器CP15寄存器详解

    用于系统存储管理的协处理器CP15 MCR{cond}     coproc,opcode1,Rd,CRn,CRm,opcode2 MRC {cond}    coproc,opcode1,Rd,CR ...

  3. ARM协处理器CP15寄存器详解

    用于系统存储管理的协处理器CP15 MCR{cond}     coproc,opcode1,Rd,CRn,CRm,opcode2 MRC {cond}    coproc,opcode1,Rd,CR ...

  4. ARM协处理器CP15

    转自:http://blog.csdn.net/tankai19880619/article/details/8894041 ARM920T = ARM9 core + MMU + Cache MMU ...

  5. ARM协处理器CP15(设置MMU,cache等)学习

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 作者:w ...

  6. 如何使用ARM协处理器CP15在32位ARRCH模式下操作64位寄存器)

    1 参考 参考ARM的官方手册ARMv8指令集架构手册和A53技术参考手册 1.DDI0487H_a_a-profile_architecture_reference_manual 2.DDI0500 ...

  7. 协处理器CP15介绍—MCR/MRC指令

    概述:在基于ARM的嵌入式应用系统中,存储系统的操作通常是由协处理器CP15完成的.CP15包含16个32位的寄存器,其编号为0-15. 而访问CP15寄存器的指令主要是MCR和MRC这两个指令. 例 ...

  8. 协处理器CP15介绍—MCR/MRC指令(6)

    概述:在基于ARM的嵌入式应用系统中,存储系统的操作通常是由协处理器CP15完成的.CP15包含16个32位的寄存器,其编号为0-15. 而访问CP15寄存器的指令主要是MCR和MRC这两个指令. 例 ...

  9. ARM汇编指令-协处理器cp15操作指令(mcr amp; mrc)

    一.协处理器 SoC内部另一处理核心,协助主CPU实现某些功能,被主CPU调用执行一定任务.ARM设计上支持多达16个协处理器,但是一般 SoC只实现其中的CP15.(cp:coprocessor) ...

最新文章

  1. 20170401 11G Deprecated Attributes for LOG_ARCHIVE_DEST_n
  2. pythonexcelweb交互插件_来一次Python与Excel的完美交互
  3. webpack 教程 那些事儿05-多页应用
  4. C语言学习之有一个3X4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值
  5. 全球唯一标识GUID
  6. Swift傻傻分不清楚系列(十一)类和结构体
  7. 【强化学习】Policy Gradient原理
  8. 01.神经网络和深度学习 W2.神经网络基础(作业:逻辑回归 图片识别)
  9. html响应式布局平移,jQuery图片内部缩放和平移插件jquery.zoom.js
  10. 跟我学Spring Cloud(Finchley版)-04-服务注册与服务发现-原理剖析
  11. 想赚钱是好事,但盲目创业就容易悲剧
  12. 数据清洗+特征构造:bureau.csv
  13. linux下c程序调用reboot函数实现直接重启【转】
  14. 北洋园pt---一个好用的pt网站
  15. 20003.数据结构C++ 顺序表
  16. 基于yolov5-6.0版本的PCB板缺陷检测(Python/C++部署)
  17. 5.5 高斯型求积公式简历
  18. c# .net 16进制转换10进制
  19. 利用python实现计算不同长度蛋白质RMSD
  20. 大整数类设计(C++)

热门文章

  1. php随机数各种知识汇集
  2. 【ZYNQ】从入门到秃头07 FPGA 片内 RAM ROM 读写测试实验
  3. php做新闻列表,php 静态新闻列表自动生成代码如何实现
  4. 研究生必备科研软件大全——下载,翻译,整理一网打尽!
  5. python学习--正则表达式
  6. matlab fscanf 逗号分隔符,matlab中fscanf
  7. JXL解决excl中的日期无法筛选问题
  8. 计算机二级vf vc,计算机二级VF:实战VC时间控制函数
  9. 单路模拟高清RX解码芯片国产替代
  10. PHP与Java对比