刷新虚拟地址范围

时间:2016-03-23 13:31:13

标签: linux-kernel linux-device-driver cpu-cache

我正在开发一个Linux内核模块,它与使用DMA访问DDR的硬件组件连接。 (在手臂SoC上运行)

驱动程序本质上做的是分配缓冲区(w / kmalloc),并将缓冲区的物理(使用virt_to_phys)地址写入底层硬件

当读取缓冲区时,旧数据似乎被读取,这表明存在缓存问题(当直接检查DDR时,绕过Linux,读取新数据)。

我似乎无法理解缓存刷新/失效是如何工作的。

最好的方法是什么?

使用内核3.14

1 个答案:

答案 0 :(得分:1)

您有两个选择:

  1. 使用使用dma_alloc_coherent分配内存的相干映射

  2. 使用流式映射,使用dma_map_single映射dma的缓冲区,告诉内核DMA方向,并在完成后取消映射