4.1 ARM处理器中CP15协处理器的寄存器
本章和第 5 章的内容都与 ARM 处理器中 CP15 协处理器的寄存器有密切关系,所以我们这里先介绍一下 CP15 寄存器以及访问 CP15 寄存器的汇编指令。
4.1.1 访问 CP15 寄存器的指令
访问 CP15 寄存器指令的编码格式及语法说明如下:
31 28 |
27 24 |
23 21 |
20 |
19 16 |
15 12 |
11 8 |
7 5 |
4 |
3 0 |
cond |
1 1 1 0 |
opcode_1 |
L |
cr n |
rd |
1 1 1 1 |
opcode_2 |
1 |
crm |
说明:
:协处理器行为操作码,对于 CP15 来说, 永远为 0b000 ,否则结果未知。
:不能是 r15/pc ,否则,结果未知。
:作为目标寄存器的协处理器寄存器,编号为 C0~C15 。
:附加的目标寄存器或源操作数寄存器,如果不需要设置附加信息,将 crm 设置为 c0 ,否则结果未知。
:提供附加信息比如寄存器的版本号或者访问类型,用于区分同一个编号的不同物理寄存器,可以省略 或 者将其设置为 0 , 否则结果未知。
指 令 |
说 明 |
语法格式 |
mcr |
将 ARM 处理器的寄存器中的数据写到 CP15 中的寄存器中 |
mcr{} p15, , , , , {} |
mrc |
将 CP15 中的寄存器中的数据读到 ARM 处理器的寄存器中 |
mcr{} p15, , , , , {} |
4.1.2 CP15 寄存器介绍
CP15 的寄存器列表如表 4-1 所示。
表 4-1 ARM 处理器中 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 |
因 不同设计而异 |
因 不同设计而异 |
因 不同设计而异 |
· CP15 的寄存器 C0
CP15 中寄存器 C0 对应两个标识符寄存器,由访问 CP15 中的寄存器指令中的 指定要访问哪个具体物理寄存器, 与两个标识符寄存器的对应关系如下所示:
opcode_2 编码 |
对应的标识符号寄存器 |
0b000 |
主 标识符寄存器 |
0b001 |
cache 类型标识符寄存器 |
其 他 |
保 留 |
1 )主标识符寄存器
访 问主标识符寄存器的指令格式如下所示:
mrc p15, 0, r0, c0, c0, 0 ;将主标识符寄存器 C0,0 的值读到 r0 中
ARM 不同版本体系处理器中主标识符寄存器的编码格式说明如下。
ARM7 之后处理器的主标识符寄存器编码格式 如下所示:
31 24 23 20 19 16 15 4 3 0 |
||||
由 生产商确定 |
产 品子编号 |
ARM 体系版本号 |
产 品主编号 |
处 理器版本号 |
位 |
说 明 |
位 [3: 0] |
生产商定义的处理器版本号 |
位 [15: 4] |
生产商定义的产品主编号,其中最高 4 位即位 [15:12] 可能的取值为 0~7 但不能是 0 或 7 |
位 [19: 16] |
ARM 体系的版本号,可能的取值如 下: 0x1 ARM 体系版本 4 0x2 ARM 体系版本 4T 0x3 ARM 体系版本 5 0x4 ARM 体系版本 5T 0x5 ARM 体系版本 5TE 其他 由 ARM 公司保留将来使用 |
位 [23: 20] |
生产商定义的产品子编号,当产品主编号相同时,使用子编号来区分不同的产品子类,如产品中不 同的高速缓存的大小等 |
位 [31: 24] |
生产厂商的编号,现在已经定义的有以下值: 0x41 =A ARM 公司 0x44 =D Digital Equipment 公司 0x69 =I intel 公司 |
ARM7 处理器的主标识符寄存器编码格式如下所示:
31 24 23 22 16 15 4 3 0 |
||||
由生产商确定 |
A |
产品子编号 |
产品主编号 |
处理器版本号 |
位 |
说 明 |
位 [3: 0] |
生产商定义的处理器版本号 |
位 [15: 4] |
生产商定义的产品主编号,其中最高 4 位即位 [15:12] 的值为 0x7 |
位 [22: 16] |
生产商定义的产品子编号,当产品主编号相同时,使用子编号来区分不同的产品子类,如产品中不同的高速缓存的大小等 |
续表
位 |
说 明 |
位 [23] |
ARM7 支持下面两种 ARM 体系的版本号: 0x0 ARM 体系版本 3 0x1 ARM 体系版本 4T |
位 [31: 24] |
生产厂商的编号,现在已经定义的有以下值: 0x41 =A ARM 公司 0x44 =D Digital Equipment 公司 0x69 =I Intel 公司 |
ARM7 之前处理器的主标识符寄存器编码格式如下所示:
31 24 23 22 16 15 4 3 0 |
||||
由生产商确定 |
A |
产品子编号 |
产品主编号 |
处理器版本号 |
位 |
说 明 |
位 [3: 0] |
生产商定义的处理器版本号 |
位 [15: 4] |
生产商定义的产品主编号,其中最高 4 位即为 [15:12] 的值为 0x7 |
位 [22: 16] |
生产商定义的产品子编号,当产品主编号相同时,使用子编号来区分不同的产品子类,如产品中不同的高速缓存的大小等 |
位 [23] |
ARM7 支持下面两种 ARM 体系的版本号: 0x0 ARM 体系版本 3 0x1 ARM 体系版本 4T |
位 [31: 24] |
生产厂商的编号,现在已经定义的有以下值: 0x41 =A ARM 公司 0x44 =D Digital Equipment 公司 0x69 =I intel 公司 |
2 ) cache 类型标识符寄存器
访问 cache 类型标识符寄存器的指令格式如下所示:
mrc p15, 0, r0, c0, c0, 1 ;将 cache 类型标识符寄存器 C0,1 的值读到 r0 中
ARM 处理器中 cache 类型标识符寄存器的编码格式如下所示:
31 29 28 25 24 23 12 11 0 |
||||
0 0 0 |
属性字段 |
S |
数据 cache 相关属性 |
指令 cache 相关属性 |
位 |
说明 |
位 [28: 25] |
指定控制字段位 [24: 0] 指定的属性之外的 cache 的其他属性,详见表 4-2 |
位 [24] |
定义系统中的数据 cache 和指令 cache 是分开的还是统一的: 0 系统的数据 cache 和指令 cache 是统一的; 1 系统的数据 cache 和指令 cache 是分开的 |
位 [23: 12] |
定义数据 cache 的相关属性,如果位 [24] 为 0 ,本字段定义整个 cache 的属性 |
位 [31: 24] |
定义指令 cache 的相关属性,如果位 [24] 为 0 ,本字段定义整个 cache 的属性 |
其中 控制字段位 [28 : 25] 的含义 说明如下:
表 4-2 cache 类型标识符寄存器的控制字段位 [28 : 25]
编 码 |
cache 类型 |
cache 内容清除方法 |
cache 内容锁定方法 |
0b0000 |
写通类型 |
不需要内容清除 |
不支持内容锁定 |
0b0001 |
写回类型 |
数据块读取 |
不支持内容锁定 |
0b0010 |
写回类型 |
由寄存器 C7 定义 |
不支持内容锁定 |
0b0110 |
写回类型 |
由寄存器 C7 定义 |
支持格式 A |
0b0111 |
写回类型 |
由寄存器 C7 定义 |
支持格式 B |
控制字段位 [23 : 12] 和 控制字段位 [11 : 0] 的编码格式相同,含义如下所示:
11 9 8 6 5 3 2 1 0 |
||||
0 0 0 |
cache 容量 |
cache 相联特性 |
M |
块大小 |
cache 容量字段 bits[8: 6] 的含义如下所示:
编 码 |
M=0 时含义(单位 KB ) |
M=1 时含义(单位 KB ) |
0b000 |
0.5 |
0.75 |
0b001 |
1 |
1.5 |
0b010 |
2 |
3 |
0b011 |
4 |
6 |
0b100 |
8 |
12 |
0b101 |
16 |
24 |
0b110 |
32 |
48 |
0b111 |
64 |
96 |
cache 相联特性字段 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 路相联 |
cache 块大小字段 bits[1: 0] 的含义如下所示:
编 码 |
cache 块大小 |
0b00 |
2 个 字( 8 字节) |
0b01 |
4 个 字( 16 字节) |
0b10 |
8 个 字( 32 字节) |
0b11 |
16 个 字( 64 字节) |
· CP15 的寄存器 C1
访 问主标识符寄存器的指令格式如下所示:
mrc p15, 0, r0, c1, c0{, 0} ;将 CP15 的寄存器 C1 的值读到 r0 中
mcr p15, 0, r0, c1, c0{, 0} ;将 r0 的值写到 CP15 的寄存器 C1 中
CP15 中的寄存器 C1 的编码格式及含义说明如下:
31 16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
附加 |
L4 |
RR |
V |
I |
Z |
F |
R |
S |
B |
L |
D |
P |
W |
C |
A |
M |
位 |
说 明 |
M |
0 :禁止 MMU 或者 PU ; 1 :使能 MMU 或者 PU |
A |
0 :禁止地址对齐检查; 1 :使能地址对齐检查 |
C |
0 :禁止数据 / 整个 cache ; 1 :使能数据 / 整个 cache |
W |
0 :禁止写缓冲; 1 :使能写缓冲 |
P |
0 :异常中断处理程序进入 32 位地址模式; 1 :异常中断处理程序进入 26 位地址模式 |
D |
0 :禁止 26 位地址异常检查; 1 :使能 26 位地址异常检查 |
L |
0 :选择早期中止模型; 1 :选择后期中止模型 |
B |
0 : little endian ; 1 : big endian |
S |
在基于 MMU 的存储系统中,本位用作系统保护 |
R |
在基于 MMU 的存储系统中,本位用作 ROM 保护 |
F |
0 :由生产商定义 |
Z |
0 :禁止跳转预测功能; 1 :使能跳转预测指令 |
I |
0 :禁止指令 cache ; 1 :使能指令 cache |
V |
0 :选择低端异常中断向量 0x0~0x1c ; 1 :选择高端异常中断向量 0xffff0000~ 0xffff001c |
RR |
0 :常规的 cache 淘汰算法,如随机淘汰; 1 :预测性淘汰算法,如 round-robin 淘汰算法 |
L4 |
0 :保持 ARMv5 以上版本的正常功能; 1 :将 ARMv5 以上版本与以前版本处理器 兼容,不根据跳转地址的 bit[0] 进行 ARM 指令和 Thumb 状态切换: bit[0] 等于 0 表示 ARM 指令,等于 1 表示 Thumb 指令 |
附加: |
|
· CP15 的寄存器 C2
CP15 中的寄存器 C2 保存的是页表的基地址,即一级映射描述 符表的基地址。其编码格如下所示:
31 0 |
一级映射描述符表的基地址(物理地址) |
· CP15 的寄存器 C3
CP15 中的寄存器 C3 定义了 ARM 处理器的 16 个域的访问权限。
31 0 |
|||||||||||||||
D15 |
D14 |
D13 |
D12 |
D11 |
D10 |
D9 |
D8 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
· CP15 的寄存器 C5
CP15 中的寄存器 C5 是失效状态寄存器,编码格式如下所示:
31 9 8 7 4 3 0 |
|||
UNP/SBZP |
0 |
域标识 |
状态标识 |
其中,域标识 bit[7 : 4] 表示存放引起存储访问失效的存储访问所属的域。
状态标识 bit[3 : 0] 表示放引起存储访问失效的存储访问类型,该字段含义如表 4-3 所示(优先级由上到下递减)。
表 4-3 状态标识字段含义
引起访问失效的原因 |
状态标识 |
域标识 |
C6 |
终 端异常( Terminal Exception ) |
0b0010 |
无 效 |
生 产商定义 |
中 断向量访问异常( Vector Exception ) |
0b0000 |
无 效 |
有 效 |
地 址对齐 |
0b00x1 |
无 效 |
有 效 |
一 级页表访问失效 |
0b1100 |
无 效 |
有 效 |
二 级页表访问失效 |
0b1110 |
有 效 |
有 效 |
基 于段的地址变换失效 |
0b0101 |
无 效 |
有 效 |
基 于页的地址变换失效 |
0b0111 |
有 效 |
有 效 |
基 于段的存储访问中域控制失效 |
0b1001 |
有 效 |
有 效 |
基 于页的存储访问中域控制失效 |
0b1101 |
有 效 |
有 效 |
基 于段的存储访问中访问权限控制失效 |
0b1111 |
有 效 |
有 效 |
基 于页的存储访问中访问权限控制失效 |
0b0100 |
有 效 |
有 效 |
基 于段的 cache 预 取时外部存储系统失效 |
0b0110 |
有 效 |
有 效 |
基 于页的 cache 预 取时外部存储系统失效 |
0b1000 |
有 效 |
有 效 |
基 于段的非 cache 预 取时外部存储系统失效 |
0b1010 |
有 效 |
有 效 |
· CP15 中的寄存器 C6
CP15 中的寄存器 C5 是失效地址寄存器,编码格式如下所示:
31 0 |
失效地址(虚拟地址) |
· CP15 中的寄存器 C7
CP15 的 C7 寄存器用来控制 cache 和写缓存,它是一个只写寄存器,读操作将产生不可预知的后果。
访问 CP15 的 C7 寄存器的指令格式如下所示:
mcr p15, 0, , , crm, ; 、 和 的不同取值组合 实现不同功能
· CP15 中的寄存器 C8
CP15 的 C8 寄存器用来控制清除 TLB 的内容,是只写寄存器,读操作将产生不可预知的后果。
访问 CP15 的 C8 寄存器的指令格式如下所示:
mcr p15, 0, , , crm, ; 、 和 的不同取值组合实现不同功能,见第 4.2 节
· CP15 中的寄存器 C9
C P15 的 C9 寄存器用于控制 cache 内容锁定。
访问 CP15 的 C9 寄存器的指令格式如下所示:
mcr p15, 0, , , c0,
mrc p15, 0, , , c0,
如果系统中包含独立的指令 cache 和数据 cache ,那么对应于数据 cache 和指令 cache 分别有一个独立的 cache 内容锁定寄存器, 用来选择其中的某个寄存器:
=1 选择指令 cache 的内容锁定寄存器;
=0 选择数据 cache 的内容锁定寄存器。
CP15 的 C9 寄存器有 A 、 B 两种编码格式。编码格式 A 如下所示:
31 32-W 31-W 0 |
|
cache 组内块序号 index |
0 |
其中 index 表示当下一次发生 cache 未命中时,将预取的存储块存入 cache 中该块对应的组中序号为 index 的 cache 块中。此时序号为 0~index-1 的 cache 块被锁定,当发生 cache 替换时,从序号为 index 到 ASSOCIATIVITY 的块中选择被替换的块。
编码格式 B 如下所示:
31 30 W W-1 0 |
||
L |
0 |
cache 组内块序号 index |
位 |
说 明 |
L=0 |
当发生 cache 未命中时,将预取的存储块存入 cache 中该块对应的组中序号为 index 的 cache 块中 |
续表
位 |
说 明 |
L=1 |
如果本次写操作之前 L=0 ,并且 index 值小于本次写入的 index ,本次写操作执行的结果不可预知;否则,这时被锁定的 cache 块包括序号为 0~index-1 的块,当发生 cache 替换时,从序号为 index 到 ASSOCIATIVITY 的块中 选择被替换的块 |
· CP15 的寄存器 C10
CP15 的 C10 寄存器用于控制 TLB 内容锁定。
访问 CP15 的 C10 寄存器的指令格式如下所示:
mcr p15, 0, , , c0,
mrc p15, 0, , , c0,
如果系统中包含独立的指令 TLB 和数据 TLB ,那么对应于数据 TLB 和指令 TLB 分别有一个独立的 TLB 内容锁定寄存器, 用来选择其中的某个寄存器:
=1 选择指令 TLB 的内容锁定寄存器;
=0 选择数据 TLB 的内容锁定寄存器。
C10 寄存器的编码格式如下:
31 30 32-W 31-W 32-2W 31-2W 1 0 |
|||
可被替换的条目起始地址的 base |
下一个将被替换的条目地址 victim |
0 |
P |
位 |
说 明 |
victim |
指定下一次 TLB 没有命中(所需的地址变换条目没有包含在 TLB 中)时,从内存页表中读取所需 的地址变换条目,并把该地址变换条目保存在 TLB 中地址 victim 处 |
base |
指定 TLB 替换时,所使用的地址范围,从( base )到( TLB 中条目数 -1 );字段 victim 的值应该包含在该范围内 |
P |
1 :写入 TLB 的地址变换条目不会受使整个 TLB 无效操作的影响,一直保持有效; 0 :写入 TLB 的地址变换条目将会受到使整个 TLB 无效操作的影响 |
· CP15 的寄存器 C13
C13 寄存器用于快速上下文切换 FCSE 。
访问 CP15 的 C13 寄存器的指令格式如下所示:
mcr p15, 0, , , c0, 0
mrc p15, 0, , , c0, 0
C13 寄存器的编码格式如下所示:
31 25 24 0 |
|
PID |
0 |
其中, PID 表示当前进程的所在的进程空间块的编号,即当前进程的进程标识符,取值为 0~127 。
0 : MVA (变换后的虚拟地址) = VA (虚拟地址),禁止 FCSE (快速上下文切换技术),系统复位后 PID=0 ;
非 0 :使能 FCSE 。