五大ARM存储器之一:协处理器CP15
结果。
其中,CDP为协处理器数据操作指令,这个指令初始化一些与协处理器相关的操作;
LDC为一个或多个字的协处理器数据读取指令,此指令从存储器读取数据到指定的协处理器中;
STC为一个或多个32位字的协处理器数据写入指令,此指令初始化一个协处理器的写操作,从给定的协处理器把数据传送到存储器中。
指令MCR和MRC指令访问CP15寄存器使用通用语法。
语法格式为:
MCR{《cond》} p15,《opcode1=0》,《Rd》,《CRn》,《CRm》{,《opcode2》}
MRC{《cond》} p15,《opcode1=0》,《Rd》,《CRn》,《CRm》{,《opcode2》}
其中:
《cond》为指令的执行条件。当《cond》条件域为空时,指令无条件执行;
《opcode1》在标准的MRC指令中,为协处理器的《opcode1》,即操作数1。对于CP15来说,此操作数恒为0,即0b000。当针对CP15的MRC指令中《opcode1》不为0时,指令的操作结果不可预知;
《Rd》为ARM寄存器,在ARM和协处理器交换数据时使用。在MRC指令中作为目的寄存器,在MCR中作为源寄存器。
注意r15不能作为ARM寄存器出现在MRC或MCR指令中,如果r15作为《Rd》出现在这里,那么指令的执行结果不可预知。
《CRn》是CP15协处理器指令中用到的主要寄存器。在MRC指令中为源寄存器,在MCR中为目的寄存器。CP15协处理器的寄存器c0、c1、…、c15均可出现在这里。
《CRm》是附加的协处理器寄存器,用于区分同一个编号的不同物理寄存器和访问类型。当指令中不需要提供附加信息时,将《CRm》指定为C0,否则指令的操作结果不可预知。
《opcode2》提供附加信息,用于区分同一个编号的不同物理寄存器,当指令中没有指定附加信息时,省略《opcode2》或者将其指定为0,否则指令的操作结果不可预知。
MCR和MRC指令只能操作在特权模式下,如果处理器运行在用户模式,指令的执行结果不可预知。
注意在用户模式下,如果要访问系统控制协处理器,通常的做法是由操作系统提供SWI软中断调用来完成系统模式的切换。由于不同型号的ARM处理器对此管理差别很大,所以建议用户在应用时将SWI作为一个独立的模块来管理并向上提供通用接口,以屏蔽不同型号处理器之间的差异。
例1给出了一个典型的利用SWI进行模式切换的例子。
典型的在SWI中进行模式切换的例子。利用此例,调用SWI 0来完成系统模式切换。
EHT_SWI
LDR sp,=EHT_Exception_Stack ;更新SWI堆栈指针
ADD sp,sp,#EXCEPTION_SIZE ;得到栈顶指针
STMDB sp!,{r0-r2,lr} ;保存程序中用到的寄存器
MRS r0,SPSR ;得到SPSR
STMDB sp!,{r0} ;保持SPSR
LDR r0,[lr,#-4] ;计算SWI指令地址
BIC r0,r0,#0xFF000000 ;提取中断向量号
CMP r0,#MAX_SWI ;检测中断向量范围
LDRLS pc,[pc,r0,LSL #2] ;如果在范围内,跳转到软中断向量表
B EHT_SWI_Exit ;为定义的SWI指令出口
EHT_Jump_Table
DCD EHT_SU_Switch
DCD EHT_Disable_Interrupts
;用户可在此添加更多的自定义软中断,在此SWI0作为系统保留的软中断,调用例程EHT_SU_Switch,来进行模式切换
;*********************************************************************************
EHT_SU_Switch
MMU_DISABLE ;转换前禁用MMU
LDMIA sp!,{r0} ;从堆栈中取出SPSR
BIC r0,r0,#MODE_MASK ;清除模式位
ORR r0,r0,#SYS_MODE ;设置程序状态字的supper模式位
STMDB sp!,{r0} ;从新将SPSR放入堆栈
B EHT_SWI_Exit
EHT_Disable_Interrupts
LDMIA sp!,{r0} ;从堆栈中读出SPSR
ORR r0,r0,#LOCKOUT ;禁止中断
STMDB sp!,{r0} ;存储SPSR到中断
; B EHT_SWI_Exit
EHT_SWI_Exit
LDMIA sp!,{r0} ;从堆栈中读出SPSR
MSR SPSR_cf,r0 ;将SPSR放入SPSR_cf
LDMIA sp!,{r0-r2,pc}^ ;寄存器出栈并返回
END
1.2 CP15中的寄存器
表1给出了CP15主要寄存器的功能和作用。
表1 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.3 寄存器c0
寄存器
ARM存储器协处理器CP1 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
