Caching 缓存-刷新和失效操作

Caching 缓存-刷新和失效操作,caching,hardware,driver,device-driver,dma,Caching,Hardware,Driver,Device Driver,Dma,我对缓存同步操作有一些问题 失效:在cpu尝试读取由设备更新的部分内存之前,需要使相应的内存失效 刷新:在设备读取由CPU更新的部分内存之前,CPU必须将缓存中的内容刷新(写回是否正确?)到内存中,以便设备从内存中读取具有更新内容的内容 如果未执行刷新,它可能会读取内存中存在的垃圾数据,因为内存仍然没有使用写入缓存的内容进行更新 请确认我的上述理解是否正确 何时合并刷新和无效?我听说,在使用设备控制描述符时,我们需要通过结合flush和invalidate进行同步。为什么会这样 我们是否需要遵循

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

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

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

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

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

何时合并刷新和无效?我听说,在使用设备控制描述符时,我们需要通过结合flush和invalidate进行同步。为什么会这样

我们是否需要遵循一个顺序,比如先刷新,然后失效


是否有一种情况下,先失效,然后刷新会很有用?

刷新会将缓存的内容写回主存,而失效会将缓存线标记为无效,以便将来的读取进入主存

我认为,如果设备正在更新内存块,您可以将flush和invalidate结合起来:flush将确保设备具有最新的内容,invalidate将确保设备完成后CPU将从内存读取新内容

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

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


何时合并刷新和无效?我听说了 在使用设备控制描述符时,我们需要同步 通过结合使用flush和invalidate。为什么会这样

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

  • DMA将数据从DDR内存传输到硬件缓冲区
  • DMA将数据从硬件缓冲区传输到DDR(硬件接收数据并希望使其可供CPU使用)
  • DMA从DDR传输到DDR的另一个区域

  • DDR缓冲区应在DMA之前刷新。驱动程序缓冲区不可缓存,因此无需失效
  • DDR缓冲区应在DMA传输之前或之后(详细信息请参见下面的
    注释
    )失效,以防止CPU使用缓存中的“旧”数据。刷新硬件缓冲区是冗余的
  • 应刷新“源”缓冲区,“目标”缓冲区应无效。所以,在传输之前,DMA的内存中存在有效数据,并且在DMA完成其工作后,CPU不会从缓存中取出“污垢”

  • 注意
    :很明显,在数据采集之前,“源”应该刷新。还有一个问题是什么时候使无效。从技术上讲,这是在CPU尝试访问“目标”数据之前,也可能是在DMA之前或之后(我们应该确保DMA已经完成了任务)。在DMAing之后使IRL失效可能会导致问题。提到

    正如您可以看到的那样,对于这个特定的平台,应该在
    数据生成之前执行
    无效。在ARMv7设备的BSP代码中,我发现建议在DMA传输之前使目标缓冲区失效<但这还不是全部。您可能希望在再次进行DMA传输后使目标缓冲区失效(没错,第二次)。若有问题的芯片有预取功能,它可以在DMA工作时将数据取回缓存。所以顺序可能是:在第一次失效预取之后,再次将数据放入缓存->DMA覆盖内存中的数据->缓存中的数据与内存中的数据不同,并且缓存被标记为具有有效数据。第二个invalidate将确保数据再次检索到缓存中,因此缓存和内存完成同步:)


    我们是否需要遵循一个顺序,比如先刷新,然后失效

    假设源缓冲区和目标缓冲区彼此不相交,则不存在依赖关系。您可以
    flush invalidate
    invalidate flush


    是否有一种场景,在这种场景中,先失效,然后刷新会很有用


    不要这样认为。

    为清楚起见,这主要在初始化阶段执行。初始化的描述符在初始化阶段被刷新(在内存中更新)和失效(以便CPU下次读取时包含有用的内容)。感谢您的解释,在internet上找不到比这更好的解释了。。。。