gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:06 29 4
gpt4 key购买 nike

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 数据表(我认为 dma 是设备的一部分,但不确定): http://realtek.info/pdf/rtl8139cp.pdf

我认为“DMA 引擎”和“DMA Controller ”指的是同一事物。如有不妥请指正。

问候,冉

最佳答案

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

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

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


DMA buffers are memory mapped by the driver.

不知道你的意思是什么。
分配或获取支持 DMA 的缓冲区通常不需要映射。

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

But DMA engine can reside in soc or in device.

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

外围设备可能使用总线控制(而不是系统的 DMA Controller )这一事实不能否定设备驱动程序正确分配 DMA 缓冲区的必要性。总线主控器与系统的 DMA Controller 具有完全相同的目的:将数据从外围设备传输到/从主存储器传输。 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 内存。此例程将返回一个虚拟地址供 CPU 引用此缓冲区,并返回一个 dma_handle 供总线主控引用此缓冲区。

关于linux - 当 DMA 引擎在设备中时,为什么驱动程序需要映射 DMA 缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48659470/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com