ARM协处理器介绍

概述

在基于ARM的嵌入式应用系统中,存储系统的操作通常是由协处理器CP15完成的。CP15包含16个32位的寄存器,其编号为0~15。而访问CP15寄存器的指令主要是MCRMRC这两个指令。

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

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

1、指令格式

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) 汇编语法表示:

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="assembly" cid="n15" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> 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</pre>

(2) C语言语法表示:

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="c" cid="n17" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> 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作了改动
);</pre>

2、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 因不同设计而异 因不同设计而异 因不同设计而异

(1) CP15的寄存器C0

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

opcode2 编码 对应的标识符号寄存器
0b000 主标识符寄存器
0b001 cache类型标识符寄存器
其 他 保留

A、主标识符寄存器

  • 主标示符的编码格式对于不同的ARM处理器版本有所不同。对于AMR7之后的处理器,其主标示符编码格式如下 :

    • 指令格式MRC P15,0,R0,C0,C0,0,将主标示符寄存器的内容读到AMR寄存器R0中 。
  • 各部分的编码详细含义如下表所示:

30****~24 23****~20 19****~16 15****~4 3****~0
由生产商确定 产品子编号 ARM 体系版本号 产品主编号 处理器版本号

Bcache类型标识符寄存器

  • ARM 处理器中 cache 类型标识符寄存器的编码格式如下所示:

    • 指令格式:MRC P15,0,R0,C0,C0,1,将cache类型标识符寄存器内容读到AMR寄存器R0中
  • 各部分字段含义如下所示:

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 内容锁定方法
0b000 写通类型 不需要内容清除 不支持内容锁定
0b0001 写回类型 数据块读取 不支持内容锁定
0b0010 写回类型 由寄存器 C7 定义 不支持内容锁定
0b0110 写回类型 由寄存器 C7 定义 支持格式 A
0b0111 写回类型 由寄存器 C7 定义 支持格式 B

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

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

(3)CP15的寄存器C2

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

[31:0]
一级映射描述符表的基地址(物理地址)

(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位进行权限检查。

(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] 表示放引起存储访问失效的存储访问类型,该字段含义如下表所示(优先级由上到下递减)。

(6) CP15的寄存器C6

CP15 中的寄存器 C6 是失效地址寄存器,其中保存了引起存储访问失效的地址,分为数据失效地址寄存器和指令失效地址寄存器。

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

MRC p15, 0, , c6, c0, 2 :访问指令失效地址寄存器 编码格式如下所示:

[31:0]
失效地址(虚拟地址)

(7) CP15的寄存器C7

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

访问 CP15 的 C7 寄存器的指令格式为:mcr p15, 0, Rd, CRn, CRm, opcode_2 。具体含义如下表所示(表中的数据是指Rd中的数据)

(8) CP15的寄存器C8

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

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

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

(9) CP15的寄存器C12

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

[31:5] [4:0]
异常向量基地址 Reserve

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

(10) 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。

参考链接:

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • cpsr 指令 ARM指令集提供了两个指令直接控制程序状态寄存器( psr ),在非USER模式下控制程序状态寄存...
    kekeMemory阅读 253评论 0 1
  • 伪操作.section 【段名】 .text代码段 .data数据 .bss未初始化 .rodata只读 .sec...
    人不知QAQ阅读 586评论 0 0
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,401评论 16 21
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,498评论 0 11
  • 可爱进取,孤独成精。努力飞翔,天堂翱翔。战争美好,孤独进取。胆大飞翔,成就辉煌。努力进取,遥望,和谐家园。可爱游走...
    赵原野阅读 2,681评论 1 1