当 DMA 引擎在设备中时,为什么驱动程序需要映射 DMA 缓冲区?

Why driver need to map DMA buffers when dma-engine is in device?

DMA 缓冲区是由驱动程序映射的内存。 例如,在使用 rtl8319 的 pci-skeleton.c 中,我们有:

  tp->tx_bufs = pci_alloc_consistent(tp->pci_dev, TX_BUF_TOT_LEN,
                   &tp->tx_bufs_dma);

但 DMA 引擎可以驻留在 soc 或设备中。

**即使 DMA 引擎在设备中,是否也应该分配 DMA 缓冲区?为什么 ? **

rtl8139cp datasheet(我认为dma是设备的一部分,但不确定): http://realtek.info/pdf/rtl8139cp.pdf

我相信 "dma engine" 和 "dma controller" 指的是同一件事。如有不妥请指正

此致, 运行

明确地说,DMA(直接内存访问)是一种将数据to/from 外设from/to 主内存传输的方法。为方便起见,忽略内存到内存 DMA 和外设到外设总线主控。

DMA 与编程的 I/O (PIO) 相反,其中 CPU 执行数据传输。对于 PIO,CPU 将通过轮询设备状态等待外围设备准备就绪,或者让设备生成中断以指示外围设备的可用性。

轮询 PIO 是 CPU 密集型,使用中断的 PIO 是一个巨大的改进。但是在没有任何 CPU 参与(设置除外)的情况下执行传输是 DMA 的含义。 DMA 传输由系统的 DMA 控制器(也称为第三方 DMA)或与外设关联的总线主控器(也称为第一方 DMA)执行。 CPU 参与(简单的,非链接的)DMA 传输包括设置传输(例如分配源和目标地址、传输计数),然后确认传输结束。


DMA buffers are memory mapped by the driver.

不确定你的意思。
分配或获取支持 DMA 的缓冲区通常不需要映射。

在您的问题中,您暗示具有集成传输和接收 FIFO 并使用 PCI 总线控制的 PCI 以太网控制器不必 "map DMA buffers"。以太网控制器是系统的外围设备,它必须从主内存中获取数据进行传输,而它通过以太网接收到的数据最终必须传输到主内存中,以便 CPU 可以处理它。 集成的发送和接收 FIFO 只是存在于主存储器和其余外围设备之间的中间缓冲区。

But DMA engine can reside in soc or in device.

你对术语很草率。
SoC 是片上系统。典型的SoC肯定会有DMA控制器,而且是系统的DMA控制器,即针对第三方DMA。
一个设备可能有一个 DMA 引擎,尤其是当它所连接的总线支持总线控制时。您引用的以太网控制器确实支持 PCI 总线控制。此总线控制是访问(PCI 主机的)主内存。

外设可能使用总线控制(而不是系统的 DMA 控制器)这一事实不能否定设备驱动程序正确分配 DMA 缓冲区的必要性。总线主机与系统的 DMA 控制器具有完全相同的目的:传输数据 from/to 外设 to/from 主存储器。 CPU 只能处理驻留在主内存中的数据。外围设备的目的是将该数据传输到主存储器进行处理,并从已处理的主存储器传输该数据。

Is it that dma buffers should be allocated even if DMA engine is in device ? Why ?

由于总线控制是为了使外围设备能够以最少的 CPU 干预访问主内存,因此被访问的内存必须是 DMA 可用的。即:

  • 内存必须可以被总线主控寻址;
  • 内存必须可以被 CPU 寻址;
  • 内存必须被锁定,即不可交换;
  • 内存必须是不可缓存的。

当 PCI 设备驱动程序使用 pci_alloc_consistent() 获取用于数据传输的缓冲区时,可确保 DMA 内存。此例程将为 return 一个虚拟地址供 CPU 引用此缓冲区,并为总线主控器提供一个 dma_handle 引用此缓冲区。