流式 DMA 与一致 DMA

问题描述 投票:0回答:1

我遵循了 DMA API https://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt 并且我了解 DMA 有 2 种方法:

  1. 一致的 DMA 映射 - 例如 dma_alloc_coherent()
  2. 流 DMA - 例如 dma_map_single()

在《Linux设备驱动程序》一书中指出方法(2)是首选:

内核开发人员建议尽可能使用流映射而不是连贯映射。做出此建议有两个原因。第一个是,在支持映射寄存器的系统上,每个 DMA 映射都使用总线上的一个或多个寄存器。相干映射具有很长的生命周期,可以长时间独占这些寄存器,即使它们没有被使用。另一个原因是,在某些硬件上,流映射可以通过相干映射无法使用的方式进行优化。

但是,我发现在以太网适配器驱动程序中,有些使用方法(1),而另一些则使用方法(2)。 所以,我的问题是:

如果我们已经有一个缓冲区,使用方法(1)有什么理由/优点吗(例如在以太网驱动程序中,API已经获取了skb缓冲区并且只需要传输它)。

networking linux-kernel linux-device-driver dma
1个回答
0
投票

这不是一个选择。如果内存中有固定的环形缓冲区,例如 I/O 完成环,设备和 CPU 都需要以重叠方式访问,那么需要将其标记为不可缓存。所以它是用 dma_alloc_coherent 映射的。

同一设备也可能独立于 CPU 写入或读取缓冲区,因此 CPU 从缓存中刷新该区域(同步)并使用 dma_map_single 将其映射到 DMA。完成后它会取消映射,以便 CPU 可以再次使用它。

如果仔细查看代码,许多网络驱动程序都将这两个调用用于两个不同的目的。

© www.soinside.com 2019 - 2024. All rights reserved.