gpt4 book ai didi

linux - 如何通过 mmap 映射内存指针进行写入以立即刷新?

转载 作者:IT王子 更新时间:2023-10-29 00:41:52 26 4
gpt4 key购买 nike

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

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

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

DID 似乎起作用的是在内存写入后立即生成此命令: 同步; echo 3/proc/sys/vm/drop_caches

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

最佳答案

fsync 等都将内存映射区域同步到支持 block 设备(例如,文件)。

它们不影响 CPU 数据缓存。您将需要使用显式缓存清理调用将 CPU 缓存刷新到 DRAM,或者您将不得不使用 ACP 端口。

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

这是关于如何 flush the cache 的答案.我相信代码需要进入您的设备驱动程序。我们将该代码打包在一个通用的 "portalmem" driver 中.它使您的应用程序能够分配可以与硬件共享的内存,并且它提供了一个 ioctl 用于在您的应用程序写入缓存后刷新缓存。

关于linux - 如何通过 mmap 映射内存指针进行写入以立即刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20750176/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com