Pcie Dma传输数据,不建立DMA事务直接读取寄存器行吗?解决办法
发布时间:2010-06-14 17:45:49 文章来源:www.iduyao.cn 采编人员:星星草
Pcie Dma传输数据,不建立DMA事务直接读取寄存器行吗?
本人才接触驱动,对于驱动基本是白痴一个。最近需要做一个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 操作
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
在驱动开发中出现 'struct' type redefinition 应该怎么办?? 大神们告诉小弟一下...
下面是我写的代码:
#pragma once
//**********...
-
大神们帮我看一下,我的代码错在什么地方? 加载成功,卸载就蓝屏了....
/*
*******************************************************...
-
sigma8653很罕见的问题
SOS!
sigma8653板子插上卡,上电后可以识别SD卡,然后软重启(reboot)就无法识别了!
奇怪的时,继续软重启一次又可...
-
Cancel自旋锁 起了什么作用?
发现IoCancelIrp 函数中
获取了Cancel自旋锁
设置了Irp->Cancel
调用了OnCancelIo函数
但是进入了On...
-
windows下 pnp设备的即插即用功能是怎么实现的?
看到 windows内核情景分析里说
加载驱动有三种方式 前两种是静态 分别是引导...
-
取消当前 IRP 执行的过程是怎样的?
#pragma code_seg("PAGE")
NTSTATUS MyWdmRead(PDEVICE_OBJECT DeviceObject,PIRP Irp)
{
...
-
vs2008中,link2001错误的问题,代码如下
vs2008中,link2001错误的问题,代码如下
#include <ntddk.h>
VOID OnUnload(IN PDRIVER_OBJ...
-
什么是内核缓冲区,用户缓冲区
比如网卡的内核缓冲区,那这个缓冲区是在pc内存还是在网卡的芯片上呢?
------解决方案---------------...
-
如果在一个函数中有提升IRQL的语句 是不是整个函数都不能放在分页内存中 ?
如果我在一个函数前使用了 #pragma code_seg("PAGE") ...
-
请教Linux下dm9000网卡驱动程序问题
应用程序网络编程是基于socket接口的,好像完全屏蔽了底层,不能像字符设备那样应用程序可以调用...