ARM-I/Dcache, MMU关系

三者的配置关系:

ICache | DCache | MMU | Allowed?
================================
Off         | Off           | Off     | Yes
On         | Off           | Off     | Yes
Off         | On           | Off     | No
Off         | Off           | On     | Yes
On         | On           | Off     | No
Off         | On           | On     | Yes
On         | Off           | On     | Yes
On         | On           | On     | Yes

非法的配置只有DCache打开,但是MMU关闭。在这种情况下,M位的配置会覆盖C的配置,ARM认为C没有打开。

 

I cache打开,MMU未打开。

在这种情况下,所以的取指都会被认为是可cache的。

 

ICACHE

引用:http://blog.csdn.net/bournechen/article/details/4925537

当系统上电或重起(Reset)的时候,ICaches功能是被关闭的,我们必须往lcr bit置1去开启它,lcr bit在CP15协处理器中控制寄存器1的第12位(关闭ICaches功能则是往该位置0)。ICaches功能一般是在MMU开启之后被使用的(为了降低MMU查表带来的开销),但有一点需要注意,并不是说MMU被开启了ICaches才会被开启,正如本段刚开始讲的,ICaches的开启与关闭是由lcr bit所决定的,无论MMU是否被开启,只要lcr bit被置1了,ICaches就会发挥它的作用。
    大家是否还记得discriptor(描述符)中有一个C bit我们称之为Ctt,它是指明该描述符描述的内存区域内的内容(可以是指令也可以是数据)是否可以被Cache,若Ctt=1,则允许Cache,否则不允许被Cache。于是CPU读取指令出现了下面这些情况:

如果CPU从Caches中读取到所要的一条指令(cache hit)且这条指令所在的内存区域是Cacheble的(该区域所属描述符中Ctt=1),则CPU执行这条指令并从Caches中返回(不需要从内存中读取)。
若CPU从Caches中读取不到所要的指令(cache miss)而这条指令所在的内存区域是Cacheble的(同第1点),则CPU将从内存中读取这条指令,同时,一个称为“8-word linefill”的动作将发生,这个动作是把该指令所处区域的8个word写进ICaches的某个entry中,这个entry必须是没有被锁定的(对锁定这个操作感兴趣的朋友可以找相关的资料进行了解)
若CPU从Caches中读取不到所要的指令(cache miss)而这条指令所在的内存区域是UnCacheble的(该区域所属描述符中Ctt=0),则CPU将从内存读取这条指令并执行后返回(不发生linefill)
    通过以上的说明,我们可以了解到CPU是怎么通过ICaches执行指令的。你可能会有这个疑问,ICaches总共只有512个条目(entry),当 512个条目都被填充完之后,CPU要把新读取近来的指令放到哪个条目上呢?答案是CPU会把新读取近来的8个word从512个条目中选择一个对其进行写入,那CPU是怎么选出一个条目来的呢?这就关系到ICaches的替换法则(replacemnet algorithm)了。 ICaches的replacemnet algorithm有两种,一种是Random模式另一种Round-Robin模式,我们可以通过CP15协处理器中寄存器1的RR bit对其进行指定(0 = Random replacement 1 = Round robin replacement),如果有需要你还可以进行指令锁定(INSTRUCTION CACHE LOCKDOWN)。

 

DCACHE

ARM cache架构由cache存储器和写缓冲器(write-buffer)组成,其中写缓冲器是CACHE按照FIFO原则向主存写的缓冲处理器。

一般来说CACHEABILITY和BUFFERABILITY都是可以配置的,所以,一块存储区域可以配置成下面4种方式:NCNB CNB NCB CB。 在实际应用当中,可以根据需要对主存进行配置。对I/O MAP来说,一般都需要采用NCNB方式,以保证对I/O的正确操作。而其他的存储区域一般都可以配置成CB方式,以获取最好的性能。 


引入CACHE和WRITE BUFFER是为了提高存储访问的速度,提供系统性能。

如果CACHE打开的话,CPU读写主存的时候,都是通过CACHE进行的。

进行读操作的时候,如果在CACHE里面找到了所需的内容 (CACHE HIT),直接从CACHE里读取;

如果要读的内容不在CACHE上的时候 (CACHE MISS),先把所需的内容装载到CACHE里,在从CACHE上读取。

进行写操作的时候,数据先写到CACHE上。具体又可以分为WRITE THROUGH和 WRITE BACK两种方式。

如果是WRITE THROUGH方式的话,每次写操作都通过CACHE+WRITE BUFFER把数据直接写到主存当中去;

如果是WRITE BACK 方式的话,数据最初只是写到CACHE上,必要的时候(CACHE REPLACEMENT) 再将CACHE上的数据通过WRITE BUFFER实际回写到主存当中去。

 
DCaches使用的是虚拟地址,它的大小是16KB,它被分成512行(entry),每行8个字(8 words,32Bits)。

每行有两个修改标志位(dirty bits),第一个标志位标识前4个字,第二个标志位标识后4个字,同时每行中还有一个TAG 地址(标签地址)和一个valid bit。


与ICaches一样,系统上电或重起(Reset)的时候,DCaches功能是被关闭的,我们必须往Ccr bit置1去开启它,Ccr bit在CP15协处理器中控制寄存器1的第2位(关闭DCaches功能则是往该位置0)。与ICaches不同,DCaches功能是必须在MMU开启之后才能被使用的。


在这里我要对Ctt and Ccr=0进行说明,能够使Ctt and Ccr=0的共有三种情况,分别是
Ctt =0, Ccr=0
Ctt =1, Ccr=0
Ctt =0, Ccr=1
我们分别对其进行说明。

情况1(Ctt =0, Ccr=0):这种情况下CPU的DCaches功能是关闭的(Ccr=0),所以CPU存取数据的时候不会从DCaches里进行数据地查询,CPU直接去内存存取数据。
情况2(Ctt =1, Ccr=0):与情况1相同。
情况3(Ctt =0, Ccr=1):这种情况下DCaches功能是开启的,CPU读取数据的时候会先从DCaches里进行数据地查询,若DCaches中没有合适的数据,则CPU会去内存进行读取,但此时由于Ctt =0(Ctt 是descriptor中的C bit,该bit决定该descriptor所描述的内存区域是否可以被Cache),所以CPU不会把读取到的数据Cache到DCaches(不发生 linefill).
    到此为止我们用两句话总结一下DCaches与Write Buffer的开启和使用:
1.DCaches与Write Buffer的开启由Ccr决定。
2.DCaches与Write Buffer的使用规则由Ctt和Btt决定。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值