![](https://csdnimg.cn/release/download_crawler_static/18957740/bg1.jpg)
ARM-CP15 协处理器
ARM
处理器使用协处理器
15(CP15)
的寄存器来控制
cache
、
TCM
和存储器管
理。
CP15
的寄存器只能被
MRC
和
MCR
(
Move to Coprocessor from ARM
Register
)指令访问,包含
16
个
32
位的寄存器,其编号为
0~15
。本篇重点讲
解其中的
C7,C2,C13
三个寄存器。
先拆解一段汇编代码
上来就看汇编,不用发怵,没那么恐怖,内核其实挺好玩的。见于
arm.h
,里
面全是这些玩意。
1. #define DSB __asm__ volatile("dsb" ::: "memory")
2. #define ISB __asm__ volatile("isb" ::: "memory")
3. #define DMB __asm__ volatile("dmb" ::: "memory")
4.
5. STATIC INLINE VOID OsArmWriteBpiallis(UINT32 val)
6. {
7. __asm__ volatile("mcr p15, 0, %0, c7,c1,6" ::"r"(val));
8. __asm__ volatile("isb" ::: "memory");
9. }
将 ARM 处理器的寄
存器中的数据写到
CP15 中的寄存器中
mcr{<cond>}p15, <opcode_1>, <rd>, <crn>, <crm>, {<opcode_2>
将 CP15 中的寄存器
中的数据读到 ARM
处理器的寄存器中
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
这句汇编的指令字面意思是
:
将
ARM
寄存器
R0
的数据写到
CP15
中编号为
7
的寄存器中,值由外面传进来。