Linux kernel ARM linux中pgprot_缓存映射的缓存一致性问题

Linux kernel ARM linux中pgprot_缓存映射的缓存一致性问题,linux-kernel,arm,cpu-cache,Linux Kernel,Arm,Cpu Cache,我正在尝试使用vm\u pg\u prot中的pgprot\u cached()将由ion\u system\u heap(alloc\u pages)分配的内存映射到用户空间,使用缓存堆进行相机预览。有了这个,我在相机预览中得到了一个噪音。但是,如果使用pgprot\u writecompine()或pgprot\u noncached(),则预览是正确的。在将预览图像转储到面板之前,我尝试了flush\u cache\u all(),dma\u sync\u sg\u for\u devic

我正在尝试使用
vm\u pg\u prot
中的
pgprot\u cached()
将由
ion\u system\u heap(alloc\u pages)
分配的内存映射到用户空间,使用缓存堆进行相机预览。有了这个,我在相机预览中得到了一个噪音。但是,如果使用
pgprot\u writecompine()
pgprot\u noncached()
,则预览是正确的。在将预览图像转储到面板之前,我尝试了
flush\u cache\u all()
dma\u sync\u sg\u for\u device()
dma\u sync\u sg\u for\u cpu()
进行缓存刷新/失效。 还有什么我需要照顾的吗?
这可能不是缓存一致性问题吗?

不清楚哪些(如果不是两个)设备使用DMA。通常显示器使用DMA,但可能帧捕获器也使用DMA。代码是复制还是进行平面/像素操作?整体流程尚不清楚,因此我认为没有人可以说。只是相机时钟与显示器之间的电源/噪音问题可能会起作用。CPU是否同时进入屏幕?闪烁在哪里;随机或特定点。摄像头传感器使用DMA抓取帧。然后,它将缓冲区传递给Xserver,Xserver进行图像后处理,并将图像转储到面板。在相机应用程序的一次发布中,特定位置会出现噪音。噪声点在随后的发射中是不同的。你可以通过噪声点来确定很多。是直线(垂直/水平)吗?如果它是一个集群/区域,那么它似乎不是缓存。”writecombine'对此设备不有用。你需要“读一致性”类型的东西,这样CPU就不会使用缓存;缓冲读取可能是正常的。您使用的是“kmalloc()”还是?这可能是一个虚拟/物理问题。损坏的形式是群集/区域。我们正在使用alloc_page()进行内存分配。如果我们想使用pgprot_cached标志,您能建议如何解决这个问题吗?分配的内存映射到IOMMU,并映射到缓存了pgprot_的CPU。摄像头传感器写入IOMMU地址。从CPU读取的预览图像数据已损坏(模糊数据)。