协处理器CP15介绍—MCR/MRC指令(6)

概述:在基于ARM的嵌入式应用系统中,存储系统的操作通常是由协处理器CP15完成的。CP15包含16个32位的寄存器,其编号为0~15。

而访问CP15寄存器的指令主要是MCR和MRC这两个指令。

例如协处理器15(CP15),ARM处理器使用协处理器15的寄存器来控制cache、TCM和存储器管理。

而访问CP15寄存器的指令主要是MCR和MRC这两个指令:

MRC:协处理器寄存器到ARM处理器寄存器的数据传送指令(读出协处理器寄存器)。

MCR:ARM处理器寄存器到协处理器寄存器的数据传送指令(写入协处理器寄存器)。

1.MRC/MCR指令读取CP15寄存器格式:

MRC{cond} p15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>              

MCR{cond} p15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>

cond:为指令执行的条件码。当cond忽略时指令为无条件执行。  Opcode_1:协处理器的特定操作码. 对于CP15寄存器来说,opcode1=0 Rd:作为源寄存器的ARM寄存器,其值将被传送到协处理器寄存器中,或者将协处理器寄存器的值传送到该寄存器里面 ,通常为R0 CRn:作为目标寄存器的协处理器寄存器,其编号是C~C15。  CRm:协处理器中附加的目标寄存器或源操作数寄存器。如果不需要设置附加信息,将CRm设置为c0,否则结果未知  Opcode_2:可选的协处理器特定操作码。(用来区分同一个编号的不同物理寄存器,当不需要提供附加信息时,指定为0) 

1.1 示例:

mrc p15, 0, r0, c1, c0, 0                               //将 CP15 的寄存器 C1 的值读到 r0 中

mcr p15, 0, r0, c7, c7, 0                              //关闭ICaches和DCaches

mcr p15, 0, r0, c8, c7, 0                             //使无效整个数据TLB和指令TLB

1.2 在C函数中使用汇编示例:

__asm__( "mrc p15, 0, r1, c1, c0, 0\n"                      //使用__asm__  可以在C函数中执行汇编语句 "orr r1, r1, #0xc0000000\n"                                          "mcr p15, 0, r1, c1, c0, 0\n"   :::"r1"                                                                        //:::"r1" 向GCC声明:我对r1作了改动

); 

2.CP15中的寄存器介绍

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

因不同设计而异

因不同设计而异

因不同设计而异

2.1 CP15 的寄存器 C0

  CP15 中寄存器 C0 对应两个标识符寄存器,由访问 CP15 的寄存器指令指定要访问哪个具体物理寄存器,与两个标识符寄存器的对应关系如下所示:

opcode2 编码

对应的标识符号寄存器

0b000

主标识符寄存器

0b001

cache类型标识符寄存器

其 他

保留

1、主标识符寄存器  指令格式:MRC P15,0,R0,C0,C0,0 #将主标示符寄存器的内容读到AMR寄存器R0中  主标示符的编码格式对于不同的ARM处理器版本有所不同。对于AMR7之后的处理器,其主标示符编码格式如下 :

30~24

23~20

19~16

15~4

3~0

由生产商确定

产品子编号

ARM 体系版本号

产品主编号

处理器版本号

各部分的编码详细含义如下表所示:  2、cache类型标识符寄存器 指令格式:MRC P15,0,R0,C0,C0,1 #将cache类型标识符寄存器的内容读到AMR寄存器R0中  ARM 处理器中 cache 类型标识符寄存器的编码格式如下所示:

31~29

28~25

24

23~12

11~0

000

属性字段

S

数据 cache 相关属性

指令cache 相关属性

各部分的编码详细含义如下表所示:

含义

位[28: 25]

主要用于定义对于写回类型的cache的一些属性

位[24]

定义系统中的数据 cache 和指令 cache 是分开的还是统一的: 0: 系统的数据 cache 和指令 cache 是统一的 1: 系统的数据 cache 和指令 cache 是分开的

位 [23: 12]

定义数据 cache 的相关属性,如果位 [24] 为 0 ,本字段定义整个cache 的属性

位 [31: 24]

定义指令 cache 的相关属性,如果位 [24] 为 0 ,本字段定义整个cache 的属性

控制字段位 [28 : 25] 的含义 主要用于定义对于写回类型的cache的一些属性,cache 类型标识符寄存器的控制字段位 [28 : 25]:

编 码

cache 类型

cache 内容清除方法

cache 内容锁定方法

0b0000

写通类型

不需要内容清除

不支持内容锁定

0b0001

写回类型

数据块读取

不支持内容锁定

0b0010

写回类型

由寄存器 C7 定义

不支持内容锁定

0b0110

写回类型

由寄存器 C7 定义

支持格式 A

0b0111

写回类型

由寄存器 C7 定义

支持格式 B

控制字段位 [23 : 12] 及控制字段位 [11 : 0] 含义 [23:12]用于定义数据cache的属性,[11: 0]用于定义指令cache的属性。编码格式如下:

11~9

8~6

5~3

2

1~0

000

cache 容量

cache 相联特性

M

块大小

其中bits[1:0]含义如下:

编 码

cache 块大小

0b00

2 个 字( 8 字节)

0b01

4 个 字( 16 字节)

0b10

8 个 字( 32 字节)

0b11

16 个 字( 64 字节)

其中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 路相联

其中bits[8:6]含义如下:

编 码

M=0 时含义

M=1时含义

0b000

0.5KB

0.75 KB

0b001

1 KB

1.5 KB

0b010

2 KB

3 KB

0b011

4 KB

6 KB

0b100

8 KB

12 KB

0b101

16 KB

24 KB

0b110

32 KB

48 KB

0b111

64 KB

96 KB

2.2 CP15 的寄存器 C1

CP15中的寄存器C1是一个控制寄存器,它包括以下控制功能:

  • 禁止或使能MMU以及其他与存储系统相关的功能
  • 配置存储系统以及ARM处理器中的相关部分的工作

指令如下:  mrc p15, 0, r0, c1, c0{, 0} ;将 CP15 的寄存器 C1 的值读到 r0 中  mcr p15, 0, r0, c1, c0{, 0} ;将 r0 的值写到 CP15 的寄存器 C1 中  CP15 中的寄存器 C1 的编码格式及含义说明如下:

C1中的控制位

含义

M(bit[0])

0 :禁止 MMU 或者 PU 1 :使能 MMU 或者 PU  如果系统中没有MMU及PU,读取时该位返回0,写入时忽略该位。

A(bit[1])

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

C(bit[2])

当数据cache和指令cache分开时,本控制位禁止/使能数据cache。当数据cache和指令cache统一时,该控制位禁止/使能整个cache。 0 :禁止数据 / 整个 cache  1 :使能数据 / 整个 cache 如果系统中不含cache,读取时该位返回0.写入时忽略 当系统中不能禁止cache 时,读取时返回1.写入时忽略

W(bit[3])

0 :禁止写缓冲 1 :使能写缓冲 如果系统中不含写缓冲时,读取时该位返回0.写入时忽略 当系统中不能禁止写缓冲时,读取时返回1.写入时忽略

P(bit[4])

对于向前兼容26位地址的ARM处理器,本控制位控制PROG32控制信号 0 :异常中断处理程序进入 32 位地址模式 1 :异常中断处理程序进入26 位地址模式 如果本系统中不支持向前兼容26位地址,读取该位时返回1,写入时忽略

D(bit[5])

对于向前兼容26位地址的ARM处理器,本控制位控制DATA32控制信号 0 :禁止 26 位地址异常检查 1 :使能 26 位地址异常检查 如果本系统中不支持向前兼容26位地址,读取该位时返回1,写入时忽略

L(bit[6])

对于ARMv3及以前的版本,本控制位可以控制处理器的中止模型 0 :选择早期中止模型 1 :选择后期中止模型

B(bit[7])

对于存储系统同时支持big-endian和little-endian的ARM系统,本控制位配置系统的存储模式 0 : little endian  1 : big endian 对于只支持little-endian的系统,读取时该位返回0,写入时忽略 对于只支持big-endian的系统,读取时该位返回1,写入时忽略

S(bit[8])

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

R(bit[9])

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

F(bit[10])

由生产商定义

Z(bit[11])

对于支持跳转预测的ARM系统,本控制位禁止/使能跳转预测功能 0 :禁止跳转预测功能  1 :使能跳转预测功能 对于不支持跳转预测的ARM系统,读取该位时返回0,写入时忽略

I(bit[12])

当数据cache和指令cache是分开的,本控制位禁止/使能指令cache 0 :禁止指令 cache  1 :使能指令 cache 如果系统中使用统一的指令cache和数据cache或者系统中不含cache,读取该位时返回0,写入时忽略。当系统中的指令cache不能禁止时,读取时该位返回1,写入时忽略

V(bit[13])

对于支持高端异常向量表的系统,本控制位控制向量表的位置 0 :选择低端异常中断向量 0x0~0x1c  1 :选择高端异常中断向量0xffff0000~ 0xffff001c 对于不支持高端异常向量表的系统,读取时该位返回0,写入时忽略

PR(bit[14])

如果系统中的cache的淘汰算法可以选择的话,本控制位选择淘汰算法 0 :常规的 cache 淘汰算法,如随机淘汰  1 :预测性淘汰算法,如round-robin 淘汰算法 如果系统中cache的淘汰算法不可选择,写入该位时忽略。读取该位时,根据其淘汰算法是否可以比较简单地预测最坏情况返回0或者1

L4(bit[15])

对于ARM版本5及以上的版本,本控制位可以提供兼容以前的ARM版本的功能 0 :保持 ARMv5 以上版本的正常功能 1 :将 ARMv5 以上版本与以前版本处理器 兼容,不根据跳转地址的 bit[0] 进行 ARM 指令和 Thumb 状态切换: bit[0] 等于 0 表示 ARM 指令,等于 1 表示 Thumb 指令

Bits[31:16])

这些位保留将来使用,应为UNP/SBZP

2.3 CP15 的寄存器 C2

C2寄存器的别名:Translation table base (TTB) register  C2寄存器用来保存页表的基地址,即一级映射描述符表的基地址。其编码格如下所示:

31                                                0

一级映射描述符表的基地址(物理地址)

2.4 CP15 的寄存器 C3

CP15 中的寄存器 C3 定义了 ARM 处理器的 16 个域的访问权限。  在 CP15的C3寄存器中,划分了 16个域,每个区域由两位构成,这两位说明了当前内存的检查权限:  00:当前级别下,该内存区域不允许被访问,任何的访问都会引起一个domain fault,这时 AP位无效  01:当前级别下,该内存区域的访问必须配合该内存区域的段描述符中AP位进行权检查  10:保留状态(我们最好不要填写该值,以免引起不能确定的问题)  11:当前级别下,对该内存区域的访问都不进行权限检查。 这时 AP位无效  所以只有当相应域的编码为 01 时,才会根据 AP位 和协处理器CP15中的C1寄存器的R,S位进行权限检查

2.5 CP15 的寄存器 C5

CP15 中的寄存器 C5 是失效状态寄存器,分为指令状态失效和数据状态失效。  MRC p15, 0, , c5, c0, 0 访问数据失效状态寄存器  MRC p15, 0, , c5, c0, 1 访问指令状态失效寄存器  编码格式如下所示:

31~9

8

7~4

3~0

UNP/SBZP

0

域标识

状态标识

其中,域标识bit[7:4]表示存放引起存储访问失效的存储访问所属的域。状态标识 bit[3:0] 表示放引起存储访问失效的存储访问类型,该字段含义如下表所示(优先级由上到下递减)。 

2.4 CP15的寄存器C6

CP15 中的寄存器 C6 是失效地址寄存器,其中保存了引起存储访问失效的地址,分为数据失效地址寄存器和指令失效地址寄存器。  MRC p15, 0, , c6, c0, 0 访问数据失效地址寄存器  MRC p15, 0, , c6, c0, 2 访问指令失效地址寄存器  编码格式如下所示:

31                                                0

失效地址(虚拟地址)

2.5 CP15的寄存器C7

CP15 的 C7 寄存器用来控制 cache 和写缓存,它是一个只写寄存器,读操作将产生不可预知的后果。访问 CP15 的 C7 寄存器的指令格式为:mcr p15, 0, Rd, CRn, CRm, opcode_2 。具体含义如下表所示(表中的数据是指Rd中的数据) 

2.6 CP15的寄存器C8

系统协处理器CP15的寄存器C8就是清除TLB内容的相关操作。它是一个只写的寄存器。  MCR p15,0,Rd,c8,CRm,opcode_2  Rd中为要写入C8寄存器的内容,CRm和opcode_2的不同组合决定指令执行的不同操作。 

2.7 CP15的寄存器C12

CP15寄存器C12用来设置异常向量基地址,其编码格式如下所示:  MCR p15, 0, , c12, c0, 0 ;Rd中存放要修改的异常向量基地址

31~5

4~0

异常向量基地址

Reserve

注:只有ARM11和cortex-a 可以任意修改异常向量基地址。arm7,ARM9,ARM10只可以在0地址或0xffff0000中

2.8 CP15的寄存器C13

CP15中的寄存器C13用于快速上下文切换。其编码格式如下所示

31~25

24~0

PID

其中, 在读操作时,结果中位[31::25]返回PID,其他位 的数值是不可以预知的。写操作将设置PID的值。当PID的值为0时,MVA = VA | (0(PID)<<25),MVA=VA,相当于禁止了FCSE。系统复位后PID即为0。当PID的值不为0时,相当于使能了FCSE。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员与猫

CLR和.Net对象生存周期

标签:GC .Net C# CLR 前言 对象的生存周期和垃圾回收一直是容易被我们忽略的知识点,因为我们现在高级语言编程平台太“智能”了,自动的异常处理,内存管...

1955
来自专栏开发技术

spring-boot-2.0.3不一样系列之源码篇 - SpringApplication的run方法(一)之SpringApplicationRunListener,绝对有值得你看的地方

  Springboot启动源码系列还只写了一篇,已经过去一周,又到了每周一更的时间了(是不是很熟悉?),大家有没有很期待了?我会尽量保证启动源码系列每周一更,...

1012
来自专栏JavaQ

Java研发方向如何准备BAT技术面试答案(上)

最近因为忙于工作,没时间整理,本篇是下班后晚上抽空整理的,文中部分答案本来是想自己好好整理一份的,但是时间真的很紧,所以就整理了一下网络上的文章链接,挑了写的不...

3345
来自专栏JAVA技术zhai

并发编程的艺术

关于 Java 并发也算是写了好几篇文章了,本文将介绍一些比较基础的内容,注意,阅读本文需要一定的并发基础。

1222
来自专栏十月梦想

多个Promise对象的处理

如果某件事情需要依照多个对象完成后才能执行,那么我们可以使用Promise.all来管理,将这些状态全部执行完毕后才执行下一个!

831
来自专栏程序员与猫

CLR和.Net对象生存周期

1166
来自专栏大壮

iOS 内存管理的理解分享(理论篇)

1427
来自专栏Java架构师学习

十年Java”老兵“浅谈源码的七大设计模式

一个专业的程序员,总是把代码的清晰性,兼容性,可移植性放在很重要的位置。他们总是通过定义大量的宏,来增强代码的清晰度和可读性,而又不增加编译后的代码长度和代码...

35212
来自专栏Kevin-ZhangCG

二十三种设计模式总结

定义:Ensure a class has only one instance, and provide a global point of access to...

812
来自专栏前端进阶之路

从0到1实现Promise前言正文结束

Promise大家一定都不陌生了,JavaScript异步流程从最初的Callback,到Promise,到Generator,再到目前使用最多的Async/A...

883

扫码关注云+社区