全部博文(30)
分类: LINUX
2012-01-02 00:04:02
作者:蔡于清
文章来源——
—————————————————————————————————————————
接上一篇——
在上一篇文档中我向大家介绍MMU的工作原理和对s3c2410 MMU部分操作进行了讲解。我们知道MMU存在的原因是为了支持虚拟存储技术,但不知道你发现了没有,虚拟存储技术的使用会降低整个系统的效率,因为与传 统的存储技术相比,虚拟存储技术对内存的访问操作多了一步,就是对地址进行查表(查找映射关系),必须先从虚拟地址中分解出页号和页内偏移,根据页号对描 述符进行索引(这就是一个查表过程)得到物理空间的首地址,这样做的代价是巨大的(其实这也正是时间效率与空间效率之间矛盾的一个体现),对某些嵌入式系 统来说这简直就是恶梦。那么在引入了虚拟存储技术之后有没有方法在时间效率与空间效率这个矛盾之间取得一个平衡点呢?答案是有,我们可以通过一种技术从最 大限度上降低这两者的矛盾,这种技术是Caches(缓存)。也是我们本文要介绍的。
s3c2410 内置了指令缓存(ICaches),数据缓存(DCaches),写缓存(write buffer) , 物理地址标志读写区 (Physical Address TAG RAM),CPU将通过它们来提高内存访问效率。
我们先讨论指令缓存(ICaches)。
ICaches使用的是虚拟地址,它的大小是16KB,它被分成512行(entry),每行8个字(8 words,32Bits)。
当系统上电或重起(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读取指令出现了下面这些情况:
1.如果CPU从Caches中读取到所要的一条指令(cache hit)且这条指令所在的内存区域是Cacheble的(该区域
所属描述符中Ctt=1),则CPU执行这条指令并从Caches中返回(不需要从内存中读取)。
2.若CPU从Caches中读取不到所要的指令(cache miss)而这条指令所在的内存区域是Cacheble的(同第1点),则CPU将从内存中
读取这条指令,同时,一个称为“8-word linefill”的动作将发生,这个动作是把该指令所处区域的8个word写进
ICaches的某个entry中,这个entry必须是没有被锁定的(对锁定这个操作感兴趣的朋友可以找相关的资料进行了解)
3.若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)。
关于替换法则和指令锁定我就不做详细的讲解,感兴趣的朋友可以找相关的资料进行了解。
接下来我们谈数据缓存(DCaches)和 写缓存(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开启之后才能被使用的。
我们现在讨论的都是DCaches,你可能会问那Write Buffer呢?他和DCaches区别是什么呢? 其实DCaches和Write Buffer两
者间的操作有着非常紧密的联系,很抱歉,到目前为止我无法说出他们之间有什么根本上的区别(-_-!!!),但我能告诉你什么时候使用的是
DCaches,什么时候使用的是Write Buffer.系统可以通过Ccr
bit对Dcaches的功能进行开启与关闭的设定,但是在s3c2410中却没有确定的某个bit可以来开启或关闭Write Buffer…你可能有点懵…我们还是来看一张表吧,这张表说明了DCaches,Write Buffer和CCr,Ctt (descriptor中的C bit),Btt(descriptor中的B bit)之间的关系,其中“Ctt and Ccr”一项里面的值是 Ctt与Ccr进行逻辑与之后的值(Ctt&&Ccr).
从上面的表格中我们可以清楚的知道系统什么时候使用的是DCaches,什么时候使用的是Write Buffer,我们也可以看到DCaches的写回方式是怎么决定的(write-back or write-througth)。
在这里我要对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决定。
DCaches与ICaches有一个最大的不同,ICaches存放的是指令,DCaches存放的是数据。程序在运行期间指令的内容是不会改变的,所以ICaches中指令所对应的内存空间中的内容不需要更新。但是数据是随着程序的运行而改变的,所以DCaches中数据必须被及时的更新到内存(这也是为什么ICaches没有写回操作而DCaches提供了写回操作的原因)。提到写回操作,就不得不提到PA TAG 地址(物理标签地址)这个固件,它也是整个Caches模块的重要组成部分。
简单说PA TAG 地址(物理标签地址)的功能是指明了写回操作必须把DCaches中待写回内容写到物理内存的哪个位置。不知道你还记不记得,DCaches中每个entry中都有一个PA TAG 地址(物理标签地址),当一个linefill发生时,被Cache的内容被写进了DCaches,同时被Cache的物理地址则被写入了PA TAG 地址(物理标签地址)。除了TAG 地址(标签地址),还有两个称为dirty bit(修改标志位)的
位出现在DCaches的每一个entry中,它们指明了当前entry中的数据是否已经发生了改变(发生改变简称为变“脏”,所以叫dirty
bit,老外取名称可真有意思 -_-!!!)。如果某个entry中的dirty
bit置位了,说明该entry已经变脏,于是一个写回操作将被执行,写回操作的目的地址则是由PA TAG 地址(物理标签地址)索引到的物理地址。
关于Caches,Write Buffer更详细的内容请大家阅读s3c2410的操作手册:]