新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > ARM存储器之:高速缓冲存储器Cache

ARM存储器之:高速缓冲存储器Cache

作者:时间:2013-09-30来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257011.htm

程序员通过指令对寄存器中的Cache组内行号进行操作。读取格式A的寄存器c9,将返回最后一次写入寄存器c9的值。将数据index写入寄存器c9,就是对要锁定的Cache行进行设置。当用MCR指令向寄存器写入数据时,执行以下操作。

①当下一次发生Cache未命中时,将预取的存储器行存入Cache中与该行相对应的组中编号为index的Cache行中。

②这时被锁定的Cache块包括序号为0~index-1的锁定块。当发生Cache替换时,从编号为index到A-1的块中选择被替换的块。

格式B的编码如图15.15所示。

程序员通过指令对寄存器中的Cache组内行号进行操作。读取格式B的寄存器c9,将返回最后一次写入寄存器c9的值。将数据index写入寄存器c9,就是对要锁定的Cache行进行设置。当用MCR指令向寄存器写入数据时,执行以下操作。

图15.15格式B编码

①当L=0时,如果方式Cache未命中,将预取的存储行存入Cache中与该行对应的组中序号为index的Cache行中。

②当L=1时,如果本次写操作之前L=0,并且index值小于本次写入的index,本次写操作执行的结果不可预知;否则,这时被锁定的Cache块包括序号为0~index-1的块。当发生Cache替换时,从序号为index~A-1的块中选择被替换的块。

下面以锁定块N来说明要锁定一个Cache块的步骤。

①首先确保在下面的整个Cache锁定过程不会被中断打断。如果程序要求中断不能关闭,那么必须确保被打开的中断相关代码和数据位于非缓存(uncachable)的存储区域。

关中断的典型做法如下所示。

MRSr2,CPSR;读出当前程序状态字CPSR

ORRr2,r2,#0x000000C0;关中断

MSRCPSR_cxsf,r2;设置当前程序状态字

②如果锁定是指令Cache或者统一Cache,必须保证锁定过程所执行的代码位于非缓存的存储域。

③如果锁定的是数据Cache或者统一的Cache,必须保证锁定过程所执行的数据位于非缓存的存储域。

④保证要锁定的代码和数据位于缓存的存储区域中。

⑤如果要锁定的代码和数据不在Cache中,使用Cache清除或清理指令,将其置换到Cache中。

⑥N次循环执行下面的操作。

·index=I写入寄存器c9,当使用B格式的锁定寄存器时,令L=0。

·如果锁定的是数据Cache或数据和指令统一Cache,使用LDR指令将数据从内存读出,这个读操作将使要锁定的内容存在于Cache行中。

·如果锁定的是指令Cache,那么要借助c7寄存器,相关指令详细内容,参见c7寄存器一节。

⑦将index=N写入寄存器c9,当使用B格式的锁定寄存器时,令L=0。

如果要解除对N锁定块的锁定,执行以下操作。

·将index=0写入寄存器c9。

·当使用格式B的锁定寄存器时,令L=0。

15.3.8内存一致性

当一个系统中同时使用了Cache、写缓存时,同一地址的数据可能同时出现在包括系统内存在内的多个不同的物理位置中。如果Cache引入了哈佛架构,使用数据和指令分类的Cache,那情况将更复杂。

由于上述存储系统的多样性特点,当从内存中读取数据时,不能保证读取的是数据的最新值(即有可能出现下述情况:写操作将数据写入到Cache中,但更新数据还没有被回写到内存)。

存储系统中,数据不一致问题一方面可以通过存储系统自动保证解决,另一方面编写程序时要遵循一定的规则,防止数据不一致性发生。

下面就几个常出现数据不一致的地方进行讨论。

·地址映射发生变化时

·指令和数据分离的Cache

·系统执行DMA(DirectMemoryAccess)操作

(1)地址映射发生的变换

当系统中使用MMU时,Cache行对应的地址可能是:

①内存中的实际地址;

②经过地址转换后的虚拟地址。

如果查询Cache时相联地址比较使用的是虚拟地址,则当系统地址到物理地址的映射发生变换时,可能造成Cache中数据与主存中的不一致。

同时,当系统中使用了写缓存,处理器对写缓存中的数据处理也是按虚拟地址进行的,所以同样会发生数据不统一的问题。比如,当前处理器使用虚拟地址向某个内存单元写数据,该写操作已经将虚拟地址和数据写入到写缓存区中,此时,虚拟地址到物理地址的映射关系发生变换,使先前要写入数据的虚拟地址发生了变化,当写缓存将上面被延时的写操作写到主存时,使用的是变换后的地址,从而写操作执行失败。

为了避免发生这种数据不统一的情况,在系统虚拟地址到物理地址的映射关系发生变换前,根据系统的具体情况,执行下面的操作序列中的一种或几种。

·如果数据Cache为写回型Cache,清空该数据Cache。

·使数据Cache中相应的行无效。

·使指令Cache中相应的行无效。

·将写缓存区中被延时的操作全部执行。

·有些情况可能还要求相关的存储区域被置换成非缓存的。

存储器相关文章:存储器原理




评论


相关推荐

技术专区

关闭