CP15 —系统控制协处理器 (the system control coprocessor),通过协处理器指令 MCR和 MRC 提供具体的寄存器来配置和控制 caches、MMU、保护系统、配置时钟模式(在 bootloader时钟初始化用到)。CP15包含16个32位的寄存器,其编号为0~15。
协处理器指令MCR和MRC
MCR指令
作用是将ARM处理器的寄存器中的数据传送到协处理器寄存器中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。
语法格式
|
其中,<cond>为指令执行的条件码。当<cond>忽略时指令为无条件执行。
<opcode_1>为协处理器将执行的操作的操作码。对于CP15协处理器来说,< opcode_1>永远为0b000,当< opcode_1>不为0b000时,该指令操作结果不可预知。
<Rd>作为源寄存器的ARM寄存器,其值将被传送到协处理器寄存器中。
<CRn>作为目标寄存器的协处理器寄存器,其编号可能是C0,C1,…,C15。
<CRm>和<opcode_2>两者组合决定对协处理器寄存器进行所需要的操作,如果没有指定,则将为<CRm>为C0,opcode_2为0,否则可能导致不可预知的结果。
例:
|
指令从ARM寄存器R4中中将数据传送到协处理器CP15的寄存器C1中。其中R4为ARM寄存器,存放源操作数,C1、C0为协处理器寄存器,为目标寄存器,opcode_1为0,opcode_2为0。
MRC指令
将协处理器的寄存器中的数值传送到ARM处理器的寄存器中、如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。
语法格式
|
用法参照MCR。
CP15的主要功能
(1)获取device id和cache type等一些CPU相关信息。这两个信息存在p15的c0寄存器中,其中c0寄存器有两个实体,一个用来存device id(叫做c0.0),另一个用来存cache type(叫做c0.1)这两个寄存器在读取时命令不同,请参看以下示例代码。
|
对以上代码的说明:
<1> CPU从p15读出寄存器只能使用mrc指令。同样,写入p15寄存器只能使用mcr指令。这两个指令也是p15唯一可以接受的两个指令。
<2> __asm{ }用来在c代码中内嵌汇编。
<3> 从代码中可以看出,读出c0.0和c0.1的代码,在opcode2处有所不同。(读出c0.1时,opcode2为1.c0.0时opcode2省略)。
(2)MMU操作。包括MMU的使能和禁止,虚拟地址到物理地址的映射机制建立。
和MMU有关的p15寄存器为c1(control register)和c2(TTB translation table base register)。其中c2比较简单,就是用来储存从虚拟地址到物理地址的地址转换表的基地址的(转换表存放在内存中,譬如可以放在0x30000000地址),因此我们在初始化mmu的时候,只要将规划的转换表基地址用mcr指令传送到该c2寄存器即可。而c1寄存器则为控制寄存器。
例:
|
函数中使用ARM寄存器r0作为和协处理器寄存器的接口。mcr p15,0,r0,c2,c0,0这句将r0中得值(0x30000000,这个是我们规划的转换表的基地址)放入(因此是mcr,所以是从ARM寄存器到p15协处理器寄存器)c2中。c2即是p15中的转换表基址。而最后的三段代码则是典型的读-改-写三步操作,目的就是将c1寄存器的bit0置1而同时不影响其他位。根据上面的寄存器定义可知,c1的bit0为MMU enable or disable,因此该三句代码实际上是打开了MMU。(注意MMU打开前后,地址空间发生了变化。MMU打开前程序是工作在物理地址空间的,而MMU打开后程序便工作在了虚拟地址空间) 。
(3)访问权限控制。主要用来实现安全机制和linux的写时复制(copy on write)。
访问权限控制主要由c3(domain access control register)和c1中的S bit 和R bit共同控制。
AP | S | R | Supervisor permissions | User permissions | Description |
---|---|---|---|---|---|
00 | 0 | 0 | No access | No access | Any access generates a permission fault |
00 | 1 | 0 | Read-only | No access | Only Supervisor read permitted |
00 | 0 | 1 | Read-only | Read-only | Any write generates a permission fault |
00 | 1 | 1 | Reserved | - | - |
01 | x | x | Read/write | No access | Access allowed only in Supervisor mode |
10 | x | x | Read/write | Read-only | Writes in User mode cause permission fault |
11 | x | x | Read/write | Read/write | All access types permitted in both modes |
xx | 1 | 1 | Reserved | - | - |
(4)设置时钟模式。init.S中MMU_SetAsyncBusMode和MMU_SetFastBusMode这两个函数。
MMU_SetAsyncBusMode
|
MMU_SetFastBusMode
|
CP15寄存器功能介绍如下所示:
寄存器编号 | 基本作用 | 特殊用途 |
---|---|---|
c0 | ID编码(只读) | ID和cache类型 |
c1 | 控制位 | 各种控制位 |
c2 | 存储器保护和控制 | MMU:地址转换表地址 MPU:cache属性设置 |
c3 | 内存保护和控制 | MMU:域访问控制 MPU:写缓存控制 |
c4 | 内存保护和控制 | 保留 |
c5 | 内存保护和控制 | MMU:错误状态 MPU:访问权限控制 |
c6 | 内存保护和控制 | MMU:错误状态 MPU:保护区域控制 |
c7 | cache和写缓存 | cache和写缓存控制 |
c8 | 内存保护和控制 | MMU:TLB控制 MPU:保留 |
c9 | cache和写缓存 | cache锁定 |
c10 | 内存保护和控制 | MMU:TLB控制 MPU:保留 |
c11 | 保留 | 保留 |
c12 | 保留 | 保留 |
c13 | 进程ID | 进程ID |
c14 | 保留 | 保留 |
c15 | 芯片生产厂商定义 | 芯片生产厂商定义 |
寄存器c0
CP15中寄存器C0对应两个标识符寄存器,由访问CP15中的寄存器指令中的指定要访问哪个具体物理寄存器,与两个标识符寄存器的对应关系如下所示:
opcode_2编码 | 对应的标识符号寄存器 |
0b000 | 主标识符寄存器 |
0b001 | cache类型标识符寄存器 |
其他 | 保留 |
(1)主标识符寄存器
访问主标识符寄存器的指令格式如下所示:
mrc p15, 0, r0, c0, c0, 0 ;将主标识符寄存器C0,0的值读到r0中
ARM7处理器的主标识符寄存器编码格式如下所示:
31 24 23 22 16 15 4 3 0 | ||||
由生产商确定 | A | 产品子编号 | 产品主编号 | 处理器版本号
|
(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的属性 |
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字节) |
寄存器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指令 |
寄存器c2
CP15中的寄存器C2保存的是页表的基地址,即一级映射描述符表的基地址。其编码格如下所示:
31 0 |
一级映射描述符表的基地址(物理地址) |
寄存器C3
CP15中的寄存器C3定义了ARM处理器的16个域的访问权限。
31 0 | ||||||||||||||||
D15 | D14 | D13 | D12 | D11 | D10 | D9 | D8 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
寄存器C5
CP15中的寄存器C5是失效状态寄存器,编码格式如下所示:
31 9 8 7 4 3 0 | |||
UNP/SBZP | 0 | 域标识 | 状态标识 |
其中,域标识bit[7:4]表示存放引起存储访问失效的存储访问所属的域。
状态标识bit[3:0]表示放引起存储访问失效的存储访问类型,该字段含义如表4-3所示(优先级由上到下递减)。
状态标识字段含义
引起访问失效的原因 | 状态标识 | 域标识 | C6 |
终端异常(Terminal Exception) | 0b0010 | 无效 | 生产商定义 |
中断向量访问异常(Vector Exception) | 0b0000 | 无效 | 有效 |
地址对齐 | 0b00x1 | 无效 | 有效 |
一级页表访问失效 | 0b1100 | 无效 | 有效 |
二级页表访问失效 | 0b1110 | 有效 | 有效 |
基于段的地址变换失效 | 0b0101 | 无效 | 有效 |
基于页的地址变换失效 | 0b0111 | 有效 | 有效 |
基于段的存储访问中域控制失效 | 0b1001 | 有效 | 有效 |
基于页的存储访问中域控制失效 | 0b1101 | 有效 | 有效 |
基于段的存储访问中访问权限控制失效 | 0b1111 | 有效 | 有效 |
基于页的存储访问中访问权限控制失效 | 0b0100 | 有效 | 有效 |
基于段的cache预取时外部存储系统失效 | 0b0110 | 有效 | 有效 |
基于页的cache预取时外部存储系统失效 | 0b1000 | 有效 | 有效 |
基于段的非cache预取时外部存储系统失效 | 0b1010 | 有效 | 有效 |
寄存器C6
CP15中的寄存器C6是失效地址寄存器,编码格式如下所示:
31 0 |
失效地址(虚拟地址) |
寄存器C7
CP15的C7寄存器用来控制cache和写缓存,它是一个只写寄存器,读操作将产生不可预知的后果。
访问CP15的C7寄存器的指令格式如下所示:
mcr p15, 0, <rd>, <c7>, crm, <opcode_2> ;<rd>、<crm>和<opcode_2>的不同取值组合 实现不同功能
寄存器C8
CP15的C8寄存器用来控制清除TLB的内容,是只写寄存器,读操作将产生不可预知的后果。
访问CP15的C8寄存器的指令格式如下所示:
mcr p15, 0, <rd>, <c8>, crm, <opcode_2> ;<rd>、<crm>和<opcode_2>的不同取值组合实现不同功能。
寄存器C9
CP15的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的块中选择被替换的块 |
寄存器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无效操作的影响 |
寄存器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。