Linux kernel 从PCIe设备到一致映射内存的直接从DMA传输,无需额外的memcpy

Linux kernel 从PCIe设备到一致映射内存的直接从DMA传输,无需额外的memcpy,linux-kernel,linux-device-driver,embedded-linux,dma,pci-e,Linux Kernel,Linux Device Driver,Embedded Linux,Dma,Pci E,我正在从FPGA改进我的定制内核驱动程序中DMA传输的吞吐量。当前吞吐量约为250 Mb/s 架构如下所示: 通过PCIe连接的FPGA 当调用probe时,我使用与dma\u alloc\u coherent一致的映射在RAM中分配一个大的缓冲区 FPGA不断地通过DMA传输数据 每当DMA准备就绪时,FPGA就会引发一个int,然后我从中断处理程序使用device\u prep\u DMA\u memcpy将数据从BAR寄存器映射的内存空间复制到一致分配的缓冲区 有没有办法从device\u

我正在从FPGA改进我的定制内核驱动程序中DMA传输的吞吐量。当前吞吐量约为250 Mb/s

架构如下所示:

  • 通过PCIe连接的FPGA
  • 当调用
    probe
    时,我使用与
    dma\u alloc\u coherent
    一致的映射在RAM中分配一个大的缓冲区
  • FPGA不断地通过DMA传输数据
  • 每当DMA准备就绪时,FPGA就会引发一个int,然后我从中断处理程序使用
    device\u prep\u DMA\u memcpy将数据从
    BAR
    寄存器映射的内存空间复制到一致分配的缓冲区

  • 有没有办法从
    device\u prep\u dma\u memcpy
    中避免此
    memcpy
    ,并告诉dma直接将数据复制到我的一致分配的缓冲区?

    如何?你的硬件可以通过MMIO区域提供自己的缓冲区,对吗?所以,为了处理这些数据,你需要以某种方式进行处理。如果您的处理程序足够快,您可以在它内部执行,否则您需要将其存储在更大的缓冲区中并偶尔执行(就像多任务操作系统中的其他驱动程序一样)。或者只使用一个执行作业的任务运行RTOS。根据您的描述,当DMA就绪时,设备不会引发中断。而是将数据写入自己的内存,并在完成时引发中断。然后是您明确地将内存DMA到CPU内存中。是否可以直接写入CPU内存,并在写入后引发中断?