刷新虚拟地址范围

Flushing a virtual address range

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

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

读buffer时,老数据好像被读取了,说明cache有问题(直接检测DDR,绕过Linux,读取的是新数据)

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

最好的方法是什么?

使用内核 3.14

您有 2 个选择:

  1. 使用连贯映射,即使用 dma_alloc_coherent

  2. 分配内存
  3. 使用流映射,即使用 dma_map_single 告诉内核 DMA 方向并在完成后取消映射,为 dma 映射缓冲区