访问CP15寄存器的指令

Coprocessor Interface

主要参考ARM公司的datasheet.

cp15的作用主要是MMU,大小端控制,总线模式等这些控制。

操作cp15的时候,需要用到汇编语言,c语言无能为力。

可以参考 http://v.uplook.cn/videoyykf/emb/942/12791.html


zz:http://blog.csdn.net/genglei1022/article/details/5712843


4.1.1   访问 CP15 寄存器的指令

访问 CP15 寄存器指令的编码格式及语法说明如下:

31  28

27  24

23  21

20

19  16

15  12

11  8

7  5

4

3  0

cond

1 1 1 0

opcode_1

L

cr n

rd

1 1 1 1

opcode_2

1

crm

说明:

<opcode_1> :协处理器行为操作码,对于 CP15 来说, <opcode_1> 永远为 0b000 ,否则结果未知。

<rd> :不能是 r15/pc ,否则,结果未知。

<crn> :作为目标寄存器的协处理器寄存器,编号为 C0~C15 。

<crm> :附加的目标寄存器或源操作数寄存器,如果不需要设置附加信息,将 crm 设置为 c0 ,否则结果未知。

<opcode_2> :提供附加信息比如寄存器的版本号或者访问类型,用于区分同一个编号的不同物理寄存器,可以省略 <opcode_2> 或者将其 设置为 0 ,否则结 果未知。

指     

说     明

语法格式

mcr

将 ARM 处理器的寄存器中的数据写到 CP15 中的寄存器中

mcr{<cond>}   p15, <opcode_1>, <rd>, <crn>, <crm>, {<opcode_2>}

mrc

将 CP15 中的寄存器中的数据读到 ARM 处理器的寄存器中

mcr{<cond>}   p15, <opcode_1>, <rd>, <crn>, <crm>, {<opcode_2>}

4.1.2   CP15 寄存器介绍

CP15 的寄存器列表如表 4-1 所示。

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

 

opcode_2 编码

对应的标识符号寄存器

0b000

主 标识符寄存器

0b001

cache 类型标识符寄存器

其 他

保 留

1 )主标识符寄存器

访 问主标识符寄存器的指令格式如下所示:

mrc p15, 0, r0, c0, c0, 0       ;将主标识符寄存器 C0,0 的值读到 r0 中

ARM 不同版本体系处理器中主标识符寄存器的编码格式说明如下。

ARM7 之后处理器的主标识符寄存器编码格式 如下所示:

31             24      23            20      19               16    15              4     3               0

由 生产商确定

产 品子编号

ARM 体系版本号

产 品主编号

处 理器版本号

 

说     明

位 [3: 0]

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

位 [15: 4]

生产商定义的产品主编号,其中最高 4 位即位 [15:12] 可能的取值为0~7 但不能是 0 或 7

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

ARM7 处理器的主标识符寄存器编码格式如下所示:

31             24      23     22                        16           15          4         3          0

由生产商确定

A

产品子编号

产品主编号

处理器版本号

 

说     明

位 [3: 0]

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

位 [15: 4]

生产商定义的产品主编号,其中最高 4 位即位 [15:12] 的值为 0x7

位 [22: 16]

生产商定义的产品子编号,当产品主编号相同时,使用子编号来区分不同的产品子类,如产品中不同的高速缓存的大小等

续表  

说     明

位 [23]

ARM7 支持下面两种 ARM 体系的版本号:

0x0   ARM 体系版本 3

0x1   ARM 体系版本 4T

位 [31: 24]

生产厂商的编号,现在已经定义的有以下值:

0x41  =A  ARM 公司

0x44  =D  Digital Equipment 公司

0x69  =I   Intel 公司

ARM7 之前处理器的主标识符寄存器编码格式如下所示:

31           24       23       22                    16             15          4         3           0

由生产商确定

A

产品子编号

产品主编号

处理器版本号

 

说     明

位 [3: 0]

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

位 [15: 4]

生产商定义的产品主编号,其中最高 4 位即为 [15:12] 的值为 0x7

位 [22: 16]

生产商定义的产品子编号,当产品主编号相同时,使用子编号来区分不同的产品子类,如产品中不同的高速缓存的大小等

位 [23]

ARM7 支持下面两种 ARM 体系的版本号:

0x0   ARM 体系版本 3

0x1   ARM 体系版本 4T

位 [31: 24]

生产厂商的编号,现在已经定义的有以下值:

0x41  =A  ARM 公司

0x44  =D  Digital Equipment 公司

0x69  =I   intel 公司

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 的属性

其中 控制字段位 [28 : 25] 的含义 说明如下:

表 4-2  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 字节)

·      CP15 的寄存器 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 指令

附加:

 

·      CP15 的寄存器 C2

CP15 中的寄存器 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 的寄存器 C5

CP15 中的寄存器 C5 是失效状态寄存器,编码格式如下所示:

31                                                            9        8    7       4     3        0

UNP/SBZP

0

域标识

状态标识

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

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

表 4-3  状态标识字段含义

引起访问失效的原因

状态标识

域标识

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 中的寄存器 C5 是失效地址寄存器,编码格式如下所示:

31                                                                                                      0

失效地址(虚拟地址)

·      CP15 中的寄存器 C7

CP15 的 C7 寄存器用来控制 cache 和写缓存,它是一个只写寄存器,读操作将产生不可预知的后果。

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

mcr p15, 0, <rd>, <c7>, crm, <opcode_2> ; <rd> 、 <crm> 和 <opcode_2> 的不同取值组合     实现不同功能

·      CP15 中的寄存器 C8

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

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

mcr p15, 0, <rd>, <c8>, crm, <opcode_2> ; <rd> 、 <crm> 和 <opcode_2> 的不同取值组合实现不同功能,见第 4.2 节

·      CP15 中的寄存器 C9

C P15 的 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 的块中 选择被替换的块

·      CP15 的寄存器 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 无效操作的影响

·      CP15 的寄存器 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 。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值