Linux kernel 如何从ARMV7上的Linux内核空间刷新一级和二级缓存中的地址范围?

Linux kernel 如何从ARMV7上的Linux内核空间刷新一级和二级缓存中的地址范围?,linux-kernel,arm,embedded,linux-device-driver,embedded-linux,Linux Kernel,Arm,Embedded,Linux Device Driver,Embedded Linux,我正在编写一个虚拟驱动程序,以在ARMV7上共享内核缓冲区到用户空间。 我想为这个缓冲区实现fsync()操作。我应该使用哪些API来刷新fsync中给定用户地址范围的一级和二级缓存? asm/cacheflush.h中有很多API可用,但我不确定它们是同时刷新L1和L2还是只刷新L1 目前我正在使用 dmac_flush_range() outer_flush_range() API。对于用例来说,它们合适吗 谢谢 ARMv7要求数据缓存的行为如同*,这意味着映射到同一物理地址的多个虚拟地址

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

目前我正在使用

dmac_flush_range()
outer_flush_range()
API。对于用例来说,它们合适吗


谢谢

ARMv7要求数据缓存的行为如同*,这意味着映射到同一物理地址的多个虚拟地址自然地相互一致,而不需要任何缓存维护或屏障。因此,缓冲区的内核映射和用户映射在任何时候都是完全同步的,实际上不需要做任何事情。您当然不会遇到旧CPU的任何VIVT缓存问题

这就是说,直接从驱动程序中使用这些体系结构私有缓存API会让内核维护人员对您大喊大叫——当涉及DMA时,驱动程序通常只需要关心缓存维护,但正确使用已经解决了这方面的所有问题

*例如,Cortex-A8的L1在引擎盖下,它们不一定是PIPT