基于程序访问的局部性,在
主存(内存)和
CPU通用寄存器之间设置一个
高速的、容量相对较小的存储器,把
正在执行的指令地址附近的一部分指令或数据从
主存调入
这个存储器,供CPU在一段时间内使用,对提高程序的运行速度有很大作用。这个
cache一般称为高速缓存。
Cache两种写方式:
①写穿式(Write Through)也叫直写式
任一CPU发出写信号送到Cache的同时,也写入主存,保证主存的数据同步更新。优点是操作简单,但由于主存速度慢,降低了系统的写速度并占用了总线的时间。
②回写式(Write Back)
数据一般只写到Cache,这样可能出现Cache中的数据得到更新而主存中的数据不变(数据陈旧)的情况。此时可在Cache中设一个标志地址及数据陈旧的信息,只有当Cache中的数据被换出或强制进行”清空“操作时,才将原更新的数据写入主存响应的单元中,保证了Cache和主存中数据一致。
Cache两个操作:
①”清空“(clean):把Cache或Write buffer中已经脏的(修改过,但未写入主存)数据写入主存
②”使无效“(Invalidate):使之不能再使用,并不将脏的数据写入主存。
S2C2440内置了指令Cache(ICaches)、数据Cache(DCaches)、写缓存(Write buffer),需要用到描述符中的C位(Ctt)和B位(Btt)
1)指令Cache(ICaches)
系统刚上电或复位时,ICaches中的内容是无效的,并且ICaches功能关闭。往Icr位(CP15协处理器中寄存器1的第12位)写1可以启动ICaches,写0停止ICaches.
ICaches一般在MMU开启后使用,此时描述符的C位用来表示一段内存是否可以被Cache。若Ctt=1,允许Cache,否则不允许。如果MMU没有开启,ICaches也可以被使用,此时CPU读取指令时所涉及的内存都被当做允许Cache.
ICaches关闭时,CPU每次取指都要读取主存,性能低,所以通常尽早启动ICaches
ICaches开启后,CPU每次取指时都会先在ICaches中查看是否能找到所用指令,而不管Ctt是0还是1。如果找到成为Cache命中,找不到称为Cache丢失,ICaches被开启后,CPU的取指有如下三种情况:
①Cache命中且Ctt为1时,从ICaches中取指,返回CPU
②Cache丢失且Ctt为1时,CPU从主存中取指,并且把指令缓存到Cache中
③Ctt为0时,CPU从主存中取指
2)数据Cache(DCaches)
与ICaches相似,系统刚上电或复位时,DCaches中的内容无效,并且DCaches功能关闭,Write buffer中的内容也是被废弃不用的。往Ccr位(CP15协处理器 中寄存器1的第二位)写1启动DCaches,写0停止DCaches。Write buffer和DCaches紧密结合,额米有专门的控制来开启和停止它.
与ICaches不同,DCaches功能必须在MMU开启之后才能被使用。
DCaches被关闭时,CPU每次都去内存取数据。
DCaches被开启后,CPU每次读写数据时都会先在DCaches中查看是否能找到所要的数据,不管Ctt是0还是1,找到了成为Cache命中,找不到成为Cache丢失。
通过下表可知DCaches和Write buffer在Ccr,Ctt,Btt各种取值下,如何工作,Ctt and Ccr 意为 Ctt与Ccr进行逻辑与后的值.
使用Cache时需要保证Cache、Write buffer的内容和主存内容一致,保证下面两个原则:
①清空DCaches,使主存数据得到更新
②使无效ICaches,使CPU取指时重新读取主存
在实际编写程序时,要注意如下几点:
①开启MMU前,使无效ICaches,DCaches和Write buffer
②关闭MMU前,清空ICaches、DCaches,即将”脏“数据写到主存上
③如果代码有变,使无效ICaches,这样CPU取指时会从新读取主存
④使用DMA操作可以被Cache的内存时,将内存的数据发送出去时,要清空Cache;将内存的数据读入时,要使无效Cache
⑤改变页表中地址映射关系时也要慎重考虑
⑥开启ICaches或DCaches时,要考虑ICaches或DCaches中的内容是否与主存保持一致
⑦对于I/O地址空间,不使用Cache和Write buffer
阅读(2628) | 评论(0) | 转发(1) |