我正在使用malloc()
和memset()
分配一个32MB的缓冲区和一些数据。当我使用此缓冲区并将其传递给DMA驱动程序时,它使用get_user_pages_fast()
来固定页面。执行DMA操作时,数据到达外设。
但如果我分配了8kB或16kB或32kB或512kB的缓冲区,则在DMA之后,将到达外围设备的过时数据。
我尝试使用dma_alloc_coherent()
在驱动程序中分配缓冲区大小并刷新分配的地址(使用clflush_cache_range()
),然后数据到达终点,如果不使用上面的API数据刷新数据则不是达到。
所以我有x86机器,它使用i7-3930K Intel处理器,有12MB智能缓存。
所以有些问题看起来像缓存效果,但我没有适当的理论与用户空间为什么32 MB缓冲区分配和传输是正确的DMA。
任何指导/帮助都会给我更好的洞察力。