如何从 ARM v7 上的 Linux 内核 space 刷新 L1 和 L2 缓存中的地址范围?

How to flush an address range in L1 and L2 Cache from Linux kernel space on ARM v7?

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

目前我正在使用

dmac_flush_range()
outer_flush_range()

API。它们适合用例吗?

谢谢!

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

就是说,直接从驱动程序中使用那些体系结构私有缓存 API 这些天内核维护者会大声疾呼 - 驱动程序通常只需要关心缓存当涉及 DMA 时根本不需要维护,但是正确使用 DMA mapping API 已经解决了这方面的所有问题。

* 他们不一定要 PIPT,例如 Cortex-A8 的 L1 which is actually non-aliasing VIPT 在引擎盖下。