缓存 - 刷新和无效操作

时间:2010-02-22 11:25:46

标签: caching hardware driver device-driver dma

我对缓存同步操作有一些疑问。

无效:在cpu尝试读取设备更新的部分内存之前,需要使相应的内存无效。

刷新:在设备读取CPU更新的部分内存之前,CPU必须刷新(写回也是正确的?)从缓存到内存的内容,以便设备从内存中读取内容更新内容。

如果没有执行flush,它可能会读取内存中存在的垃圾数据,因为内存仍未使用写入缓存的内容进行更新。

请确认我的上述理解是否正确?

您想何时将flush和invalid结合起来?我听说在使用设备控制描述符时,我们需要通过组合flush和invalidate进行同步。为什么这样?

我们是否需要遵循像flush这样的序列然后使用invalidate?

是否有一个场景,其中flushs后面的invalidate将有用?

2 个答案:

答案 0 :(得分:26)

Flush会将缓存的内容写回主内存,而invalidate会将缓存行标记为无效,以便将来的读取转到主内存。

我认为如果设备正在更新内存块,您将组合flush和invalidate:flush将确保设备具有最新内容,并且invalidate将确保当设备完成时CPU将读取记忆中的新内容。

答案 1 :(得分:3)

  

请确认我的上述理解是否正确?

一般来说,你是完全正确的,但有一些石头可能导致绊倒。您没有指定HW平台。如果我们不是在讨论用SRAM封装的小型嵌入式控制器,请考虑以下内容。 封装有MMU的处理器支持普通DDR内存和驱动程序(硬件相关)内存的不同内存属性。最后一个是不可缓存的,所以不用担心刷新/无效。


  

您想何时将flush和invalid结合起来?我听说   在使用设备控制描述符时,我们需要进行同步   通过组合flush和invalidate。为什么这样?

由于标签中提到了DMA,因此有几种情况(假设硬件缓冲区是不可缓存的设备内存):

  1. DMA将数据从DDR内存传输到HW缓冲区。
  2. DMA将数据从HW缓冲区传输到DDR(HW接收数据并希望使其可用于CPU)
  3. 从DDR转移到另一个DDR区域。

    1. 在DMA之前,DDR缓冲区应该刷新。驱动程序缓冲区不可缓存,因此无需失效。
    2. DDR缓冲区应该无效之前或之后(详见下面的NOTE)详细信息)DMA传输以防止CPU使用缓存中的“旧”数据。刷新HW缓冲区是多余的。
    3. 应该刷新
    4. 'Source'缓冲区,'Destination'缓冲区应该无效。因此,在传输之前,有效数据存储在DMA的内存中,并且在DMA完成工作后,CPU不会从缓存中获取“污垢”。

    5. NOTE:在DMA化之前,'source'显然应该刷新。仍然存在何时无效的问题。从技术上讲,它是在CPU尝试访问“目标”数据之前,可以在DMA之前或之后(我们应该确保DMA已完成工作)。 IRL在 DMA后失效可能会导致问题。参考 Flush/Invalidate range by virtual address; ARMv8; Cache;

      正如您所见,无效应该在之前完成。同样漫无目的地使用ARMv7设备的BSP代码,我建议 DMA传输之前使目标缓冲区无效。


        

      我们是否需要遵循像flush这样的序列然后使用invalidate?

      假设源缓冲区和目标缓冲区不相互交叉,则不存在依赖关系。您可以flush-invalidateinvalidate-flush


        

      是否有一个场景,其中flushs后面的invalidate将有用?

      不要这么认为。