【问题标题】:How to flush an address range in L1 and L2 Cache from Linux kernel space on ARM v7?如何从 ARM v7 上的 Linux 内核空间刷新 L1 和 L2 缓存中的地址范围?
【发布时间】:2016-09-30 20:26:51
【问题描述】:

我正在编写一个虚拟驱动程序来共享内核缓冲区到 ARM v7 上的用户空间。 我想为此缓冲区实现 fsync() 操作。我应该使用哪些 API 来刷新 fsync 中给定用户地址范围的 L1 和 L2 缓存? asm/cacheflush.h 中有许多可用的 API,但我不确定它们是否会同时刷新 L1 和 L2 或仅刷新 L1?

目前我正在使用

dmac_flush_range()
outer_flush_range()

API。它们适合用例吗?

谢谢!

【问题讨论】:

    标签: linux-kernel arm embedded linux-device-driver embedded-linux


    【解决方案1】:

    ARMv7 要求数据缓存的行为类似于physically-indexed and physically-tagged*,这意味着映射到同一物理地址的多个虚拟地址自然相互一致,无需任何缓存维护或障碍。因此,您的缓冲区的内核映射和用户映射已经在任何时候都完全同步,您实际上不需要做任何事情。您当然没有任何旧 CPU 的 VIVT 缓存问题。

    也就是说,直接从驱动程序中使用那些架构私有的缓存 API 会让你受到内核维护者的强烈谴责 - 驱动程序通常只需要在 DMA 时关心缓存维护涉及到,但正确使用 DMA mapping API 已经处理了这方面的一切。

    * 它们并不一定是 PIPT,例如 Cortex-A8 的 L1 which is actually non-aliasing VIPT

    【讨论】:

      猜你喜欢
      • 2016-03-12
      • 2015-08-17
      • 1970-01-01
      • 2014-07-04
      • 2020-08-04
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多