Board logo

标题: ARM Cache研究(2) [打印本页]

作者: look_w    时间: 2017-9-24 19:02     标题: ARM Cache研究(2)

ICACHE
    当系统上电或重起(Reset)的时候,ICaches功能是被关闭的,我们必须往lcr bit置1去开启它,lcr bit在CP15协处理器中控制寄存器1的第12位(关闭ICaches功能则是往该位置0)。ICaches功能一般是在MMU开启之后被使用的(为了降低MMU查表带来的开销),但有一点需要注意,并不是说MMU被开启了ICaches才会被开启,正如本段刚开始讲的,ICaches的开启与关闭是由lcr bit所决定的,无论MMU是否被开启,只要lcr bit被置1了,ICaches就会发挥它的作用。
    大家是否还记得discriptor(描述符)中有一个C bit我们称之为Ctt,它是指明该描述符描述的内存区域内的内容(可以是指令也可以是数据)是否可以被Cache,若Ctt=1,则允许Cache,否则不允许被Cache。于是CPU读取指令出现了下面这些情况:

    通过以上的说明,我们可以了解到CPU是怎么通过ICaches执行指令的。你可能会有这个疑问,ICaches总共只有512个条目(entry),当 512个条目都被填充完之后,CPU要把新读取近来的指令放到哪个条目上呢?答案是CPU会把新读取近来的8个word从512个条目中选择一个对其进行写入,那CPU是怎么选出一个条目来的呢?这就关系到ICaches的替换法则(replacemnet algorithm)了。 ICaches的replacemnet algorithm有两种,一种是Random模式另一种Round-Robin模式,我们可以通过CP15协处理器中寄存器1的RR bit对其进行指定(0 = Random replacement 1 = Round robin replacement),如果有需要你还可以进行指令锁定(INSTRUCTION CACHE LOCKDOWN)。
虚拟cache


Cache 位于MMU前面靠近CPU称为逻辑CACHE又叫虚拟Cache。CPU可以直接访问CACHE的数据,而ARM 11(ARMV6)的结构是CACHE   在MMU后面CPU访问CACHE要通过MMU地址转换


在DM6446的core用的是哈佛结构,即把CACHE分为8K的D-CACHE(数据CACHE)和16K的I-cache(指令CACHE)
一个完整的CACHE分为CACHE控制器和CACHE存储器


例子


Davinci DM6446 D-cache行应为512行 ,cache存储器主要分为三个部分:目录存储段(driectory-story),状态信息段(status information)和数据项段(data section)每一行cache都包括这三部分。Cache用目录存储段来存储主存的地址,数据项段存放的是主存的数据,在cache中用状态信息段来记录状态信息,其中v表示有效位,d表示脏位,有效位记录当前cache行是活动的,cache行的数据和主存中的数据是一致的,处理器可以读取。脏位则表示cache行的数据和主存中的数据不一致。
在读写请求到达存储器前会被CACHE捕获,cache存储器将该请求分成三部分标签,组索引和数据索引域,cache通过组索引域确定可能包含地址和数据cache的行,cache存储器检查匹配的CACHE       行的状态标签,如果是V表示(cache hit)命中,否则cache失效(cache miss)在cache失效时从主存吧cache行考到CACHE存储器
主存中的部分内容存放在cache中的最简单方式是直接映射,在一个直接映射中,主存的地址唯一对应cache行,因为主存容量很大所以主存的很多地址映射到同一个cache行
见下图:


在DM6446 中内存为128M (bootargs 设为128M)8K的D-CACHE则128×1024/8 = 16384映射一个cache行。由于cache的速度大大大于低速的主存速度,因此需要写缓冲器。


Cache与DRAM存取的一致性
    在CPU与主存之间增加了Cache之后,便存在数据在CPU和Cache及主存之间如何存取的问题。读写各有2种方式。

ARM cache 策略
       Cache的写策略分为直写策略和回写策略。同时向cache行和相应的主存位置写数据,同时更新这两个地方的数据的方法称为直写策略(writethrough),把数据写入cache行,不写入主存的或者只有当cache被替换时或清理cache行时才写入主存的策略称为回写策略(writeback)。采用回写策略时,当处理器cache命中,只向cache存储器写数据,不写入主存,主存里的数据就和cache里不一致,cache里的数据是最新的,主存里的数据是早前的。这就用cache存储器信息状态标志位了,当向cache存储器里某行写数据时,置相应行的信息标志脏位为1,那么主控制器下次访问cache存储器就知道cache里有主存没有的数据了,把数据写回到主存中去。
       当一个cache访问失效时,cache控制器必须从当前有效行中取出一个cache行存储从主存中取到的信息,被选中替换的cache行称为丢弃者,如果这个cache行中脏位为1则应把该cache行中的数据回写到主存中,而替换策略决定了那个cache行会被替换,在arm926ejs中ARM支持两种策略:轮转策略和伪随机策略。轮转策略就是取当前cache行的下一行,伪随机策略是控制器随机产生一个值。
       当cache失效时,ARM采取两种方式分配cache行,一种是读操作(read-allocate)还有一种是读-写分配策略(read-write-allocate),当cache未命中时对于读操作策略,在对cache存储器读操作时才会分配cache行





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0