您的位置 首页 电源

ARM920T的MMU与Cache之cache

ARM920T有16K的数据Cache和16K的指令Cache,这两个Cache是基本相同的,数据Cache多了一些写回内存的机制,后面我们以数据Cache为例来介…

ARM920T有16K的数据Cache和16K的指令Cache,这两个Cache是根本相同的,数据Cache多了一些写回内存的机制,后边咱们以数据Cache为例来介绍Cache的根本原理。咱们现已知道,Cache中的存储单位是Cache Line,ARM920T的一个Cache Line是32字节,因而16K的Cache由512条Cache Line组成。要了解Cache的根本原理,咱们从怎样规划Cache这个问题下手。

规划Cache的一种最朴素的主意是,把VA分红以32字节为单位,从任何一个对齐到32字节地址鸿沟的VA开端接连的32个字节(比方0x00-0x1f,0x20-0x3f,0x40-0x5f等等)都能够缓存到512条Cache Line中的任何一条。那么一条Cache Line中的32个字节怎样知道是来自哪个VA的呢?这就需求把VA也保存在Cache中,由于这32字节的开始地址是对齐到32字节地址鸿沟的,末5位全为0,因而只需求保存VA[31:5]即可,这称为VA Tag[4],Tag是VA的一部分,是Cache Line中数据的标识,标明这32字节数据来自哪个VA。这样规划的Cache称为全相联Cache(Fully Associative Cache),图示如下:

图 17. 全相联Cache

给定一个VA,怎样在Cache中查找对应的数据呢?首先到Cache中比较查找哪一行的Tag等于VA[31:5],找到对应的Cache Line后,再依据VA[4:0]决议要拜访的是该Cache Line缓存的32个字节中的哪一个字节。由于有512条Cache Line,假设这个VA没有缓存在Cache中则需求比较512次才知道,这是最坏的状况,也是最常见的状况,下面咱们要改善Cache的规划来处理这个问题。

全相联Cache的特点是任何VA都能够缓存到任何一条Cache Line,给定一个VA做查找时,由于它有或许缓存在512条Cache Line中的任何一条,就只好悉数都找一遍了。假设限制某一个VA只答应缓存在某一条Cache Line中,那么查找的进程就快多了:检查一下应该缓存这个VA的那条Cache Line,看Tag共同不共同,假设共同便是Cache Hit,假设不共同便是Cache Miss,能够直接拜访物理内存而不用再找其它Cache Line了。这种规划称为直接映射Cache(Direct Mapped Cache),如下图所示:

图 18. 直接映射Cache

地址0~31应该缓存在第1条Cache Line中,地址32~63应该缓存在第2条Cache Line中,依此类推,地址16352~16383应该缓存在第512条Cache Line中,下一个地址应该是16384(16K)了,咱们又回到最初,地址16K~16K+31应该缓存在第1条Cache Line中,地址16K+32~16K+63应该缓存在第2条Cache Line中,依此类推,再次回到最初的地址应该是32K,32K~32K+31应该缓存在第1条Cache Line中,32K+32~32K+63应该缓存在第2条Cache Line中,依此类推。读者应该能够总结出规则了:给定一个VA,将它除以16K得的余数决议了它应该缓存在哪一条Cache Line中,那么除以16K的商数部分就应该是VA Tag,用以差异Cache Line中缓存的到底是0仍是16K仍是32K地址上的数据。那么除以16K的商数和余数怎样表明呢?VA[31:14]便是除以16K的商数,VA[13:0]便是余数,所以上图的Tag处标着VA[31:14]。余数VA[13:0]是16K Cache里的一个字节偏移量,而Cache是按32字节一个Cache Line安排的,所以余数中的高位VA[13:5]决议了是第几条Cache Line,余数中的低位VA[4:0]决议了Cache Line内的字节偏移量。验算一下,VA[13:5]一共是9位,作为Cache Line的编号能够表明的Cache Line数目正是512条。

直接映射Cache尽管查找速度很快,但也有缺点。比方,地址0~31、16K~16K+31、32K~32K+31都应该缓存到第1条Cache Line中,假设咱们程序第一次拜访地址30,地址0~31的数据就从内存加载到第1条Cache Line,以便下次拜访能更快一些,可是咱们程序第2次拜访的却是地址32770,地址32K~32K+31的数据就要从内存加载到第1条Cache Line,把Cache Line里本来存的地址0~31的数据替换掉,以便下次拜访能更快一些,可是咱们程序第三次拜访的却是地址16392……这样下去,Cache起不到任何加快效果,形同虚设,这种问题称为Cache颤动(Cache Thrash)。全相联Cache就不会有这种问题,由于任何VA都能够缓存到任何一条Cache Line,能够把先后几回拜访的VA缓存到不同的Cache Line,就不会彼此抵触。

全相联Cache和直接映射Cache各有优缺点,全相联Cache查找很慢,但没有颤动问题,直接映射Cache则正相反。为了得到更好的功能,实践CPU的Cache规划是取两者的折衷,把一切Cache Line分红若干个组,每一组有n条Cache Line,称为n路组相联Cache(n-way Set Associative Cache)。ARM920T选用64路组相联Cache,如下图所示:

图 19. 64路组相联Cache

有了前面两种Cache概念的根底,这种Cache应该很好了解,512条Cache Line分红8组,每组64条,地址0-31、256-587、512-543等等能够缓存到第1组64条Cache Line中的任何一条,地址32-63、288-319、544-575等等能够缓存到第2组64条Cache Line中的任何一条,依此类推。为什么说组相联Cache是全相联和直接映射Cache的一个折衷呢?假设把组分得很大,把悉数Cache Line都分到一个组里边去,就变成了全相联Cache;假设把组分得很小,每组只要一个Cache Line,就变成了直接映射Cache。作为操练,请读者自己核算一下为什么VA Tag是VA[31:8],为什么组的编号用VA[7:5]表明。

那么,为什么组相联Cache的功能比直接映射Cache要好呢?一方面,组相联Cache把一条Cache Line上的抵触涣散到了64条Cache Line上,起到了64倍的积极效果。而另一方面,应该缓存到同一个组的VA更多了:关于直接映射Cache,在同一个组(也便是同一条Cache Line)互相抵触的VA有4G/512个;关于组相联Cache,在同一个组(64条Cache Line)互相抵触的VA有4G/8个。从这个数量联系来看,组相联Cache又起到了64倍的消沉效果。莫非这两种效果不会彻底抵销吗?我不计划从数学上严厉证明,这不是本节的要点,读者能够经过一个日子知识的例子来了解:层数相同多的两栋楼,其间一栋楼是一部电梯,每层三户,而另一栋楼是两部电梯,每层六户,每户的均匀人数相同多,你以为在哪个楼里等电梯的时刻较短呢?

接下来解释一下有关Cache写回内存的问题。Cache写回内存有两种形式:

Write Back:Cache Line中的数据被CPU核修正时并不马上写回内存,Cache Line和内存中的数据会暂时不共同,在Cache Line中有一个Dirty位符号这一状况。当一条Cache Line要被其它VA的数据替换时,假设不是Dirty的就直接替换掉,假设是Dirty的就先写回内存再替换。

Write Through:每逢CPU核修正Cache Line中的数据时就马上写回内存,Cache Line和内存中的数据总是共同的。假设有多个CPU或设备一起拜访内存,例如选用双口RAM,那么Cache中的数据和内存保持共同就非常重要了,这时相关的内存页面一般装备为Write Through形式。

经过读写CP15的相关寄存器,能够对Cache做以下操作:

Clean:将Cache Line中的数据写回内存,铲除Dirty位。在程序中的某些同步点上用于确保Cache Line和内存中的数据共同。

Invalidate:在Cache Line中有一个Invalid位表明无效,将这个方位1,下非必须拜访时即便VA Tag匹配也从头从内存读取数据。例如进程切换时需求声明前一个进程缓存在Cache中的数据无效。

Lock:将某个地址的数据锁定在Cache中,确保不被替换掉。在实时体系中,这样做能够确保某个地址的数据能在一个确认的时刻内拜访到。

从Cache中查找要拜访的数据时用的是VA,可是Cache写回内存要用PA,假设写回内存时还需求查一遍页表就太没有效率了,所以实践上每条Cache Line中还保存了PA[31:5](PA Tag),完好的Cache结构如下图所示:

图 20. PA Tag

最终处理咱们前面留传的一个问题:页描述符中的C、B位详细是什么意思?

表 2. 页描述符中C、B位的意义

C位为1表明答应Cache,这种状况下用B位来表明Write Through仍是Write Back。有些页面不答应Cache,置C位为0,这种状况下能够用B位来挑选是否答应运用Write Buffer。Write Buffer也是一种简略的Cache,CPU核履行写指令时能够把数据交给Write Buffer,然后由Write Buffer担任写回内存,这时CPU能够履行后续指令而不用等候写回内存这个较慢的操作完毕。想一下,已然有Write Buffer,为什么没有Read Buffer?

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/275694.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部