ARMv7 CP15协处理器详解

  • 1协处理器指令MCR和MRC
    • 1.1MCR指令
    • 1.2MRC指令  
  • 2CP15的主要功能
  • 3 CP15寄存器功能介绍如下所示:
    • 3.1寄存器c0
    • 3.2寄存器c1
    • 3.3寄存器c2
    • 3.4寄存器C3 
    • 3.5 寄存器C5   
    • 3.6寄存器C6 
    • 3.7寄存器C7 
    • 3.8寄存器C8 
    • 3.9寄存器C9 
    • 3.10 寄存器C10 
    • 3.11寄存器C13 

 

CP15 —系统控制协处理器 (the system control coprocessor),通过协处理器指令 MCR和 MRC 提供具体的寄存器来配置和控制 caches、MMU、保护系统、配置时钟模式(在 bootloader时钟初始化用到)。CP15包含16个32位的寄存器,其编号为0~15。

协处理器指令MCR和MRC

MCR指令

         作用是将ARM处理器的寄存器中的数据传送到协处理器寄存器中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。
语法格式

 

MCR{}

,,{,}

MCR{} p15,0,,,{,}

 

其中,为指令执行的条件码。当忽略时指令为无条件执行。

为协处理器将执行的操作的操作码。对于CP15协处理器来说,< opcode_1>永远为0b000,当< opcode_1>不为0b000时,该指令操作结果不可预知。

作为源寄存器的ARM寄存器,其值将被传送到协处理器寄存器中。

作为目标寄存器的协处理器寄存器,其编号可能是C0,C1,…,C15。

两者组合决定对协处理器寄存器进行所需要的操作,如果没有指定,则将为为C0,opcode_2为0,否则可能导致不可预知的结果。

例:

MCR p15, 0, R4, C1, C0, 0

指令从ARM寄存器R4中中将数据传送到协处理器CP15的寄存器C1中。其中R4为ARM寄存器,存放源操作数,C1、C0为协处理器寄存器,为目标寄存器,opcode_1为0,opcode_2为0。

MRC指令  

将协处理器的寄存器中的数值传送到ARM处理器的寄存器中、如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。

语法格式

MRC{}

,,{,}

MRC{} p15,0,,,{,}

用法参照MCR。

 

CP15的主要功能

(1)获取device id和cache type等一些CPU相关信息。这两个信息存在p15的c0寄存器中,其中c0寄存器有两个实体,一个用来存device id(叫做c0.0),另一个用来存cache type(叫做c0.1)这两个寄存器在读取时命令不同,请参看以下示例代码。

U32 P15_ReadID(void

    U32 id; 

    __asm{ 

        mrc p15,0,id,c0,c0; 

    

    return id; 

   

U32 P15_ReadCacheType(void

    U32 id; 

    __asm{ 

        mrc p15,0,id,c0,c0,1; 

    

    return id; 

对以上代码的说明:
<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寄存器则为控制寄存器。
例:

void MMU_Init(void

    __asm{ 

    

        mov r0,#0x30000000;     // r0=TTBase 即页表的基地址 

        mcr p15,0,r0,c2,c0,0;   // C2中存放地址转换表基地址 

       

        mvn r0, #0;             // 数据取反传送指令 

        mcr p15,0,r0,c3,c0,0;   // 访问类型为管理者权限 

   

    mrc p15,0,r0,c1,c0,0;   // 读出协处理器C1 

    orr r0,r0,#01;          // 或操作,使最低位为1 

    mcr p15,0,r0,c1,c0,0;   // 给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

mrc p15,0,r0,c1,c0,0;  读出c1

orr r0,r0,#R1_nF:OR:R1_iA; 

mcr p15,0,r0,c1,c0,0   ; R1的nF和iA位置1,11对应 Asynchronus bus mode

MOV_PC_LR

MMU_SetFastBusMode

mrc p15,0,r0,c1,c0,0

bic r0,r0,#R1_iA:OR:R1_nF ; 清零nF和iA这两位,00对应 fast bus mode

mcr p15,0,r0,c1,c0,0

MOV_PC_LR

 

 

 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 

由生产商确定 

产品子编号 

产品主编号 

处理器版本号 

 

(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 

属性字段 

数据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相联特性 

块大小 

cache容量字段bits[8: 6]的含义如下所示: 

编    码 

M=0时含义(单位KB) 

M=1时含义(单位KB) 

0b000 

0.5 

0.75 

0b001 

1.5 

0b010 

0b011 

0b100 

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 

附加 

L4 

RR 

位 

说    明 

0:禁止MMU或者PU;1:使能MMU或者PU 

0:禁止地址对齐检查;1:使能地址对齐检查 

0:禁止数据/整个cache;1:使能数据/整个cache 

0:禁止写缓冲;1:使能写缓冲 

0:异常中断处理程序进入32位地址模式;1:异常中断处理程序进入26位地址模式 

0:禁止26位地址异常检查;1:使能26位地址异常检查 

0:选择早期中止模型;1:选择后期中止模型 

0:little endian;1:big endian 

在基于MMU的存储系统中,本位用作系统保护 

在基于MMU的存储系统中,本位用作ROM保护 

0:由生产商定义 

0:禁止跳转预测功能;1:使能跳转预测指令 

0:禁止指令cache;1:使能指令cache 

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 

域标识 

状态标识 

其中,域标识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, , , crm,   ;的不同取值组合 实现不同功能 

 

寄存器C8 

CP15的C8寄存器用来控制清除TLB的内容,是只写寄存器,读操作将产生不可预知的后果。 

 访问CP15的C8寄存器的指令格式如下所示: 

mcr p15, 0, , , crm,   ;的不同取值组合实现不同功能。

寄存器C9 

CP15的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 

其中index表示当下一次发生cache未命中时,将预取的存储块存入cache中该块对应的组中序号为index的cache块中。此时序号为0~index-1的cache块被锁定,当发生cache替换时,从序号为index到ASSOCIATIVITY的块中选择被替换的块。 

编码格式B如下所示: 

31    30                                          W      W-1                                     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, , , 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 

位 

说    明 

victim 

指定下一次TLB没有命中(所需的地址变换条目没有包含在TLB中)时,从内存页表中读取所需的地址变换条目,并把该地址变换条目保存在TLB中地址victim处 

base 

指定TLB替换时,所使用的地址范围,从(base)到(TLB中条目数-1);字段victim的值应该包含在该范围内 

1:写入TLB的地址变换条目不会受使整个TLB无效操作的影响,一直保持有效;0:写入TLB的地址变换条目将会受到使整个TLB无效操作的影响  

寄存器C13 

C13寄存器用于快速上下文切换FCSE。 

访问CP15的C13寄存器的指令格式如下所示: 

mcr p15, 0, , , c0, 0
mrc p15, 0, , , c0, 0

C13寄存器的编码格式如下所示: 

31                25       24                                                                     0 

PID 

其中,PID表示当前进程的所在的进程空间块的编号,即当前进程的进程标识符,取值为0~127。 

0:MVA(变换后的虚拟地址)= VA(虚拟地址),禁止FCSE(快速上下文切换技术),系统复位后PID=0; 

非0:使能FCSE。

你可能感兴趣的:(Working,Hard)