S3C2440 Cache相关知识总结
Cache的作用
通过上一篇文章我们可知,当我们读写某个内存中的数据时,我们需要访问2次或者3次内存才可以真正的完成读写数据的任务。为了提高效率,我们通过使用TLB,减少掉了前面的1次或2次访存操作。但对于最后1次访存操作,也就是使用物理地址访问内存对数据进行读写操作,效率依然不高。
现在我们就来解决这最后一次访存的低效率问题。同样基于程序访存的时空局部性原理,我们在主存和CPU寄存器之间引入一个高速、容量相对较小的存储器,把正在执行的指令或待读取的数据附近的一整块数据都缓存进这个高速的存储器中,供CPU在近段时间内使用,从而极大地提高了程序的运行速度。对于这个高速缓存,我们称之为Cache。
通常情况下,一级Cache分为指令Cache和数据Cache。二级Cache往往不区分数据和指令。指令Cache我们常常简写为I-Cache,对于数据Cache,我们常常简写为D-Cache。
对于Cache的写入方式,根据是否直接写入内存分为两种:
- 写通式(Write Through)
- 写回式(Write Back)
所谓写通式,也就是CPU在写Cache的同时也要写入内存。显然这样做就会导致写操作效率很低,但好处是可以保证Cache和主存中的数据实时同步。
所谓写回式,就是CPU只写Cache,不管内存。显然写Cache之后,Cache和内存中的数据就会产生不一致。不一致就不一致,我们不管内存,只在Cache中设置一个脏位标志,只有当Cache中的数据被交换出去或者Cache被清空时,才将更新后的是数据写入内存。这样最终保证了Cache和主存数据的一致性。
虚拟Cache和物理Cache
根据cache所处的位置,我们可以把Cache分为虚拟的和物理的。Cache既可以放在CPU与MMU之间,也可以放在MMU与物理存储器之间。
- 虚拟Cache
虚拟Cache又称为逻辑Cache。在CPU和MMU之间的Cache称为虚拟Cache,虚拟Cache使用虚拟地址空间存储数据,处理器可以直接使用虚拟地址通过Cache访问数据。 - 物理Cache
在MMU与物理存储器之间的Cache称为物理Cache,当CPU访问存储器时,MMU必须先把虚拟地址转换成物理地址,之后Cache才可以向CPU提供数据。
写缓冲器(Write Buffer)的作用
如上图所示,写缓冲器作为一个非常小的高速存储缓冲器,用来临时存放处理器将要写入到主存中的数据,从而避免了CPU直接访存写数据。Cache先将数据写入写缓冲器中,之后Cache就认为它已经将数据写入内存了,然后返回继续做其他工作。而写缓冲器再以低速写入主存中,这就将高速的CPU和Cache从对主存的低速读写中解放了出来。
写缓冲器同时还改善了Cache的性能,体现在当要替换出一个脏的Cache行时,只需将该Cache行中的数据放入写缓冲器中,而不去直接写主存。这样就可以快速填充新的Cache行数据。
显然,写缓冲器中的数据在没有被写入主存之前,是不能被读取的。同样,被替换的Cache行在写缓冲器中时也不能被读取的。这也是为什么写缓冲器的深度通常比较小,通常只有几个cache行的深度。
总的来说,写缓冲器是用来应对内存的写操作的,将原本要写向内存的数据暂写到写缓冲器中。
S3C2440中实现了I-Cache、D-Cache和Write Buffer。我们在介绍一级页表和二级页表的时候,就看到了C位和B位。只不过当时并没有详细讲解这两位。
我们参照ARM Technical Reference Manual,把描述符中的C位称为Ctt,B位称为Btt。Ctt用来控制该段/页是否允许被Cache,Btt表示写该内存是是否允许使用Wirte Buffer。
指令Cache
I-Cache的使用比较简单,当系统上电或者复位时,I-Cache中的内容是无效的,并且I-Cache中的功能是被禁掉的。将CP15协处理器中的C1寄存器的Icr位(第12位)置1,即可使能I-Cache功能,清零则禁止I-Cache功能。
可以在没有使能MMU时开启I-Cache,此时CPU读取指令时所涉及到的内存都被认为是允许Cache的。
当启用MMU之后,此时描述符中的Ctt用来表示一段内存是否可以被Cache。若Ctt等于1,则允许Cache,否则不允许被Cache。即当Ctt为0时,CPU直接从内存中读取指令。使能I-Cache可以极大的提高程序的执行效率。
数据Cache
同样,系统刚复位时D-Cache和Write Buffer都不能使用。需要令CP15协处理器的C1寄存器的Ccr位置1,才可以启动D-Cache。而Write Buffer和D-Cache是配合使用的,没有专门的控股位来开启和停止它。
需要注意的一点是,D-Cache必须在MMU开始之后才可以使能。因为D-Cache需要使用页表中的Ctt和Btt。
下表是Ccr、Ctt和Btt在不同取值下D-Cache和Write Buffer的工作方式: