我正在开发一个Linux内核模块,它与使用DMA访问DDR的硬件组件连接。 (在手臂SoC上运行)
驱动程序本质上做的是分配缓冲区(w / kmalloc),并将缓冲区的物理(使用virt_to_phys)地址写入底层硬件
当读取缓冲区时,旧数据似乎被读取,这表明存在缓存问题(当直接检查DDR时,绕过Linux,读取新数据)。
我似乎无法理解缓存刷新/失效是如何工作的。
最好的方法是什么?
使用内核3.14
答案 0 :(得分:1)
您有两个选择:
使用使用dma_alloc_coherent分配内存的相干映射
使用流式映射,使用dma_map_single映射dma的缓冲区,告诉内核DMA方向,并在完成后取消映射