在上一篇文档中我向咱们介绍MMU的作业原理和对s3c2410 MMU部分操作进行了解说。咱们知道MMU存在的原因是为了支撑虚拟存储技能,但不知道你发现了没有,虚拟存储技能的运用会下降整个体系的功率,咱们与传统的存储技能比较,虚拟存储技能对内存的拜访操作多了一步,便是对地址进行查表(查找映射联络),有必要先从虚拟地址平分解出页号和页内偏移,依据页号对描绘符进行索引(这便是一个查表进程)得到物理空间的首地址,这样做的价值是巨大的(其实这也正是时刻功率与空间功率之间对立的一个表现),对某些嵌入式体系来说这简直便是恶梦。那么在引入了虚拟存储技能之后有没有办法在时刻功率与空间功率这个对立之间获得一个平衡点呢?答案是有,咱们能够经过一种技能从最大限度上下降这两者的对立,这种技能是Caches(缓存)。也是咱们本文要介绍的。
以下内容转载自上钩报
Cache的作业原理
Cache的作业原理是依据程序拜访的部分性。
对许多典型程序运转状况的剖析结果表明,在一个较短的时刻距离内,由程序产生的地址往往拘押在存储器逻辑地址空间的很小规模内。指令地址的散布原本便是接连的,再加上循环程序段和子程序段要重复碑文屡次。因此,对这些地址的拜访就自然地具有时刻上集平散布的倾向。
数据散布的这种拘押倾向不如指令显着,但对数组的存储和拜访以及作业单元的挑选都能够使存储器地址相对拘押。这种对部分规模的存储器地址频频拜访,而对此规模以外的地址则拜访甚少的现象,就称为程序拜访的部分性。
依据程序的部分性原理,能够在主存和CPU通用寄存器之间设置一个高速的容量相对较小的存储器,把正在碑文的指令地址邻近的一部分指令或数据从主存调入这个存储器,供CPU在一段时刻内运用。这对进步程序的运转速度有很大的效果。这个介于主存和CPU之间的高速小容量存储器称作高速缓冲存储器(Cache)。
体系正是依据此原理,不断地将与当时指令集相关联的一个不太大的后继指令集从内存读到Cache,然后再与CPU高速传送,然后到达速度匹配。
CPU对存储器进行数据恳求时,一般先拜访Cache。咱们部分性原理不能确保所恳求的数据百分之百地在Cache中,这儿便存在一个射中率。即CPU在任一时刻从Cache中牢靠获取数据的几率。
射中率越高,正确获取数据的牢靠性就越大。一般来说,Cache的存储容量比主存的容量小得多,但不能太小,太小会使射中率太低;也没有必要过大,过大不只会添加本钱,并且当容量超越必定值后,射中率随容量的添加将不会有显着地添加。
只需Cache的空间与主存空间在必定规模内坚持恰当份额的映射联络,Cache的射中率仍是适当高的。
一般规则Cache与内存的空间比为4:1000,即128kB Cache可映射32MB内存;256kB Cache可映射64MB内存。在这种状况下,射中率都在90%以上。至于没有射中的数据,CPU只好直接从内存获取。获取的一起,也把它拷进Cache,以备下次拜访。
Cache的根本结构
Cache一般由相联存储器完成。相联存储器的每一个存储块都具有额定的存储信息,称为标签(Tag)。当拜访相联存储器时,将地址和每一个标签一起进行比较,然后对标签相同的存储块进行拜访。Cache的3种根本结构如下:
全相联Cache
在全相联Cache中,存储的块与块之间,以及存储次序或保存的存储器地址之间没有直接的联络。程序能够拜访许多的子程序、仓库和段,而它们是坐落主存储器的不同部位上。
因此,Cache保存着许多互不相关的数据块,Cache有必要对每个块和块本身的地址加以存储。当恳求数据时,Cache操控器要把恳求地址同一切地址加以比较,进行结语。
这种Cache结构的首要长处是,它能够在给定的时刻内去存储主存器中的不同的块,射中率高;缺陷是每一次恳求数据同Cache中的地址进行比较需求适当的时刻,速度较慢。
直接映像Cache
直接映像Cache不同于全相联Cache,地址仅需比较一次。
在直接映像Cache中,咱们每个主存储器的块在Cache中仅存在一个方位,因此把地址的比较次数削减为一次。其做法是,为Cache中的每个块方位分配一个索引字段,用Tag字段委任寄存在Cache方位上的不同的块。
单路直接映像把主存储器分红若干页,主存储器的每一页与Cache存储器的巨细相同,匹配的主存储器的偏移量能够直接映像为Cache偏移量。Cache的Tag存储器(偏移量)保存着主存储器的页地址(页号)。
以上能够看出,直接映像Cache优于全相联Cache,能进行快速查找,其缺陷是当主存储器的组之间做频频调用时,Cache操控器有必要做屡次转化。
组相联Cache
组相联Cache是介于全相联Cache和直接映像Cache之间的一种结构。这种类型的Cache运用了几组直接映像的块,关于某一个给定的索引号,能够答应有几个块方位,因此能够添加射中率和体系功率。
Cache与DRAM存取的一致性
在CPU与主存之间添加了Cache之后,便存在数据在CPU和Cache及主存之间怎样存取的问题。读写各有2种办法。
贯穿读出式(Look Through)
该办法将Cache隔在CPU与主存之间,CPU对主存的一切数据恳求都首要送到Cache,由Cache自行在本身查找。假如射中,则堵截CPU对主存的恳求,并将数据送出;不射中,则将数据恳求传给主存。
该办法的长处是下降了CPU对主存的恳求次数,缺陷是延迟了CPU对主存的拜访时刻。
旁路读出式(Look Aside)
在这种办法中,CPU宣布数据恳求时,并不是单通道地穿过Cache,而是向Cache和主存一起宣布恳求。咱们Cache速度更快,假如射中,则Cache在将数据回送给CPU的一起,还来得及中止CPU对主存的恳求;不射中,则Cache不做任何动作,由CPU直接拜访主存。
它的长处是没有时刻延迟,缺陷是每次CPU对主存的拜访都存在,这样,就占用了一部分总线时刻。
写穿式(Write Through)
任一从CPU宣布的写信号送到Cache的一起,也写入主存,以确保主存的数据能同步地更新。
它的长处是操作简略,但咱们主存的慢速,下降了体系的写速度并占用了总线的时刻。
回写式(Copy Back)
为了战胜贯穿式中每次数据写入时都要拜访主存,然后导致体系写速度下降并占用总线时刻的弊端,尽量削减对主存的拜访次数,又有了回写式。
它是这样作业的:数据一般只写到Cache,这样有或许呈现Cache中的数据得到更新而主存中的数据不变(数据陈腐)的状况。但此刻可在Cache 中设一标志地址及数据陈腐的信息,只要当Cache中的数据被再次更改时,才将原更新的数据写入主存相应的单元中,然后再承受再次更新的数据。这样确保了Cache和主存中的数据不致产生抵触。
…
…..
你能够经过http://www.chinaunix.net/jh/45/180390.html阅览完全文
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中数据有必要被及时的更新到内存(这也是为什么%&&&&&%aches没有写回操作而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的操作手册:]