arm协处理器(转载学习)
转载:http://blog.chinaunix.net/uid-28458801-id-3494572.html
ARM处理器包括两个内部协处理器
1.CP14:用于调试控制
2.CP15:用于内存系统控制和测试控制
ARM 微处理器可支持多达 16 个协处理器,用于各种协处理操作,在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略 ARM 处理器和其他协处理器的指令。ARM 的协处理器指令主要用于 ARM 处理器初始化 ARM 协处理器的数据处理操作,以及在ARM 处理器的寄存器和协处理器的寄存器之间传送数据,和在 ARM 协处理器的寄存器和存储器之间传送数据。 ARM 协处理器指令包括以下 5 条:
— CDP 协处理器数操作指令
— LDC 协处理器数据加载指令
— STC 协处理器数据存储指令
— MCR ARM 处理器寄存器到协处理器寄存器的数据传送指令
— MRC 协处理器寄存器到ARM 处理器寄存器的数据传送指令
1、CDP 指令
CDP 指令的格式为:
CDP 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理 器操作码2。 CDP 指令用于ARM 处理器通知ARM 协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。其中协处理器操作码1 和协处理器操作码2 为协处理器将要执行的操作,目的寄存器和源寄存器均为协处理器的寄存器,指令不涉及ARM 处理器的寄存器和存储器。
指令示例:
CDP P3 , 2 , C12 , C10 , C3 , 4 ;该指令完成协处理器 P3 的初始化
2、LDC 指令
LDC 指令的格式为:
LDC 协处理器编码,目的寄存器,[源寄存器]
LDC 指令用于将源寄存器所指向的存储器中的字数据传送到目的寄存器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,选项表示指令为长读取操作,如用于双精度数据的传输。
指令示例:
LDC P3 , C4 , [R0] ;将 ARM 处理器的寄存器 R0 所指向的存储器中的字数据传送到协处理器 P3 的寄存器 C4 中。
3、STC 指令
STC 指令的格式为:
STC 协处理器编码,源寄存器,[目的寄存器]
STC 指令用于将源寄存器中的字数据传送到目的寄存器所指向的存储器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,选项表示指令为长读取操作,如用于双精度数据的传输。
指令示例:
STC P3 , C4 , [R0] ;将协处理器 P3 的寄存器 C4 中的字数据传送到 ARM 处理器的寄存器R0 所指向的存储器中。
4、MCR 指令
MCR 指令的格式为:
MCR{cond} coproc,opcode1,Rd,CRn,CRm{,opcode2}
其中 coproc 指令操作的协处理器名.标准名为pn,n 为0~15.
cpcode1 协处理器的特定操作码.
Rd 作为ARM 处理器的寄存器.
CRn 存放第1 个操作数的协处理器寄存器.
CRm 存放第2 个操作数的协处理器寄存器.
Opcode2 可选的协处理器特定操作码.
MCR 协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2。
MCR 指令用于将ARM 处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常中断。其中协处理器操作码1 和协处理器操作码2 为协处理器将要执行的操作,源寄存器为ARM 处理器的寄存器,目的寄存器1 和目的寄存器2 均为协处理器的寄存器。
指令示例:
MCR P3,3,R0,C4,C5,6;该指令将 ARM 处理器寄存器 R0 中的数据传送到协处理器 P3 的寄存器 C4 和 C5 中。
5、MRC 指令
MRC 指令的格式为:
MRC {cond} coproc,opcode1,Rd,CRn,CRm{,opcode2}
其中coproc 指令操作的协处理器名.标准名为pn,n,为0~15
Opcodel1 协处理器的特定操作码.
Rd 作为目标寄存器的协处理器寄存器.
CRn 存放第1 个操作数的协处理器寄存器.
CRm 存放第2 个操作数的协处理器寄存器.
opcode2 可选的协处理器特定操作码.
MRC 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。
MRC 指令用于将协处理器寄存器中的数据传送到ARM 处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常中断。其中协处理器操作码1 和协处理器操作码2 为协处理器将要执行的操作,目的寄存器为ARM 处理器的寄存器,源寄存器1 和源寄存器2 均为协处理器的寄存器。
指令示例:
MRC P3,3,R0,C4,C5,6;该指令将协处理器 P3 的寄存器中的数据传送到 ARM 处理器寄存器中.
CP14调试通信通道协处理器
调试通信通道协处理器DCC(the Debug Communications Channel)提供了两个32bits寄存器用于传送数据,还提供了6bits通信数据控制寄存器控制寄存器中的两个位提供目标和主机调试器之间的同步握手。
通信数据控制寄存器
以下指令在 Rd 中返回控制寄存器的值:
MRC p14, 0, Rd, c0, c0
此控制寄存器中的两个位提供目标和主机调试器之间的同步握手:
位 1(W 位) 从目标的角度表示通信数据写入寄存器是否空闲:
W = 0 目标应用程序可以写入新数据。
W = 1 主机调试器可以从写入寄存器中扫描出新数据。
位 0(R 位) 从目标的角度表示通信数据读取寄存器中是否有新数据:
R = 1 有新数据,目标应用程序可以读取。
R = 0 主机调试器可以将新数据扫描到读取寄存器中。
注意
调试器不能利用协处理器 14 直接访问调试通信通道,因为这对调试器无意义。 但调试器可使用扫描链读写 DCC 寄存器。 DCC 数据和控制寄存器可映射到 EmbeddedICE 逻辑单元中的地址。 若要查看 EmbeddedICE 逻辑寄存器,请参阅您的调试器和调试目标的相关文档。
通信数据读取寄存器
用于接收来自调试器的数据的 32 位宽寄存器。 以下指令在 Rd 中返
回读取寄存器的值:
MRC p14, 0, Rd, c1, c0
通信数据写入寄存器
用于向调试器发送数据的 32 位宽寄存器。 以下指令将 Rn 中的值写
到写入寄存器中:
MCR p14, 0, Rn, c1, c0
注意
有关访问 ARM10 和 ARM11 内核 DCC 寄存器的信息,请参阅相应的技术参考手册。 ARM9 之后的各处理器中,所用指令、状态位位置以及对状态位的解释都有所不同。
目标到调试器的通信
这是运行于 ARM 内核上的应用程序与运行于主机上的调试器之间的通信事件
顺序:
1. 目标应用程序检查 DCC 写入寄存器是否空闲可用。 为此,目标应用程序使
用 MRC 指令读取调试通信通道控制寄存器,以检查 W 位是否已清除。
2. 如果 W 位已清除,则通信数据写入寄存器已清空,应用程序对协处理器 14
使用 MCR 指令将字写入通信数据写入寄存器。 写入寄存器操作会自动设置
W 位。如果 W 位已设置,则表明调试器尚未清空通信数据写入寄存器。此
时,如果应用程序需要发送另一个字,它必须轮询 W 位,直到它已清除。
3. 调试器通过扫描链 2 轮询通信数据控制寄存器。 如果调试器发现 W 位已设
置,则它可以读 DCC 数据寄存器,以读取应用程序发送的信息。 读取数据
的进程会自动清除通信数据控制寄存器中的 W 位。
以下代码显示了这一过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
AREA OutChannel, CODE, READONLY ENTRY MOV r1, #3 ; Number of words to send ADR r2, outdata ; Address of data to send pollout MRC p14,0,r0,c0,c0 ; Read control register TST r0, #2 BNE pollout ; if W set , register still full write LDR r3,[r2], #4 ; Read word from outdata ; into r3 and update the pointer MCR p14,0,r3,c1,c0 ; Write word from r3 SUBS r1,r1, #1 ; Update counter BNE pollout ; Loop if more words to be written MOV r0, #0x18 ; Angel_SWIreason_ReportException LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SVC 0x123456 ; ARM semihosting (formerly SWI) outdata DCB "Hello there!" |
调试器到目标的通信
这是运行于主机上的调试器向运行于内核上的应用程序传输消息的事件顺序:
1. 调试器轮询通信数据控制寄存器的 R 位。 如果 R 位已清除,则通信数据读
取寄存器已清空,可将数据写入此寄存器,以供目标应用程序读取。
2. 调试器通过扫描链 2 将数据扫描到通信数据读取寄存器中。 此操作会自动
设置通信数据控制寄存器中的 R 位。
3. 目标应用程序轮询通信数据控制寄存器中的 R 位。 如果该位已经设置,则
通信数据读取寄存器中已经有数据,应用程序可使用 MRC 指令从协处理器
14 读取该数据。 同时,读取指令还会清除 R 位。
以下显示的目标应用程序代码演示了这一过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
AREA InChannel, CODE, READONLY ENTRY MOV r1, #3 ; Number of words to read LDR r2, =indata ; Address to store data read pollin MRC p14,0,r0,c0,c0 ; Read control register TST r0, #1 BEQ pollin ; If R bit clear then loop read MRC p14,0,r3,c1,c0 ; read word into r3 STR r3,[r2], #4 ; Store to memory and ; update pointer SUBS r1,r1, #1 ; Update counter BNE pollin ; Loop if more words to read MOV r0, #0x18 ; Angel_SWIreason_ReportException LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SVC 0x123456 ; ARM semihosting (formerly SWI) AREA Storage, DATA, READWRITE indata DCB "Duffmessage#" END |
fsdasdf
CP15系统控制协处理器
CP15 —系统控制协处理器 (the system control coprocessor)他通过协处理器指令MCR和MRC提供具体的寄存器来配置和控制caches、MMU、保护系统、配置时钟模式(在bootloader时钟初始化用到)
说明:
<opcode_1>:协处理器行为操作码,对于CP15来说,<opcode_1>永远为0b000,否则结果未知。
:不能是r15/pc,否则,结果未知。
:作为目标寄存器的协处理器寄存器,编号为C0~C15。
:附加的目标寄存器或源操作数寄存器,如果不需要设置附加信息,将crm设置为c0,否则结果未知。
<opcode_2>:提供附加信息比如寄存器的版本号或者访问类型,用于区分同一个编号的不同物理寄存器,可以省略<opcode_2>或者将其设置为0,否则结果未知。
ARM处理器中CP15协处理器的寄存器
· CP15的寄存器C0
CP15中寄存器C0对应两个标识符寄存器,由访问CP15中的寄存器指令中的<opcode_2>指定要访问哪个具体物理寄存器,<opcode_2>与两个标识符寄存器的对应关系如下所示:
1)主标识符寄存器
访问主标识符寄存器的指令格式如下所示:
mrc p15, 0, r0, c0, c0, 0 ;将主标识符寄存器C0,0的值读到r0中
ARM不同版本体系处理器中主标识符寄存器的编码格式说明如下。
ARM7之后处理器的主标识符寄存器编码格式如下所示:
ARM7处理器的主标识符寄存器编码格式如下所示:
ARM7之前处理器的主标识符寄存器编码格式如下所示:
2)cache类型标识符寄存器
访问cache类型标识符寄存器的指令格式如下所示:
mrc p15, 0, r0, c0, c0, 1 ;将cache类型标识符寄存器C0,1的值读到r0中
ARM处理器中cache类型标识符寄存器的编码格式如下所示:
其中控制字段位[28:25]的含义说明如下:
cache类型标识符寄存器的控制字段位[28:25]
控制字段位[23:12]和控制字段位[11:0]的编码格式相同,含义如下所示:
cache容量字段bits[8: 6]的含义如下所示:
cache相联特性字段bits[5: 3]的含义如下所示:
cache块大小字段bits[1: 0]的含义如下所示:
· CP15的寄存器C1
访问主标识符寄存器的指令格式如下所示:
mrc p15, 0, r0, c1, c0{, 0} ;将CP15的寄存器C1的值读到r0中
mcr p15, 0, r0, c1, c0{, 0} ;将r0的值写到CP15的寄存器C1中
CP15中的寄存器C1的编码格式及含义说明如下:
· CP15的寄存器C2
CP15中的寄存器C2保存的是页表的基地址,即一级映射描述符表的基地址。其编码格如下所示:
· CP15的寄存器C3
CP15中的寄存器C3定义了ARM处理器的16个域的访问权限。
· CP15的寄存器C5
CP15中的寄存器C5是失效状态寄存器,编码格式如下所示:
其中,域标识bit[7:4]表示存放引起存储访问失效的存储访问所属的域。
状态标识bit[3:0]表示放引起存储访问失效的存储访问类型,该字段含义如表4-3所示(优先级由上到下递减)。
状态标识字段含义:
· CP15中的寄存器C6
CP15中的寄存器C5是失效地址寄存器,编码格式如下所示:
· CP15中的寄存器C7
CP15的C7寄存器用来控制cache和写缓存,它是一个只写寄存器,读操作将产生不可预知的后果。
访问CP15的C7寄存器的指令格式如下所示:
mcr p15, 0, , , crm, <opcode_2> ;、和<opcode_2>的不同取值组合 实现不同功能
· CP15中的寄存器C8
CP15的C8寄存器用来控制清除TLB的内容,是只写寄存器,读操作将产生不可预知的后果。
访问CP15的C8寄存器的指令格式如下所示:
mcr p15, 0, , , crm, <opcode_2> ;、和<opcode_2>的不同取值组合实现不同功能
· CP15中的寄存器C9
CP15的C9寄存器用于控制cache内容锁定。
访问CP15的C9寄存器的指令格式如下所示:
mcr p15, 0, , , c0, <opcode_2>
mrc p15, 0, , , c0, <opcode_2>
如果系统中包含独立的指令cache和数据cache,那么对应于数据cache和指令cache分别有一个独立的cache内容锁定寄存器,<opcode_2>用来选择其中的某个寄存器:
<opcode_2>=1选择指令cache的内容锁定寄存器;
<opcode_2>=0选择数据cache的内容锁定寄存器。
CP15的C9寄存器有A、B两种编码格式。编码格式A如下所示:
其中index表示当下一次发生cache未命中时,将预取的存储块存入cache中该块对应的组中序号为index的cache块中。此时序号为0~index-1的cache块被锁定,当发生cache替换时,从序号为index到ASSOCIATIVITY的块中选择被替换的块。
编码格式B如下所示:
· CP15的寄存器C10
CP15的C10寄存器用于控制TLB内容锁定。
访问CP15的C10寄存器的指令格式如下所示:
mcr p15, 0, , , c0, <opcode_2>
mrc p15, 0, , , c0, <opcode_2>
如果系统中包含独立的指令TLB和数据TLB,那么对应于数据TLB和指令TLB分别有一个独立的TLB内容锁定寄存器,<opcode_2>用来选择其中的某个寄存器:
<opcode_2>=1选择指令TLB的内容锁定寄存器;
<opcode_2>=0选择数据TLB的内容锁定寄存器。
C10寄存器的编码格式如下:
· CP15的寄存器C13
C13寄存器用于快速上下文切换FCSE。
访问CP15的C13寄存器的指令格式如下所示:
mcr p15, 0, , , c0, 0
mrc p15, 0, , , c0, 0
C13寄存器的编码格式如下所示:
其中,PID表示当前进程的所在的进程空间块的编号,即当前进程的进程标识符,取值为0~127。
0:MVA(变换后的虚拟地址)= VA(虚拟地址),禁止FCSE(快速上下文切换技术),系统复位后PID=0;
非0:使能FCSE。