MCR和MRC指令在存储系统中的使用

本文介绍了在基于ARM的嵌入式应用系统中,如何通过MRC和MCR指令操作协处理器CP15来实现存储系统的管理。主要内容包括禁用/启用MMU、设置页表基地址、存储访问权限控制等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在基于ARM的嵌入式应用系统中,存储系统的操作通常是由协处理器CP15完成的。CP15包含16个32位的寄存器,其编号为0~15。而访问CP15寄存器的指令主要是MCR和MRC这两个指令。本文主要介绍MRC和MCR指令在存储系统中是如何使用的。
1 MRC和MCR指令格式
  1.1 MRC指令格式
  MRC {条件}协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,{协处理器操作码2}
  MRC指令用于将协处理器寄存器中的数据传送到ARM处理器寄存器中,如果协处理器不能成功地执行该操作,将产生未定义的指令异常。
  其中,协处理器操作码1为协处理器将要执行的操作。对于CP15协处理器来说,协处理器操作码1永远为0b000,当协处理器操作码1不为0b000时,该指令操作结果不可预知;
  目的寄存器为ARM处理器的寄存器;源寄存器1和2为协处理器的寄存器;
  协处理器操作码2为协处理器将要执行的操作。通常源寄存器2和协处理器操作码2两者组合决定对协处理器寄存器进行所需要的操作,如果没有指定,则将源寄存器2设置为C0,协处理器操作码2设置为0,否则可能导致不可预知的结果。
  1.2 MCR指令格式
  MCR {条件}协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,{协处理器操作码2}
  MCR指令用于将ARM处理器寄存器中的数据传送到协处理器寄存器中,如果协处理器不能成功地执行该操作,将产生未定义的指令异常。
  其中,源寄存器为ARM处理器的寄存器;目的寄存器1和2均为协处理器的寄存器;协处理器操作码1和2的含义及用法同MRC指令。
   2 MRC和MCR在存储器管理单元(MMU)中的使用
  2.1禁止/使能MMU
  CP15协处理器的寄存器C1的位[0]用于控制禁止/使能MMU。当CP15协处理器的寄存器C1的位[0]设置为0时,禁止MMU;当CP15协处理器的寄存器C1的位[0]设置为1时,使能MMU。
  使能MMU的指令:MRC P15, 0 , R0 ,C1 ,0 , 0
  ORR R0,R0,#1
  MCR P15, 0 ,R0 , C1 ,0 , 0
  禁止MMU的指令:MRC P15, 0 , R0 ,C1 ,0 , 0
  BIC R0,R0,#1
  MCR P15, 0 ,R0 , C1 ,0 , 0
  2.2设置页表的基地址
  页表存放在内存中,通常在ARM中系统协处理器CP15的C2寄存器用来保存页表的基地址。其中位[31:14]为内存页表的基地址,位[13:0]为0。
  加载页表的首地址到CP15协处理器的寄存器C2的指令,例如:
  MOV R3,#0X12340000
  MCR p15, 0, R3, C2, C0, 0
  2.3 MMU中存储访问权限控制
  在MMU中,寄存器C1的R、S控制位和页表中地址转换条目中的访问权限控制位AP联合作用控制存储访问的权限。具体规则如表1所示。[1]
  表1 MMU中存储访问权限控制
  
  C1寄存器的R和S位的设置的指令,例如:
  MRC p15, 0, R0, c1, c0, 0; read control register
  AND R0,R0,#0XFFFFFCFF;set R=0,S=0
  MCR P15, 0 ,R0 , C1 ,0 , 0; write control register
  2.4 MMU中域的控制
  MMU中的域指的是一些段、大页或者小页的集合。ARM支持最多16个域,每个域的访问控制特性由CP15中的寄存器C3中的两位来控制。
  CP15中的寄存器C3的格式如图1所示。
  
  图1 C3寄存器格式
  该寄存器有效位为32,被分成16个区域,每个区域由两个位组成,含义如下:
  00:当前级别下,该内存区域不允许被访问,任何的访问都会引起一个domain fault
  01:当前级别下,该内存区域的访问必须配合该内存区域段描述符中AP位进行权检查
  10:保留状态
  11:当前级别下,对该内存区域的访问都不进行权限检查
  设置域的访问权限可使用以下语句,例如:
  MRC p15, 0, R0, C3, C0, 0; Read domain 15:0 access permissions
  ORR R0,R0,#0X00000030 ; Set D2=0b11
  MCR p15, 0, Rd, C3, C0, 0; Read domain 15:0 access permissions
  2.5快表(TLB)的使用
  2.5.1使快表内容无效的操作
  CP15协处理器的寄存器C8是用来控制清除TLB内容的相关操作。它是一个只写寄存器。使用MRC读取该寄存器,会可能产生不可预知的效果。可使用MCR指令来写该寄存器,具体格式如下:
  MCR {条件} P15,0,源寄存器,C8,目的寄存器2,{协处理器操作码2}
  其中,源寄存器中位将写入C8中的数据;目的寄存器2,协处理器操作码2的不同组合决定指令执行不同的操作,具体含义如表2所示。[2]
  表2使无效快表内容的指令格式
  
  2.5.2锁定快表内容
  MMU可以将某些地址变换条目锁定在TLB中,从而使得进行与该地址变换条目相关的地址变换速度保持很快。在MMU中寄存器C10用于控制TBL内容的锁定。
  TLB锁定指令的具体格式:
  MCR P15 , 0 ,源寄存器, C10 , C0 ,协处理器操作码2。
  MRC P15 , 0 ,目的寄存器,C10 , C0,协处理器操作码2。
  当系统中包含独立的数据TLB和指令TLB时,对应于数据TLB和指令TLB分别有一个独立的TLB内容锁定寄存器。上面指令中的协处理器操作码2用于选择其中的某个寄存器。
  协处理器操作码2=1,选择指令TLB的内容锁定寄存器。
  协处理器操作码2=0,选择数据TLB的内容锁定寄存器。
  当系统中使用统一的数据cache和指令cache时,协处理器操作码2的值应为0。
  例如:MCR p15 , 0 , r0 , c10 , c0 , 0;锁定数据TLB。
  MCR p15 , 0 , r0 , c10 , c0 , 1;锁定指令TLB。
   3 MRC和MCR在高速缓冲存储器(Cache)中的使用
  3.1控制cache和写缓冲区
  CP15中的寄存器C7用于控制cache和写缓冲区。它是一个只写的寄存器,使用MCR指令来写该寄存器,具体格式如下:
  MCR P15, 0,源寄存器, C7,目的寄存器2,操作码2
  其中,源寄存器为将写入C7中的数据;目的寄存器2,操作码2的不同组合决定执行不同的操作,如表3所示。[2]
  表3 MCR指令中目的寄存器2,操作码2的不同组合决定执行不同的操作
  
  例如:MCR p15, 0, r0, c7, c7, 0;disable ICache, DCache
  3.2锁定Cache
  寄存器C9是Cache内容锁定寄存器。Cache内容锁定就是将一些关键代码和数据预取到Cache后,设置一定的属性,使发生Cache块替换时,这些关键代码和数据所在的块不会被替换。[3]
  Cache锁定指令的具体格式:
  MCR P15 , 0 ,源寄存器, C9 , C0 ,协处理器操作码2
  MRC P15 , 0 ,目的寄存器, C9 , C0,协处理器操作码2
  当系统中包含独立的数据Cache和指令Cache时,对应于数据Cache和指令Cache分别有一个独立的Cache内容锁定寄存器。上面指令中的协处理器操作码2用于选择其中的某个寄存器。
  协处理器操作码2=1,选择指令cache的内容锁定寄存器。协处理器操作码2=0,选择数据cache的内容锁定寄存器。
  当系统中使用统一的数据cache和指令cache时,协处理器操作码2的值应为0。
  例如:MCR p15 , 0 , r0 , c9 , c0 , 0;锁数据Cache
  MCR p15 , 0 , r0 , c9 , c0 , 1;锁指令Cache
关于协处理器的更多介绍:http://blog.sina.com.cn/s/blog_6e5aa2a30100ppw3.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值