关于ICache和DCache
转载 真诚的刘同学 最后发布于2018-10-18 15:53:43 阅读数 1508 收藏
展开
从不同地方总结摘录而来,附上原文链接原文:https://blog.csdn.net/qq_34888036/article/details/80872186
ICache和DCache是一种内存,虽然目前接触了好几种内存,寄存器,DDR等,它们在物理上的工作原理虽然不同,但是访问属性却很像。
在速度上
CPU > 寄存器 > Cache > DDR
在容量上
CPU < 寄存器 < Cache < DDR
整个系统中,CPU的供应链由:寄存器+cache+DDR+硬盘/flash 四阶组成
icache用来缓存指令,
dcache用来缓存数据,dcache用的前提是mmu要启动。目前裸机部分用不到,操作系统MMU才用得到。
在这里,目前icache的一切都是自动的,不需要我们去做什么。
我们只需要打开或者关闭icache。
我们的程序在SDRAM中,如果不用cache的话,cpu每执行一条指令,都要去访问SDRAM。速度很慢。加上icache的话,当cpu去访问SDRAM时,会把附近一小块指令放到icache中去,下次执行时它会先看看icache中有没有那些指令,如果有直接从icache中取出来执行,如果没有就去SDRAM中取。
在ZYNQ中的ICache和DCache
zynq中有CORE0 和CORE1两个核心,两个核心各自拥有独立的L1 DCache,并且共享同一个L2 DCache,在ZYNQ 中存在一个Snoop Control Unit (SCU)用于维护CORE0 和CORE1 的L1 DCache 与L2 DCache之间的一致性,无需用户干预。因此,虽然CORE0 和CORE1 的共享内存区域位于DDR中,两者之间的数据传递并不需要考虑DCache 一致性的维护。但是,为了更好阐明多级存储器结构的特性以及DCache 一致性维护的问题,本例程在两核间通过DDR3 共享内存进行数据交互时加入了DCache 一致性操作,最终达到的效果与不使用DCache 一致性操作时相同。
DCache 一致性维护的原理为:在多级存储器结构中,CPU 通过1 级或多级Cache与DDR 产生连接,CPU 本身不直接访问DDR,而是通过Cache 访问DDR。Cache 中始终会暂存一小部分(通常是KB~几MB 量级)CPU 最近访问的DDR 某些地址区域中的数据。因此,在应用程序中对DDR 进行读或写操作,实际上都是CPU 对Cache 进行读或写操作。当DDR 中某个地址范围内的数据突然被除CPU 以外的Master(如DMA)改变时,若此时Cache 中保存了这些区域的数据,且这些数据在Cache 中状态为有效时,当CPU 需要再次读取DDR 这片区域的数据时,就不会让Cache 去读取DDR 中此区域内最新的数据来更新Cache,再从Cache 里读取最新的数据,而是直接从Cache 中读取原来的旧数据,显然这不是我们所期望的结果。这时,便引入了所谓的Cache 一致性问题。
ZYNQ 中存在ICache 和DCache,ICache 用于缓存可执行程序,DCache 用于缓存数据。一般情况下,用于保存可执行程序的DDR 地址范围不会被除CPU 以外的对象访问。因此,一般不存在ICache 的一致性问题。而DCache 在很多应用中却经常会被除
CPU 以外的对象访问,所以存在一致性问题。
ZYNQ 中维护DCache 一致性的方法为:写入方将数据写入DDR 对应地址区域后,需将残留在DCache 中相应地址范围内的数据全部刷入DDR3 中。读取方在从DDR 相应地址读取数据之前,需将DCache 中DDR 相应地址范围内的数据全部设置为invalid,
然后CPU 会再次通过DCache 从DDR3 中读取该地址范围内最新的数据。