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