如何通过一个mmap映射内存指针来立即刷新写入?

在双ARM处理器系统(准确地说是Xilinx Zynq)上使用/ dev / mem和mmap时,我看起来像是一个caching问题。 我的configuration是不对称的,一个处理器运行Linux,另一个处理器运行裸机应用程序。 它们通过不在Linux虚拟内存空间的RAM块进行通信(它被devicetree文件排除)。 当我的用户空间Linux应用程序使用从mmap()返回的指针写入内存时,第二个处理器可能需要从100 ms到超过一秒的时间才能检测到已更改的内存内容。

在对/ dev / mem的open()调用中,我试图指定O_RDRW,O_SYNC和O_DIRECT,但是O_DIRECT导致打开失败,所以我删除了O_DIRECT。 我认为O_SYNC应该保证在write()调用返回之前将数据写入内存,但是我使用内存指针而不是通过write()写入。 在mmap()调用中,我看不到任何可能解决caching问题的参数。

我已经尝试在写入内存后调用fsync(fd)和fdatasync(),但是这并没有改变行为。

什么DID似乎工作是在内存写入后立即产生这个命令:sync; 回声3 / proc / sys / vm / drop_caches

通过映射的内存指针立即刷新写入最简单的方法是什么?

Solutions Collecting From Web of "如何通过一个mmap映射内存指针来立即刷新写入?"

fsync等全部将存储器映射区域同步到支持块设备(例如,文件)。

它们不影响CPU数据缓存。 您将需要使用显式高速缓存清除调用来将CPU高速缓存清空到DRAM,否则您将不得不使用ACP端口。

ACP端口应该是缓存一致的,但我从来没有得到它的工作。

这是一个如何刷新缓存的答案。 我相信代码需要放在您的设备驱动程序中。 我们把这个代码封装在一个通用的“portalmem”驱动程序中 。 它使您的应用程序能够分配您可以与硬件共享的内存,并在应用程序写入后提供用于刷新缓存的ioctl。