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

在双ARM处理器系统(准确地说,Xilinx Zynq)上使用/ dev / mem和mmap时,我遇到了似乎是缓存问题的问题。 我的配置是不对称的,一个处理器运行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()调用中看不到任何缓解问题的参数。

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

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

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


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

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

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

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

链接地址: http://www.djcxy.com/p/66183.html

上一篇: How to get writes via an mmap mapped memory pointer to flush immediately?

下一篇: initialize swift class from objective c library