刷新虚拟地址范围
Flushing a virtual address range
我正在开发一个 Linux 内核模块,它与使用 DMA 访问 DDR 的硬件组件连接。 (运行 在 arm SoC 上)
驱动程序本质上做的是分配一个缓冲区(w/kmalloc),并将缓冲区的物理(使用virt_to_phys)地址写入底层硬件
读buffer时,老数据好像被读取了,说明cache有问题(直接检测DDR,绕过Linux,读取的是新数据)
我似乎无法理解缓存刷新/失效的工作原理。
最好的方法是什么?
使用内核 3.14
您有 2 个选择:
使用连贯映射,即使用 dma_alloc_coherent
分配内存
使用流映射,即使用 dma_map_single 告诉内核 DMA 方向并在完成后取消映射,为 dma 映射缓冲区
我正在开发一个 Linux 内核模块,它与使用 DMA 访问 DDR 的硬件组件连接。 (运行 在 arm SoC 上)
驱动程序本质上做的是分配一个缓冲区(w/kmalloc),并将缓冲区的物理(使用virt_to_phys)地址写入底层硬件
读buffer时,老数据好像被读取了,说明cache有问题(直接检测DDR,绕过Linux,读取的是新数据)
我似乎无法理解缓存刷新/失效的工作原理。
最好的方法是什么?
使用内核 3.14
您有 2 个选择:
使用连贯映射,即使用 dma_alloc_coherent
分配内存
使用流映射,即使用 dma_map_single 告诉内核 DMA 方向并在完成后取消映射,为 dma 映射缓冲区