如何从ARM v7上的Linux内核空间刷新L1和L2 Cache中的地址范围?

时间:2016-06-01 12:50:07

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

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

目前我正在使用

dmac_flush_range()
outer_flush_range()

的API。它们对于用例是否合适?

谢谢!

1 个答案:

答案 0 :(得分:2)

ARMv7要求数据缓存的行为就像physically-indexed and physically-tagged * ,这意味着映射到同一物理地址的多个虚拟地址自然相互连贯,无需任何缓存维护或障碍。因此,缓冲区的内核映射和用户映射始终完全同步,并且您根本不需要做任何事情。您当然没有任何旧CPU的VIVT缓存问题。

也就是说,直接使用驱动程序中的那些体系结构私有缓存API会让内核维护人员彻底大肆宣传 - 驱动程序通常只需要关心缓存维护参与,但正确使用DMA mapping API已经在这方面处理了所有事情。

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