Pcie Dma传输数据,不建立DMA事务直接读取寄存器行吗?解决办法

2026年09月27日 11:28
有1个网友回答
网友(1):

最近需要做一个Pcie驱动,需要用DMA方式来传输数据。
看了好多例子,发现在DMA传输时需要在驱动中建立DMA事务。
例如:首先WdfDmaTransactionInitialize
,然后WdfDmaTransactionExecute
,在EvtProgramDma
函数中对寄存器进行读写,主要是把内存的物理地址写给寄存器的操作,然后等待中断,完成事务,释放。
MmGetPhysicalAddress
EvtProgramDma
------解决方案--------------------------------------------------------
对设备来说,直接知道物理地址就可以进行DMA传输了。
但是,对Windows系统来说,DMA传输会复杂一些。很多时候,系统内核要进行物理地址和虚拟地址映射的。
------解决方案--------------------------------------------------------
Pcie设备用DMA方式来传输数据,可以分为DMA主设备与DMA从设备,这两种模式的工作方式不同。
这与你的硬件有关系,请先搞清楚硬件有没有DMA控制器。
------解决方案--------------------------------------------------------
XLINX 上的PCI-E IPCORE为物理硬核,且为ENDPOINT核,如果使用DMA与内存进行通信进行写数据,只能工作于MASTER状态。
------解决方案--------------------------------------------------------
如果是大规模数据传输 例如音频 都是要用DMA 的 可以降低CPU的负担 要不然你的系统能跑几个程序啊
------解决方案--------------------------------------------------------
许多设备都可以临时控制总线。这些设备可以执行涉及主内存和其他设备的数据传送。由于设备执行这些操作的过程中无需借助于 CPU,因此该类型的数据传送称为直接内存访问 (direct memory access, DMA)。可以执行的 DMA 传送类型如下:
两个设备之间
设备和内存之间
内存和内存之间