DMA缓冲区由驱动程序进行内存映射。 例如,在使用rtl8319的pci-skeleton.c中,我们有:
Environment.GetCommandLineArgs()[0]
但DMA引擎可以驻留在soc或设备中。
**即使DMA引擎在设备中,是否应该分配dma缓冲区?为什么? **
rtl8139cp数据表(我认为dma是设备的一部分,但不确定): http://realtek.info/pdf/rtl8139cp.pdf
我认为“dma引擎”和“dma控制器”指的是同一件事。如果错误请纠正我。
此致 然
答案 0 :(得分:3)
要明确的是,DMA(直接存储器访问)是一种从/向主存储器传输数据到/从外设传输数据的方法。为方便起见,忽略了存储器到存储器DMA和外设到外设总线主控。
DMA与编程I / O(PIO)相反,其中CPU执行数据传输。对于PIO,CPU将通过轮询设备的状态等待外设准备就绪,或让设备产生中断以指示外设的可用性。
轮询PIO是CPU密集型的,使用中断的PIO是一个巨大的改进。但是在没有任何CPU参与的情况下执行传输(除了设置之外)就是DMA的含义。 DMA传输由系统的DMA控制器(也称为第三方DMA)或与外设相关的总线主控(也称为第一方DMA)执行。 CPU参与(简单的,未链接的)DMA传输包括设置传输(例如,分配源和目标地址,传输计数),然后确认传输结束。
DMA缓冲区由驱动程序进行内存映射。
不确定你的意思。
分配或获取具有DMA功能的缓冲区通常不需要映射。
在您的问题中,您暗示已集成发送和接收FIFO并使用PCI总线主控的PCI以太网控制器不必“映射DMA缓冲区”。以太网控制器是系统的外围设备,它必须从主存储器获取数据以进行传输,并且通过以太网接收的数据必须最终传输到主存储器,以便CPU可以处理它。 集成的发送和接收FIFO仅仅是存在于主存储器和外围设备其余部分之间的中间缓冲器。
但DMA引擎可以驻留在soc或设备中。
你的术语很草率 SoC是(a)芯片上的系统。典型的SoC肯定会有一个DMA控制器,它是系统的DMA控制器,即第三方DMA 设备可能具有DMA引擎,特别是如果它连接的总线支持总线主控。您引用的以太网控制器确实支持PCI总线主控。该总线主控是访问主存储器(PCI主机)。
外设可能使用总线主控(而不是系统的DMA控制器)这一事实无法否定设备驱动程序正确分配DMA容量缓冲区的需要。总线主控器具有与系统DMA控制器完全相同的目的:从/向外部存储器传输数据到/从主存储器传输数据。 CPU只能处理驻留在主存储器中的数据。外围设备的目的是将该数据传输到主存储器进行处理,并从已处理的主存储器传输该数据。
即使DMA引擎在设备中,是否应该分配dma缓冲区?为什么?
由于总线主控用于使外设能够以最小的CPU干预访问主存储器,因此访问的存储器必须是DMA能够的。那就是:
当PCI设备驱动程序使用 pci_alloc_consistent()来获取数据传输的缓冲区时,可确保DMA内存。此例程将返回CPU的虚拟地址以引用此缓冲区,并为总线主控器返回dma_handle
以引用此缓冲区。