1.allocate

先确定一下allocate的概念,就是在cache miss的时候,去内存中读写数据过程中给这个数据分配cacheLine并存储到cache。

其中write-allocate可以分为两种情况:

先读要改写数据对应的cacheLine大小的数据回来,存储到新分配的cacheLine上,然后将要修改的写数据更新到cacheLine中直接分配cacheLine,将数据存储到该cacheLine

以上两种fill cacheline的过程适用于不同的情况,第一种适用于写数据不是整个cacheLine大小,由于和内存交互的最小单元是cacheLine,所以只能先读整个cacheLine,这个过程称为读改写。

显然第二种就属于完全替换整个cacheLine的情况,当然完全替换整个cacheLine也可以采用第一种方式。

必须要分清的是read trans miss对应的是read allocate;而write trans miss对应的是write allocate,即使write miss后allocate的cacheLine的fill可能需要从内存中读数据。

2.cache的读策略与read allocate

上表是ArmV8架构手册给出的memType及mem属性,在cacheability中cacheable为何只有write-Through Cacheable和Write-Back Cacheable而没有提到read的属性呢?

我们在说write-Through和write-back cache的时候,并不是说该cache不能支持读trans,而是因为默认情况下write-through和write-back的cache的读策略都是一样的。

对于cacheable的trans,读首先要在cache中查找,

如果hit,那么就得到所需的数据如果miss就去内存中读取

在miss后读取内存的过程中,对读回的数据处理又分了两类

read allocate :就是将读回的数据分配一个cacheLine存储在cache中read non-allocate:读回的数据直接给master使用,而不在cache中缓存

而默认情况下都是使用read allocate的cache【无论是write-back还是write-through】

3.cache的写策略与write allocate

常用的cache写策略是write-back和write-through,Arm目前也支持这两种回写策略,还有其他的策略不在这里体现。

既然是cacheable的写trans,首先到cache中查找,若:

Hit时:

write-through:将写数据更新到cacheLine,同时将该Dirty的cacheLine写到内存中

write-back:直接将数据更新到cacheLine,并不立即写到内存中去,在该cacheLine被逐出cache时,写到内存中。

miss时,按照allocate分为两种情况:

write allocate :此时在cache中分配一个cacheLine(fill cacheLine过程见本文第一章),然后按照hit的情况,分write-back和write-through回写数据

write non-allocate:此时无论write-back还是write-through都是直接将数据写往内存中。

ARM的cache和mem零散记录(属性)-CSDN博客这边博客中提到的write stream mode就是典型的使用write non-allocate的场景。

相关链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。