概述:在基于ARM的嵌入式应用系统中,存储系统的操作通常是由协处理器CP15完成的。CP15包含16个32位的寄存器,其编号为0~15。
而访问CP15寄存器的指令主要是MCR和MRC这两个指令。
例如协处理器15(CP15),ARM处理器使用协处理器15的寄存器来控制cache、TCM和存储器管理。
而访问CP15寄存器的指令主要是MCR和MRC这两个指令:
MRC:协处理器寄存器到ARM处理器寄存器的数据传送指令(读出协处理器寄存器)。
MCR:ARM处理器寄存器到协处理器寄存器的数据传送指令(写入协处理器寄存器)。
1.MRC/MCR指令读取CP15寄存器格式:
MRC{cond} p15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>
MCR{cond} p15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>
cond:为指令执行的条件码。当cond忽略时指令为无条件执行。
Opcode_1:协处理器的特定操作码. 对于CP15寄存器来说,opcode1=0
Rd:作为源寄存器的ARM寄存器,其值将被传送到协处理器寄存器中,或者将协处理器寄存器的值传送到该寄存器里面 ,通常为R0
CRn:作为目标寄存器的协处理器寄存器,其编号是C~C15。
CRm:协处理器中附加的目标寄存器或源操作数寄存器。如果不需要设置附加信息,将CRm设置为c0,否则结果未知
Opcode_2:可选的协处理器特定操作码。(用来区分同一个编号的不同物理寄存器,当不需要提供附加信息时,指定为0)
1.1 示例:
mrc p15, 0, r0, c1, c0, 0 //将 CP15 的寄存器 C1 的值读到 r0 中
mcr p15, 0, r0, c7, c7, 0 //关闭ICaches和DCaches
mcr p15, 0, r0, c8, c7, 0 //使无效整个数据TLB和指令TLB
1.2 在C函数中使用汇编示例:
__asm__( "mrc p15, 0, r1, c1, c0, 0\n" //使用__asm__ 可以在C函数中执行汇编语句
"orr r1, r1, #0xc0000000\n"
"mcr p15, 0, r1, c1, c0, 0\n"
:::"r1" //:::"r1" 向GCC声明:我对r1作了改动
);
2.CP15中的寄存器介绍
CP15 的寄存器列表如表所示:
寄存器编号 |
基本作用 |
在 MMU 中的作用 |
在 PU 中的作用 |
0 |
ID 编码(只读) |
ID 编码和 cache 类型 |
|
1 |
控制位(可读写) |
各种控制位 |
|
2 |
存储保护和控制 |
地址转换表基地址 |
Cachability 的控制位 |
3 |
存储保护和控制 |
域访问控制位 |
Bufferablity 控制位 |
4 |
存储保护和控制 |
保留 |
保留 |
5 |
存储保护和控制 |
内存失效状态 |
访问权限控制位 |
6 |
存储保护和控制 |
内存失效地址 |
保护区域控制 |
7 |
高速缓存和写缓存 |
高速缓存和写缓存控制 |
|
8 |
存储保护和控制 |
TLB 控制 |
保留 |
9 |
高速缓存和写缓存 |
高速缓存锁定 |
|
10 |
存储保护和控制 |
TLB 锁定 |
保留 |
11 |
保留 |
|
|
12 |
保留 |
|
|
13 |
进程标识符 |
进程标识符 |
|
14 |
保留 |
|
|
15 |
因不同设计而异 |
因不同设计而异 |
因不同设计而异
|
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 是分开的还是统一的: |
位 [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 |
A(bit[1]) |
0 :禁止地址对齐检查 |
C(bit[2]) |
当数据cache和指令cache分开时,本控制位禁止/使能数据cache。当数据cache和指令cache统一时,该控制位禁止/使能整个cache。 |
W(bit[3]) |
0 :禁止写缓冲 |
P(bit[4]) |
对于向前兼容26位地址的ARM处理器,本控制位控制PROG32控制信号 |
D(bit[5]) |
对于向前兼容26位地址的ARM处理器,本控制位控制DATA32控制信号 |
L(bit[6]) |
对于ARMv3及以前的版本,本控制位可以控制处理器的中止模型 |
B(bit[7]) |
对于存储系统同时支持big-endian和little-endian的ARM系统,本控制位配置系统的存储模式 |
S(bit[8]) |
在基于 MMU 的存储系统中,本位用作系统保护 |
R(bit[9]) |
在基于 MMU 的存储系统中,本位用作 ROM 保护 |
F(bit[10]) |
由生产商定义 |
Z(bit[11]) |
对于支持跳转预测的ARM系统,本控制位禁止/使能跳转预测功能 |
I(bit[12]) |
当数据cache和指令cache是分开的,本控制位禁止/使能指令cache |
V(bit[13]) |
对于支持高端异常向量表的系统,本控制位控制向量表的位置 |
PR(bit[14]) |
如果系统中的cache的淘汰算法可以选择的话,本控制位选择淘汰算法 |
L4(bit[15]) |
对于ARM版本5及以上的版本,本控制位可以提供兼容以前的ARM版本的功能 |
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.5 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.4 CP15的寄存器C6
CP15 中的寄存器 C6 是失效地址寄存器,其中保存了引起存储访问失效的地址,分为数据失效地址寄存器和指令失效地址寄存器。
MRC p15, 0, , c6, c0, 0 访问数据失效地址寄存器
MRC p15, 0, , c6, c0, 2 访问指令失效地址寄存器
编码格式如下所示:
31 0 |
失效地址(虚拟地址) |
2.5 CP15的寄存器C7
CP15 的 C7 寄存器用来控制 cache 和写缓存,它是一个只写寄存器,读操作将产生不可预知的后果。访问 CP15 的 C7 寄存器的指令格式为:mcr p15, 0, Rd, CRn, CRm, opcode_2 。具体含义如下表所示(表中的数据是指Rd中的数据)
2.6 CP15的寄存器C8
系统协处理器CP15的寄存器C8就是清除TLB内容的相关操作。它是一个只写的寄存器。
MCR p15,0,Rd,c8,CRm,opcode_2
Rd中为要写入C8寄存器的内容,CRm和opcode_2的不同组合决定指令执行的不同操作。
2.7 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.8 CP15的寄存器C13
CP15中的寄存器C13用于快速上下文切换。其编码格式如下所示
31~25 |
24~0 |
PID |
0 |
其中, 在读操作时,结果中位[31::25]返回PID,其他位 的数值是不可以预知的。写操作将设置PID的值。当PID的值为0时,MVA = VA | (0(PID)<<25),MVA=VA,相当于禁止了FCSE。系统复位后PID即为0。当PID的值不为0时,相当于使能了FCSE。