【问题标题】:DMA cache coherent contiguous allocationDMA 高速缓存一致连续分配
【发布时间】:2013-08-02 10:42:32
【问题描述】:

我正在考虑为 DMA 事务分配缓冲区。我读到有两种方法可以做到这一点 - 连贯映射或流映射。

现在,我们需要缓存一致的缓冲区。但是,我们没有做任何分散/收集,所以我们想要dma_map_single 调用的好处。我们在 bootargs 中留出了一些连续内存,所以我们总是有足够的连续内存可用。

所以我想知道,我们可以用dma_alloc_coherent 返回的虚拟地址调用dma_alloc_coherent,然后调用dma_map_single 吗?然后将返回的 map single 的物理地址设置为 dma_alloc_coherent 在其调用中返回的 dma 句柄。

这有意义吗?还是这样做是多余的/不正确的?

【问题讨论】:

    标签: linux-kernel linux-device-driver


    【解决方案1】:

    您不能同时使用两者。但是您也在尝试解决一个不存在的问题。只需使用dma_alloc_coherent(),它会为您提供一个包含虚拟地址和物理地址的连续 DMA 内存缓冲区。 DMA 到物理地址,从 CPU 用虚拟地址访问它。有什么问题?

    【讨论】:

    • 我可以使用 alloc_coherent 分配大 (8MB) 块吗?我在 bootargs 中使用 CMA=16MB 分配了一些内存。 alloc_coherent 是否查找由 CMA bootarg 分配的内存?我以为函数调用会为我做这件事,但后来我读到了this。在文章中间的“DMA 子系统集成”小节下,它说我们必须首先让 alloc_coherent 调用查找 CMA 在启动时分配的内存。这是必要的吗? This 不会那样做。
    • 另外,dma_alloc_coherent() 是否检查之前是否分配了 dma 句柄?如果我有一个发送缓冲区和一个接收缓冲区,我希望它们是连续内存的单独区域。如果我为一个缓冲区分配一个虚拟/物理地址,第二个 dma_alloc_coherent() 调用是否会首先检查以确保它不会在前一个缓冲区中返回虚拟/物理地址?我尝试查看源代码,但找不到执行此检查的部分。它应该存在,对吧?考虑到这是一件非常基本的事情吗?
    • 我阅读了那些页面。 CMA 应该是完全透明的。它确保dma_alloc_coherent() 可以访问大量连续内存,仅此而已。重新分配......什么?当然,正常工作的分配器不会将重叠区域交给您。你想太多了。只需为每个区域拨打dma_alloc_coherent(),完成后拨打dma_free_coherent(),然后继续。如果它给您带来问题,请回来。
    • @Peter,dma_alloc_coherent 返回连续内存吗?我在 DMA-API.txt 中找不到这样的声明。谢谢,
    • @ransh 可能使用 IOMMU,它返回 CPU 和设备都可以看到的连续的物理/虚拟内存区域?
    猜你喜欢
    • 2011-10-31
    • 2020-05-05
    • 2012-04-25
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2017-09-26
    相关资源
    最近更新 更多