Linux中有没有常用的PCIe DMA memcpy函数

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

我也遇到了和这个人同样的问题
从 PCIe 内存进行 Memcpy 比从 memcpy 到 PCIe 内存需要更多时间

是的,MMIO 读取在 x86/x86-64 上非常慢,仅创建/发送 32 或 64 位的 TLP 有效负载大小。似乎没有解决方案来增加MMIO有效负载大小,只能更改为使用DMA

然后我研究了PCIe DMA,我也遇到了和这个家伙同样的问题
Linux 中 DMA 传输到从属 PCI 设备

PCIe 规范(MSI/MSIx)似乎没有通用寄存器来获取 src/dst 地址(条偏移)和长度(大小)设置,每个芯片都有其特殊的寄存器偏移。所以我没有得到问题(8273568)的答案。我觉得PCIe是非常流行的接口。是否有办法使用 dma 访问(例如遵循 PCIe BAR 到 MMIO 访问内存)?或者有什么办法可以轻松地从 pcie 信息中找到 BAR 的 dma src/dst 配置偏移量?

PS:我尝试使用Linux内核的async_memcpy来进行DMA memcpy,但似乎不起作用。跟踪代码可以知道,async_tx_find_channel(dma_find_channel)函数只是读取了我的CPU上的NULL指针。然后回到原来的memcpy函数。我之前是否错过了任何硬件/软件设置?

memcpy dma pci
1个回答
0
投票

PCI BAR 位于 PCI 配置空间中的固定地址(0x10-0x24),并且有一个标准程序来查找它们所描述的内存区域的大小(读取初始值、写入所有值、读回、比较)。这使得 BIOS 和/或操作系统无需任何特定于设备的知识即可枚举所有设备,并将它们可能提供的任何 I/O 内存映射到公共地址空间。 Linux 内核在启动时读取和/或执行此映射。

/proc/iomem
按地址顺序列出它,
lspci -v
按设备打印它。给定的 PCI 设备可能能够也可能不能够发出 DMA 请求,以自行将数据复制到系统内存或从其内部内存复制数据;这是特定于设备的,并且执行此操作的方法也是特定于设备的。司机们会照顾它。听起来您想使用设备 B(可能是 PCIe 根复合体)的 DMA 功能从设备 A 内存到系统内存异步复制。我不知道这是否可能,并且由于 IOMMU,地址映射通常会非常重要(请参阅下面的第二个链接)。
async_memcpy
模块支持Linux软RAID并将系统内存复制到系统内存。

您可能会发现此问题与解答此 Linux DMA API 描述很有用。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.