协处理器

协处理器(coprocessor)

协处理器(coprocessor),一种芯片,用于减轻系统微处理器的特定处理任务。

 ARM 微处理器可支持多达 16 个协处理器,用于各种协处理操作,在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略 ARM 处理器和其他协处理器的指令。ARM 的协处理器指令主要用于 ARM 处理器初始化ARM 协处理器的数据处理操作,以及在ARM 处理器的寄存器和协处理器的寄存器之间传送数据,和在 ARM 协处理器的寄存器和存储器之间传送数据。 ARM 协处理器指令包括以下 5 条:

— CDP 协处理器数操作指令

— LDC 协处理器数据加载指令

— STC 协处理器数据存储指令

— MCR ARM 处理器寄存器到协处理器寄存器的数据传送指令

— MRC 协处理器寄存器到ARM 处理器寄存器的数据传送指令

本文介绍cp15

CP15 —系统控制协处理器 (the systemcontrol coprocessor)他通过协处理器指令MCR和MRC提供具体的寄存器来配置和控制caches、MMU、保护系统、配置时钟模式(在bootloader时钟初始化用到)

在基于ARM的嵌入式系统中,存储系统通常是通过系统控制协处理器CP15完成的。

CP15包含16个32位的寄存器,其编号为0-15。实际上对于某些编号的寄存器可能对应有多个物理寄存器。在指令中指定特定的标志位来区分这些物理寄存器。有些类似于ARM寄存器中,处于不同的处理器模式时,ARM某些寄存器可能不同。

CP15的寄存器只能被MRC和MCR(Move to Coprocessor from ARM Register )指令访问
MCR{cond}     coproc,opcode1,Rd(源寄存器),CRn(目标寄存器),CRm(目标寄存器),opcode2
MCR 指令用于将ARM处理器寄存器中的数据传送到协处理器寄存器中。
MRC {cond}    coproc,opcode1,Rd(目标寄存器),CRn(源寄存器),CRm(源寄存器),opcode2
MRC 指令用于将协处理器寄存器中的数据传送到ARM 处理器寄存器中。

注:
coproc         指令操作的协处理器名.标准名为pn,n,为0~15
opcode1      协处理器的特定操作码. 对于CP15寄存器来说,opcode1永远为0,不为0时,操作结果不可预知
opcode2     可选的协处理器特定操作码.                (用来区分同一个编号的不同物理寄存器,当不需要提供附加信息时,指定为0)

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 中的寄存器指令中的 <opcode2> 指定要访问哪个具体物理寄存器, <opcode2> 与两个标识符寄存器的对应关系如下所示:

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 体系版本号
    

产品主编号
    

处理器版本号
各部分的编码详细含义如下表所示:


    

                   说     明

位 [3: 0]
    

生产商定义的处理器版本号

位 [15: 4]
    

生产商定义的产品主编号

其中最高 4 位即位 [15:12] 可能的取值为0x0~0x7 但不能是 0x0 或 0x7

因为:

0x0表示 ARM7之前的处理器

0x7 表示ARM7处理器

位 [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 公司

(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


(二)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

 

(三)CP15 的寄存器 C2

C2寄存器的别名:Translation table base (TTB) register

 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的C3寄存器中,划分了 16个域,每个区域由两位构成,这两位说明了当前内存的检查权限:
00:当前级别下,该内存区域不允许被访问,任何的访问都会引起一个domain fault,这时 AP位无效
01:当前级别下,该内存区域的访问必须配合该内存区域的段描述符中AP位进行权检查
10:保留状态(我们最好不要填写该值,以免引起不能确定的问题)
11:当前级别下,对该内存区域的访问都不进行权限检查。 这时 AP位无效

所以只有当相应域的编码为 01 时,才会根据  AP位 和协处理器CP15中的C1寄存器的R,S位进行权限检查


(五)CP15 的寄存器 C5
CP15 中的寄存器 C5 是失效状态寄存器,分为指令状态失效和数据状态失效。

MRC p15, 0, <Rd>, c5, c0, 0   访问数据失效状态寄存器

MRC p15, 0, <Rd>, c5, c0, 1   访问指令状态失效寄存器

编码格式如下所示:

31            9
    

8
    

7    4
    

3      0

UNP/SBZP
    

0
    

域标识
    

状态标识

其中,域标识bit[7:4]表示存放引起存储访问失效的存储访问所属的域。

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

引起访问失效的原因
    

状态标识
    

域标识
    

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 中的寄存器 C6 是失效地址寄存器,其中保存了引起存储访问失效的地址,分为数据失效地址寄存器和指令失效地址寄存器

MRC p15, 0, <Rd>, c6, c0, 0  访问数据失效地址寄存器

MRC p15, 0, <Rd>, c6, c0, 2  访问指令失效地址寄存器

编码格式如下所示:

31                                                                                                      0

                        失效地址(虚拟地址)

(七)CP15的寄存器C7
CP15 的 C7 寄存器用来控制 cache 和写缓存,它是一个只写寄存器,读操作将产生不可预知的后果。
访问 CP15 的 C7 寄存器的指令格式如下所示:
mcr p15, 0, <rd>, <c7>, crm, <opcode_2>               ;<rd> 、 <crm> 和 <opcode_2> 的不同取值组合,实现不同功能

表中的数据是指Rd中的数据:


(八)CP15的寄存器C8

    系统协处理器CP15的寄存器C8就是清除TLB内容的相关操作。它是一个只写的寄存器。

        MCR    p15,0,Rd,c8,CRm,opcode_2

        Rd中为要写入C8寄存器的内容,CRm和opcode_2的不同组合决定指令执行的不同操作。

指令
    

Rd
    

含义

MCR p15, 0, Rd, c8, c5, 0

    

0
    

使无效整个指令TLB

MCR p15, 0, Rd, c8, c5, 1

    

虚拟地址
    

使无效指令TLB中的单个地址变换条目

MCR p15, 0, Rd, c8, c6, 0

    

0
    

使无效整个数据TLB

MCR p15, 0, Rd, c8, c6, 1

    

虚拟地址
    

使无效数据TLB中的单个地址变换条目

MCR p15, 0, <Rd>, c8, c7, 0

    

0
    

使无效整个数据和指令TLB

MCR p15, 0, <Rd>, c8, c7, 1

    

虚拟地址
    

使无效数据和指令TLB中的单个地址变换条目


(九)CP15的寄存器C12
CP15寄存器C12用来设置异常向量基地址,其编码格式如下所示:

MCR p15, 0, <Rd>, c12, c0, 0                 ;Rd中存放要修改的异常向量基地址

31              5
    

4         0

异常向量基地址
    

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

(十)CP15的寄存器C13

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


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

MCR           p15, 0,<Rd>,<c13>,c0,0

MRC           P15, 0,<Rd>,<c13>,c0,0

其中, 在读操作时,结果中位[31::25]返回PID,其他位 的数值是不可以预知的。写操作将设置PID的值。

        当PID的值为0时,MVA = VA  |  (0(PID)<<25),MVA=VA,相当于禁止了FCSE。系统复位后PID即为0.

        当PID的值不为0时,相当于使能了FCSE。
————————————————
版权声明:本文为CSDN博主「崇尚」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/H_D_C_H/article/details/53438149

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值