• 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{<cond>} <p>,<opcode_1>,<Rd>,<CRn>,<CRm>{,<opcode_2>}

MCR{<cond>} p15,0,<Rd>,<CRn>,<CRm>{,<opcode_2>}

其中,<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,否则可能导致不可预知的结果。

例:

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

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

MRC指令

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

语法格式

MRC{<cond>} <p>,<opcode_1>,<Rd>,<CRn>,<CRm>{,<opcode_2>}

MRC{<cond>} p15,0,<Rd>,<CRn>,<CRm>{,<opcode_2>}

用法参照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

由生产商确定

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。

ARMv7 CP15协处理器详解相关推荐

  1. CP15协处理器详解以及操作

    我相信对很多驱动工程师而言 对于bootloader这部分还是有很多研究的 但是我相信大部分的工程师都是简要的看下bootloader的初始化流程 对于一些具体的操作还是不懂 比如cp15协处理的操作 ...

  2. (转)ARM协处理器CP15寄存器详解

    用于系统存储管理的协处理器CP15 MCR{cond}     coproc,opcode1,Rd,CRn,CRm,opcode2 MRC {cond}    coproc,opcode1,Rd,CR ...

  3. ARM协处理器CP15寄存器详解

    用于系统存储管理的协处理器CP15 MCR{cond}     coproc,opcode1,Rd,CRn,CRm,opcode2 MRC {cond}    coproc,opcode1,Rd,CR ...

  4. iOS——armv7,armv7s,arm64详解

    这2天升级到xcode6,用ios8 SDK编译老项目,各种Undefined symbols for architecture xxx,精神差点崩溃了.不过最后还是解决了,本文简单总结一下 简单来说 ...

  5. ARMv7-A 处理器窥探(2) —— CP15 协处理器

    目录 1.ARMv7-A 协处理器 2.CP15 协处理器 2.1.组成 2.2.访问指令 2.2.1.MCR 2.2.2.MRC 2.3.Cp15 协处理器寄存器组成 2.3.0.Cp15-c0 寄 ...

  6. 以SIGSEGV为例详解信号处理(与栈回溯)

    以SIGSEGV为例详解信号处理(与栈回溯) 信号是内核提供的向用户态进程发送信息的机制, 常见的有使用SIGUSR1唤醒用户进程执行子程序或发生段错误时使用SIGSEGV保存用户错误现场. 本文以S ...

  7. U-Boot启动流程详解

    参考:U-Boot顶层目录链接脚本文件(u-boot.lds)介绍 作者:一只青木呀 发布时间: 2020-10-23 13:52:23 网址:https://blog.csdn.net/weixin ...

  8. ARM 寄存器 详解

    From( ARM 寄存器详解 ):https://blog.csdn.net/sandeldeng/article/details/52954781 ARM 汇编基础教程:2.数据类型和寄存器:ht ...

  9. neon浮点运算_ARM 浮点运算详解

    原标题:ARM 浮点运算详解 一:早期 上的浮点模拟器: 早期的ARM没有协处理器,所以是由CPU来模拟的,即所需浮点运算均在浮点运算模拟器(float math emulation)上进行,需要的浮 ...

最新文章

  1. mysql为int类型的字段php取出来之后为何变为string类型?
  2. SpringBoot配置属性之Server
  3. CodeForces - 833B The Bakery
  4. HTML5 本地存储
  5. Hey, everybody!
  6. vue 使用axios
  7. 第K个幸运排列 (51Nod-1635)
  8. Spring Cloud (4)---Eureka(服务注册与消费详解)
  9. 对象新增方法 object.is() object.assign()
  10. http服务ajax编程
  11. 【原】无脑操作:ElasticSearch学习笔记(01)
  12. 使用Xtrabackup来备份你的mysql
  13. mysql是个单用户数据库_MySQL是一个支持单用户的数据库管理系统 答案:×
  14. SpringCloud分布式架构演进
  15. Mac如何做才能彻底清理垃圾
  16. 【观察】数字中国的新机遇,神州数码的新角色
  17. 论文导读:Deep Attentive Learning for Stock Movement Prediction From Social Media Text and Company Correl
  18. API Bank,并不简单
  19. 关于互相帮忙投票的微信群、微信刷投票群、微信投票刷票群的详情介绍
  20. 云栖大会上宣布即将开源的手淘Atlas什么来头?

热门文章

  1. 阿里技术四面+交叉面+HR面,成功拿到offer
  2. 讲述非科班的面试过程:阿里三面+交叉面试+技术面试+HR面试,一路艰难,中拿下了字节跳动的offer!
  3. Makefile初级语法1
  4. setpercision(n) setiosflags(ios::fixed) setiosflags(ios::scientific)
  5. 苹果手表支持android,苹果用户买Apple Watch,安卓用户又有哪些智能手表值得推荐?...
  6. NVIDIA Jetson TX1介绍(二)
  7. Jetson TX2挂载SD卡--亲测有效!
  8. layoutinflater详解
  9. linux删除文件夹下所有文件
  10. 如何选出优秀的竞品,进行分析