【问题标题】:Flushing a virtual address range刷新虚拟地址范围
【发布时间】:2016-07-10 19:53:29
【问题描述】:

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

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

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

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

最好的方法是什么?

使用内核 3.14

【问题讨论】:

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


    【解决方案1】:

    你有两个选择:

    1. 使用一致性映射,即使用 dma_alloc_coherent 分配内存

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

    【讨论】:

    • 谢谢。如果方法分配物理上连续的内存,我可以使用其中任何一种吗?
    • 在 dma_alloc_coherent 你得到一个物理上连续的内存缓冲区。如果你使用 dma_map_single,你需要传递一个连续分配的缓冲区(例如使用 kmalloc 分配)
    猜你喜欢
    • 2017-06-24
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2011-01-11
    • 2018-07-09
    相关资源
    最近更新 更多