Coprocessor Interface
主要参考ARM公司的datasheet.
cp15的作用主要是MMU,大小端控制,总线模式等这些控制。
操作cp15的时候,需要用到汇编语言,c语言无能为力。
可以参考 http://v.uplook.cn/videoyykf/emb/942/12791.html
zz:http://blog.youkuaiyun.com/genglei1022/article/details/5712843
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 |
说明:
<opcode_1> :协处理器行为操作码,对于 CP15 来说, <opcode_1> 永远为 0b000 ,否则结果未知。
<rd> :不能是 r15/pc ,否则,结果未知。
<crn> :作为目标寄存器的协处理器寄存器,编号为 C0~C15 。
<crm> :附加的目标寄存器或源操作数寄存器,如果不需要设置附加信息,将 crm 设置为 c0 ,否则结果未知。
<opcode_2> :提供附加信息比如寄存器的版本号或者访问类型,用于区分同一个编号的不同物理寄存器,可以省略 <opcode_2> 或者将其 设置为 0 ,否则结 果未知。
指 令 | 说 明 | 语法格式 |
mcr | 将 ARM 处理器的寄存器中的数据写到 CP15 中的寄存器中 | mcr{<cond>} p15, <opcode_1>, <rd>, <crn>, <crm>, {<opcode_2>} |
mrc | 将 CP15 中的寄存器中的数据读到 ARM 处理器的寄存器中 | mcr{<cond>} p15, <opcode_1>, <rd>, <crn>, <crm>, {<opcode_2>} |
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> 指定要访问哪个具体物理寄存器, <opcode_2> 与两个标识符寄存器的对应关系如下所示:
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, <rd>, <c7>, crm, <opcode_2> ; <rd> 、 <crm> 和 <opcode_2> 的不同取值组合 实现不同功能
· CP15 中的寄存器 C8
CP15 的 C8 寄存器用来控制清除 TLB 的内容,是只写寄存器,读操作将产生不可预知的后果。
访问 CP15 的 C8 寄存器的指令格式如下所示:
mcr p15, 0, <rd>, <c8>, crm, <opcode_2> ; <rd> 、 <crm> 和 <opcode_2> 的不同取值组合实现不同功能,见第 4.2 节
· CP15 中的寄存器 C9
C P15 的 C9 寄存器用于控制 cache 内容锁定。
访问 CP15 的 C9 寄存器的指令格式如下所示:
mcr p15, 0, <rd>, <c9>, c0, <opcode_2>
mrc p15, 0, <rd>, <c9>, c0, <opcode_2>
如果系统中包含独立的指令 cache 和数据 cache ,那么对应于数据 cache 和指令 cache 分别有一个独立的cache 内容锁定寄存器, <opcode_2> 用来选择其中的某个寄存器:
<opcode_2>=1 选择 指令 cache 的 内容锁定寄存器;
<opcode_2>=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, <rd>, <c10>, c0, <opcode_2>
mrc p15, 0, <rd>, <c10>, c0, <opcode_2>
如果系统中包含独立的指令 TLB 和数据 TLB ,那么对应于数据 TLB 和指令 TLB 分别有一个独立的 TLB 内容锁定寄存器, <opcode_2> 用来选择其中的某个寄存器:
<opcode_2>=1 选择指令 TLB 的内容锁定寄存器;
<opcode_2>=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, <rd>, <c13>, c0, 0
mrc p15, 0, <rd>, <c13>, c0, 0
C13 寄存器的编码格式如下所示:
31 25 24 0 | |
PID | 0 |
其中, PID 表示当前进程的所在的进程空间块的编号,即当前进程的进程标识符,取值为 0~127 。
0 : MVA (变换后的虚拟地址) = VA (虚拟地址),禁止 FCSE (快速上下文切换技术),系统复位后 PID=0;
非 0 :使能 FCSE 。