我有一些关于缓存同步操作的问题。
使失效:在cpu试图读取设备更新的部分内存之前,需要使相应的内存失效。
刷新:在设备读取由CPU更新的部分内存之前,CPU必须刷新(写回也是对的?)从缓存到内存的内容,以便设备用更新的内容从内存读取内容。
如果不进行刷新,则可以读取存在于存储器中的垃圾数据,因为存储器仍未使用写入缓存的内容进行更新。
请确认我的上述理解是否正确?
何时要将刷新和无效结合起来?我听说,在使用设备控制描述符时,我们需要通过合并刷新和失效来同步。为什么会这样呢?
我们是否需要遵循这样的序列,比如同花顺,然后是无效?
是否有一种情况,在这种情况下,失效后的刷新将是有用的?
发布于 2010-02-27 11:43:55
刷新确实会将缓存的内容写回主内存,而失效则会将缓存行标记为无效,这样以后的读取就会转到主内存中。
我认为,如果设备正在更新内存块,那么将合并刷新和失效:刷新将确保设备具有最新的内容,而无效将确保在设备完成后CPU将从内存中读取新内容。
发布于 2017-02-20 01:45:12
请确认我的上述理解是否正确?
一般来说,你是完全正确的,但有一些石头,可能导致绊倒。您没有指定HW平台。如果我们不是在谈论打包w/ SRAM的小型嵌入式控制器,请考虑以下几点。包含MMU的处理器支持不同的内存属性,用于正常的DDR内存和驱动程序(HW相关的)内存。最后一个是不可缓存的,所以不用担心刷新/无效。
什么时候要将刷新和无效结合起来?我听说,在使用设备控制描述符时,我们需要通过合并刷新和失效来同步。为什么会这样呢?
由于DMA是在标记中提到的,所以有几种方案(假设HW缓冲区是不可缓存的设备内存):
的另一个区域。
NOTE ) DMA传输,以防止CPU使用缓存中的“旧”数据。HW缓冲器的冲洗是redundant.NOTE:很明显,“源代码”应该是在DMAing之前刷新。然而,当使失效时,仍然存在一个问题。从技术上讲,这是在CPU尝试访问“目标”数据之前,或者在DMA之前或之后(我们应该确保DMA已经完成了工作)。IRL使在 DMAing之后失效可能会导致问题。请参阅Flush/Invalidate range by virtual address; ARMv8; Cache;
正如您可以看到的,使这个特定平台的无效应该在 DMAing之前执行。另外,在ARMv7设备的BSP代码中,我发现建议在传输之前使目标缓冲区失效。
但这还不是全部。您可能想要在再次传输之后使目标缓冲区失效(没错,第二次)。如果有问题的芯片已经预取,它可以在DMA工作时将数据取回高速缓存。因此,顺序可能是:在第一次使预取放到缓存中的数据失效后,->重放内存中的数据,->缓存中的数据不同于内存,并且缓存被标记为具有有效数据。第二个使失效将确保数据再次被检索到缓存中,因此缓存和内存完成同步:)
,我们是否需要遵循一个序列,比如刷新,然后是无效?
假设源缓冲区和目标缓冲区不相交,则不存在依赖关系。你可以是flush-invalidate或invalidate-flush。
是否有一种情况,在这种情况下,失效和刷新将是有用的?
别这么想。
https://stackoverflow.com/questions/2310520
复制相似问题