原创 cache 学习

2008-6-29 00:20 2516 11 11 分类: MCU/ 嵌入式

           最近工作不是很忙了,跑的TC都需要时间比较长了,所以终于有时间可以学习一下自己的感兴趣的东西,自己想想,整天自己算作SOC组的,那soc主要的是什么啊,说白了还是在玩IP,呵呵,那最关键的是什么呢,不用说当然是arm,大家当然得听脑袋发话干事了,但是发现自己一直用的就是一个arm的模型而已,自己对它的了解还真是少的可怜,得,慢慢学吧,先学习最近用得比较多的cache吧。


ARM920T的MMU与Cache



Cache是高性能CPU解决总线访问速度瓶颈的方法,然而它的使用却是需要权衡的,因为缓存本身的动作,如块拷贝和替换等,也是很消耗CPU时间的。MMU的重要性勿庸置疑,ARM920T(和ARM720T)集成了MMU是其最大的卖点;有了MMU,高级的操作系统(虚拟地址空间,平面地址,进程保护等)才得以实现。二者都挺复杂,并且在920T中又高度耦合,相互配合操作,所以需要结合起来研究。同时,二者的操作对象都是内存,内存的使用是使用MMU/Cache的关键。另外,MMU和Cache的控制寄存器不占用地址空间,CP15是操纵MMU/Cache的唯一途径。             Cache/Write Buffer的功能


Cache通过预测CPU即将要访问的内存地址(一般都是顺序的),预先读取大块内存供CPU访问,来减少后续的内存总线上的读写操作,以提高速度。然而,如果程序中长跳转的次数很多,Cache的命中率就会显著降低,随之而来,大量的替换操作发生,于是,过多的内存操作反而降低了程序的性能。


ARM920T内部采用哈佛结构,将内部指令总线和数据总线分开,分别连接到ICache和DCache,再通过AMBA总线接口连接到ASB总线上去访问内存。Cache由Line组成,Line是Cache进行块读取和替换的单位。


Writer Buffer是和DCache相逆过程的一块硬件,目的也是通过减少memory bus的访问来提高性能。


MMU的功能


在内存中维护一张或几张表,就看你怎么给内存划分page和section了。通过CP15指定好转换表的位置,920T的硬件会自动将转换表的一部分读到TLB中。CPU每次进行内存读写时,发出虚拟地址,参照TLB中的转换表转换到物理地址,并读取相应entry中的信息,以决定是否可以有权限读写和缓存。


mmugen这个工具就是帮你构造这个表的,省的自己写程序了。


操作MMU,实际上就是如何分配和使用你的内存,并记录在translationtable里。


ARM920T中,MMU的每条entry包括Cachable和Buffable位来指定相应的内存是否可以用Cache缓存。此处就是MMU与Cache的交互作用处。


实际上,MMU和Cache的使用是操作系统设计者根据系统软硬件配置而考虑的事情。操作系统针对分配给应用程序的地址空间作内存保护和缓存优化。在没有操作系统的情况下,就需要我们自己来掌控它们了。其中,主要是合理分配内存。


我认为,以下几点需要着重考虑:


1) 安全第一! -- 避免MMU和Cache的副作用。


当你在无OS的裸机上开发程序时,初始化运行环境的代码很重要,比如:各种模式堆栈指针的初始化;将代码和RW data从ROM拷贝到RAM;初始化.bss段(zero initialized)空间等。此时会有大量的内存操作,如果你enable了Cache,那么在拷贝完代码之后,一定要invalidate ICache和flush DCache。否则将会出现缓存中的代码或数据与内存中的不一致,程序跑飞。


另外,有时候我们需要自己作loader来直接运行ELF文件,情况也是一样,拷贝完代码后一定要刷新Cache,以免不测。


还有,对硬件的操作要小心。很多寄存器值都是被硬件改变的,读写时,要保证确实访问到它的地址。首先,在C语言代码中声明为volatile变量,以防止内存读写被编译器优化掉;另外,设置好TLB,使得寄存器映射的地址空间不被缓存。


总之,缓存和内存中代码的不一致,是一定要避免的。


2) 弄巧成拙! -- 只对频繁访问的地址空间进行Cache优化。


我们很清楚自己的程序中,那里有大量的运算,哪里有无数的循环或递归,而这正是Cache的用武之地,我们将这些空间进行缓存将大大提高运行速度。但是,很多函数或子程序往往仅仅运行很少几次,若是对它们也缓存,只会捡了芝麻丢了西瓜,造成不必要的缓存和替换操作,反而增加了系统负担,降低了整体性能。


3) 断点哪儿去了? -- 如何调试“加速”了的代码?


据我所知,一般,debugger都是通过扫描地址总线,在断点处暂停CPU。ARM9TDMI中集成的JTAG调试口,也是这样。


当我们调试使用Cache的代码时,将会出现问题。比如:CPU访问某断点所在地址之前的地址时,发生缓存操作,断点处代码被提前读入Cache,此时地址总线上出现了断点地址,CPU被debugger暂停,并且断点之后的指令也被Cache缓存。于是,当你从断点处step时,程序却停不了了,因为地址总线上不再出现断点之后的下一个地址了。


   再举个例子:


       int i,a;


       for (i=0; i<100; i++) {


    ->     a++;    /* set breakpoints */


       }


 


当地址总线上第一次出现断点地址时,CPU暂停;之后,就再也不会停了。因为,之后CPU会从cache中直接去代码了。(当然,后来,Cache的代码有可能会被替换掉,断点又可到达。)  所幸的是,我用的debugger提供JTAG Monitor,允许断点跟踪使用cache的程序。




Cache的工作原理
    1.Cache的引入
    请注意下面两种情况:
    ①大容量主存一般采用DRAM,相对SRAM速度慢,而SRAM速度快,但价格高。
    ②程序和数据具有局限性,即在一个较短的时间内,程序或数据往往集中在很小的存储器地址范围内。    
    因此,在主存和CPU之间可设置一个速度很快而容量相对较小的存储器,如图3.35所示。在其中存放CPU当前正在使用以及一个较短的时间内将要使用的程序和数据,这样,可大大加快CPU访问存储器的速度,提高机器的运行效率。


 
    通过上面的例子,可以这样来描述(2ache最基本的工作原理:在存储系统中设置了Cache的情况下,CPU进行存储器访问时,首先访问Cache标记,判是否命中,如果命中,就访问Cache(数据部分),否则访问主存。
    将访问的数据在Cache中的次数(即命中的次数)与总的访问次数之比称为命中率。影响命中率的因素主要有三个:Cache的容量、Cache块的划分以及Cache块与主存块之间的映像关系。一般来说,Cache的容量大一些,会提高命中率,但达到一定程度时,命中率的提高并不明显。目前,一般为256 KB或512 KB,命中率可达98%左右。
    下面还是通过例子来说明引入Cache块的好处。已知Cache的存取周期为50 ns,主存的存取周期为250 ns。设命中率为98%,即100次访问存储器的操作有98次在Cache中,只有2次需要访问主存,则这100次访问存储器操作的平均存取周期为(50 ns×98+250 ns×2)÷100=54 ns。由此可见,由于引入了Cache,使得CPU访问存储器的平均存取周期由不采用Cache时的250 ns降到了54 ns。也就是说,以较小的硬件代价使Cache/主存储器系统的平均访问时间大大缩短,从而大大提高了整个微机系统的性能。   
需要指出,Cache的功能全部由硬件实现,涉及Cache的所有操作对程序员都是透明的。
3.Cache的读/写操作
    CPU进行存储器读操作时,根据主存地址可分成命中和未命中两种情况。对于前者,从Cache中可直接读到所需的数据;对于后者,需访问主存,并将访问单元所在的整个块从内存中全部调入Cache,接着要修改Cache标记。若Cache已满,需按一定的替换算法,替换掉一个旧块。   
  CPU进行存储器写操作时,也可分成两种情况。一是所要写入的存储单元根本不在Cache中,这时写操作直接对主存进行操作(与Cache无关);二是所要写入的存储单元在Cache中。对于第二种情况需做一些讨论。Cache中的块是主存相应块的副本,程序执行过程中如果遇到对某块的单元进行写操作时,显然应保证相应的Cache块与主存块的一致。
这里有两种处理方式。一是暂时只向Cache写入,并用标志注明,直到这个块被从Cache,中替换出来时,才一次写入主存,称之为回写式;二是每次写入Cache的同时也写入主存,称之为通写式。两种方式各有优缺点。回写式占用总线时间少,写速度快,但不能随时保证Cache与主存保持一致,如果此期间发生DMA操作,则可能出错(DMA操作将在第四章介绍,暂时可将其理解为在输入/输出设备与存储器之间直接进行数据传送,这种操作不需要CPU参与。所以,可能出现CPU和DMA控制器同时访问同一主存块的情况);通写式可使Cache块和主存块始终保持一致,但占用总线时间长,总线冲突较多。


转自: http://www.shufacn.com/supe/html/02/n-1402.html


Cache的原理、设计及实现





Cache的原理、设计及实现 cM{`04#z  
b/0\DD0<  
)%I ;7=<  
前言 RG +0pqB*  
EHQ_Xq  
  虽然CPU主频的提升会带动系统性能的改善,但系统性能的提高不仅仅取决于CPU,还与系统架构、指令结构、信息在各个部件之间的传送速度及存储部件的存取速度等因素有关,特别是与CPU/内存之间的存取速度有关。 1C-J  
,C.daL8  
  若CPU工作速度较高,但内存存取速度相对较低,则造成CPU等待,降低处理速度,浪费CPU的能力。 ,0"3G^;nv{  
@rG!@s;  
  如500MHz的PⅢ,一次指令执行时间为2ns,与其相配的内存(SDRAM)存取时间为10ns,比前者慢5倍,CPU和PC的性能怎么发挥出来? 2>/.qopY  
}, vCDW,@  
  如何减少CPU与内存之间的速度差异?有4种办法: ?aHk>a]}!  
qz`B^3[8}  
  一种是在基本总线周期中插入等待,但这样会浪费CPU的能力。 |GxlE}IF  
_>#-NI_  
  另一种方法是采用存取时间较快的SRAM作存储器,这样虽然解决了CPU与存储器间速度不匹配的问题,但却大幅提升了系统成本。 oeuw,}S  
\|=&@$A!x\  
  第3种方法是在慢速的DRAM和快速CPU之间插入一速度较快、容量较小的SRAM,起到缓冲作用;使CPU既可以以较快速度存取SRAM中的数据,又不使系统成本上升过高,这就是Cache法。 rc*L~?  
)cQX  
  还有一种方法,采用新型存储器。 z9q0DdR7  
`%5s%]-  
  目前,一般采用第3种方法。它是PC系统在不大增加成本的前提下,使性能提升的一个非常有效的技术。 ]f3Yd@j  
E*tj^ h  
  本文简介了Cache的概念、原理、结构设计以及在PC及CPU中的实现。 JNN!d  
h L!?27pH  
v<3i*5"  
  Cache的工作原理 qV zb  
{>R#=t  
  Cache的工作原理是基于程序访问的局部性。 )xvyf8tU  
hnBY) x  
  对大量典型程序运行情况的分析结果表明,在一个较短的时间间隔内,由程序产生的地址往往集中在存储器逻辑地址空间的很小范围内。指令地址的分布本来就是连续的,再加上循环程序段和子程序段要重复执行多次。因此,对这些地址的访问就自然地具有时间上集中分布的倾向。 qu+1)/p7X  
H\i>H9`O  
  数据分布的这种集中倾向不如指令明显,但对数组的存储和访问以及工作单元的选择都可以使存储器地址相对集中。这种对局部范围的存储器地址频繁访问,而对此范围以外的地址则访问甚少的现象,就称为程序访问的局部性。 JEx)ivHO,  
Zeu=.1*,  
  根据程序的局部性原理,可以在主存和CPU通用寄存器之间设置一个高速的容量相对较小的存储器,把正在执行的指令地址附近的一部分指令或数据从主存调入这个存储器,供CPU在一段时间内使用。这对提高程序的运行速度有很大的作用。这个介于主存和CPU之间的高速小容量存储器称作高速缓冲存储器(Cache)。 ]{ T N 3W  
ye{~}+  
  系统正是依据此原理,不断地将与当前指令集相关联的一个不太大的后继指令集从内存读到Cache,然后再与CPU高速传送,从而达到速度匹配。 '/5n2v6$T  
6D2 80E[  
  CPU对存储器进行数据请求时,通常先访问Cache。由于局部性原理不能保证所请求的数据百分之百地在Cache中,这里便存在一个命中率。即CPU在任一时刻从Cache中可靠获取数据的几率。 ](8]$S`MR  
3%"?\I0  
  命中率越高,正确获取数据的可靠性就越大。一般来说,Cache的存储容量比主存的容量小得多,但不能太小,太小会使命中率太低;也没有必要过大,过大不仅会增加成本,而且当容量超过一定值后,命中率随容量的增加将不会有明显地增长。 &U5SW6eZ  
%*\Opi,B$  
  只要Cache的空间与主存空间在一定范围内保持适当比例的映射关系,Cache的命中率还是相当高的。 0y@>aD_3  
3O=2J:WGI  
  一般规定Cache与内存的空间比为4:1000,即128kB Cache可映射32MB内存;256kB Cache可映射64MB内存。在这种情况下,命中率都在90%以上。至于没有命中的数据,CPU只好直接从内存获取。获取的同时,也把它拷进Cache,以备下次访问。 _Q,Wo,ISp  
0'T=qsEmcX  
.[33Hc+  
mM2mX5P  
Cache的基本结构 O="/"ix:zl`  
Iy9Y3sYhC  
  Cache通常由相联存储器实现。相联存储器的每一个存储块都具有额外的存储信息,称为标签(Tag)。当访问相联存储器时,将地址和每一个标签同时进行比较,从而对标签相同的存储块进行访问。Cache的3种基本结构如下: |Q_UGK  
WOiEcZg2!  
全相联Cache LDm /K[  
,k[iB,q`  
  在全相联Cache中,存储的块与块之间,以及存储顺序或保存的存储器地址之间没有直接的关系。程序可以访问很多的子程序、堆栈和段,而它们是位于主存储器的不同部位上。 NHt_mlN"  
Bum.s !em  
  因此,Cache保存着很多互不相关的数据块,Cache必须对每个块和块自身的地址加以存储。当请求数据时,Cache控制器要把请求地址同所有地址加以比较,进行确认。 C!tq'(R5N=  
o|ETp2"  
  这种Cache结构的主要优点是,它能够在给定的时间内去存储主存器中的不同的块,命中率高;缺点是每一次请求数据同Cache中的地址进行比较需要相当的时间,速度较慢。 9]?Wx>(c(  
pdGX%1  
Xk]n$iz'  
直接映像Cache #19&Um:  
3 ]HKK"T  
  直接映像Cache不同于全相联Cache,地址仅需比较一次。 jFguyi?F5  
uVSl 
  在直接映像Cache中,由于每个主存储器的块在Cache中仅存在一个位置,因而把地址的比较次数减少为一次。其做法是,为Cache中的每个块位置分配一个索引字段,用Tag字段区分存放在Cache位置上的不同的块。 J6HfT()  
rbIx2]<  
  单路直接映像把主存储器分成若干页,主存储器的每一页与Cache存储器的大小相同,匹配的主存储器的偏移量可以直接映像为Cache偏移量。Cache的Tag存储器(偏移量)保存着主存储器的页地址(页号)。 O|~Oj*U`  
mJbQr<^"U  
  以上可以看出,直接映像Cache优于全相联Cache,能进行快速查找,其缺点是当主存储器的组之间做频繁调用时,Cache控制器必须做多次转换。 V[F<]+-.  
{C$L\{OB4  
组相联Cache |WGK\  
6\,WC<:  
  组相联Cache是介于全相联Cache和直接映像Cache之间的一种结构。这种类型的Cache使用了几组直接映像的块,对于某一个给定的索引号,可以允许有几个块位置,因而可以增加命中率和系统效率。 4.vK]:p  
sXpl{>  
/ -lqO  
9XbaFe:9  
Cache与DRAM存取的一致性 x@z@_$%  
@J <4<,c  
  在CPU与主存之间增加了Cache之后,便存在数据在CPU和Cache及主存之间如何存取的问题。读写各有2种方式。 #[H2v86WQ5  
\=Ve4f7  
贯穿读出式(Look Through) Y;`._I  
v)z 1ly)  
  该方式将Cache隔在CPU与主存之间,CPU对主存的所有数据请求都首先送到Cache,由Cache自行在自身查找。如果命中,则切断CPU对主存的请求,并将数据送出;不命中,则将数据请求传给主存。 '=R:n=4  
oSv}~TV8:  
  该方法的优点是降低了CPU对主存的请求次数,缺点是延迟了CPU对主存的访问时间。 xprIb*L  
d%/. xZb  
旁路读出式(Look Aside) B{B.:fWF  
'NE@r6  
  在这种方式中,CPU发出数据请求时,并不是单通道地穿过Cache,而是向Cache和主存同时发出请求。由于Cache速度更快,如果命中,则Cache在将数据回送给CPU的同时,还来得及中断CPU对主存的请求;不命中,则Cache不做任何动作,由CPU直接访问主存。 a9Y[NxT*K  
u-$ForrQ  
  它的优点是没有时间延迟,缺点是每次CPU对主存的访问都存在,这样,就占用了一部分总线时间。 Zr1 lr}  
A01W"-< ]V  
写穿式(Write Through) >$ (=jcPC  
l}>J[eX  
  任一从CPU发出的写信号送到Cache的同时,也写入主存,以保证主存的数据能同步地更新。 1XW['x'>>  
c e~P][  
  它的优点是操作简单,但由于主存的慢速,降低了系统的写速度并占用了总线的时间。 f)3~|\}  
{q8_5k.R  
回写式(Copy Back) LX+HT{F#D  
?Krtvup  
  为了克服贯穿式中每次数据写入时都要访问主存,从而导致系统写速度降低并占用总线时间的弊病,尽量减少对主存的访问次数,又有了回写式。 {&\t@iaH3Q  
.B?}x8Dt"  
  它是这样工作的:数据一般只写到Cache,这样有可能出现Cache中的数据得到更新而主存中的数据不变(数据陈旧)的情况。但此时可在Cache 中设一标志地址及数据陈旧的信息,只有当Cache中的数据被再次更改时,才将原更新的数据写入主存相应的单元中,然后再接受再次更新的数据。这样保证了Cache和主存中的数据不致产生冲突。 N^I >GW>gh  
;GdZ`!"e  
2dP5Ak_  
er4>$~  
Cache的分级体系设计 &^ C$*=l!  
! W!?t1<  
  微处理器性能由如下几种因素估算: .N]s]lc&  
a4(  
  性能=k(f??1/CPI-(1-H)??N) n20M#nQ8  
>r?Ws P  
  式中:k为比例常数,f为工作频率,CPI为执行每条指令需要的周期数,H为Cache的命中率,N为存储周期数。 )lN&FwD  
/H'MgpP[  
  虽然,为了提高处理器的性能,应提高工作频率,减少执行每条指令需要的周期数,提高Cache的命中率。同时分发多条指令和采用乱序控制,可以减少CPI值;采用转移预测和增加Cache容量,可以提高H值。为了减少存储周期数N,可采用高速的总线接口和不分块的Cache方案。 nTB7gqa  
3 &^Vyr  
  以前提高处理器的性能,主要靠提高工作频率和提高指令级的并行度,今后则主要靠提高Cache的命中率。设计出无阻塞Cache分级结构。 :,{O^yt  
r=hL  
  Cache分级结构的主要优势在于,对于一个典型的一级缓存系统的80%的内存申请都发生在CPU内部,只有20%的内存申请是与外部内存打交道。而这20%的外部内存申请中的80%又与二级缓存打交道。因此,只有4%的内存申请定向到DRAM中。 .8DX-i'  
|NL5fq 6]  
  Cache分级结构的不足在于高速缓存组数目受限,需要占用线路板空间和一些支持逻辑电路,会使成本增加。综合比较结果还是采用分级Cache。 e~ P{/K.  
VTr 
  L1 Cache的设计有在片一级分离和统一设计两种方案。 U [dTp$  
"yn]i*hT  
  Intel、AMD、原DEC等公司将L1 Cache设计成指令Cache与数据Cache分离型。因为这种双路高速缓存结构减少了争用高速缓存所造成的冲突,改进了处理器效能,以便数据访问和指令调用在同一时钟周期内进行。 U"huUD[g  
`"HL0]>  
  但是,仅依靠增加在片一级Cache的容量,并不能使微处理器性能随之成正比例地提高,还需设置二级Cache。 fqZ%  
`- $=j+  
  在L1 Cache结构方面,一般采用回写式静态随机存储器(SRAM)。目前,L1 Cache容量有加大的趋势。 ;~U{i&E'L"  
.*r eYa]  
  L2 Cache的设计分芯片内置和外置两种设计。 O ?  
IRg*;r  
  如AMD K6-3内置的256kB L2 Cache与CPU同步工作。外置L2 Cache,一般都要使二级Cache与CPU实现紧密耦合,并且与在片一级Cache形成无阻塞阶层结构。同时还要采用分离的前台总线(外部I/O总线)和后台总线(二级Cache总线)模式。 vH,3GXd)S`  
u}cd+v }  
  显然,将来随着半导体集成工艺的提高,如果CPU与二级Cache集成在单芯片上,则CPU与二级Cache的耦合效果可能更佳。 cCD&2\*`A  
Ee\{N  
  由于L2 Cache内置,因此,还可以在原主板上再外置大容量缓存1MB~2MB,它被称为L3 Cache。 ?Rv/CIT2  
0x)DFrrB8  
7$vM{(%Y2_  
!s$x'^!i  
PC中的Cache技术的实现 hGqn%'~x1  
@9C83j1  
  PC中Cache的发展是以80386为界的。 qQ"|;  
M5/%ynO  
结语 &2QAeI  
MH9]/9  
  目前,PC系统的发展趋势之一是CPU主频越做越高,系统架构越做越先进,而主存DRAM的结构和存取时间改进较慢。因此,Cache技术愈显重要,在PC系统中Cache越做越大。广大用户已把Cache做为评价和选购PC系统的一个重要指标。本文小结了Cache的源脉。希望可以给广大用户一个较系统的参考。 yjmsv8  

文章评论0条评论)

登录后参与讨论
我要评论
0
11
关闭 站长推荐上一条 /2 下一条