【问题标题】:GFP_KERNEL vs GFP_DMA and kmalloc() vs dma_alloc_coherent()GFP_KERNEL 与 GFP_DMA 和 kmalloc() 与 dma_alloc_coherent()
【发布时间】:2018-10-05 04:34:39
【问题描述】:

我总是使用 dma_alloc_coherent() 来分配带有标志 GFP_KERNEL 的 DMA 缓冲区,到目前为止还没有观察到问题,我的理解是这两个标志也允许调用者休眠..

所以我只是好奇 GFP_DMA 选项在这种情况下是否真的有用?该标志也可用于 kmalloc(),但是我们不应该使用 kmalloc() 来分配 DMA 缓冲区而只分配 dma api?

【问题讨论】:

    标签: linux-kernel dma


    【解决方案1】:

    dma_alloc_coherent() 返回已设置适当内存属性的地址范围,因此可以自然地处理缓存效果。我们不需要对这些地址做任何缓存操作。

    如果我们使用 kmalloc() 分配的地址进行 DMA 操作,那么我们需要根据传输方向执行额外的缓存操作,如缓存清理和缓存无效。

    GFP_DMA 标志只是从 32 位机器上的 DMA 区域分配内存。

    【讨论】:

      【解决方案2】:

      经过一番研究,我发现了 LLD 第 3 版第 8 章的以下陈述:

      每当分配一个新页面来满足内存分配请求时,内核都会构建一个可用于搜索的区域列表。如果指定了 _ _GFP_DMA,则仅搜索 DMA 区域:如果在低地址没有可用内存,则分配失败。如果不存在特殊标志,则搜索普通内存和 DMA 内存。

      看起来标志 GFP_DMA 是 GFP_KERNEL 的子集。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-27
        • 2012-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多