surefire
驱动牛犊
驱动牛犊
  • 注册日期2010-03-08
  • 最后登录2010-05-04
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望91点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2485回复:7

WDM驱动中分配连续物理内存的问题

楼主#
更多 发布于:2010-04-23 12:20
在WDM驱动中为PCI设备分配连续的物理内存用做DMA操作,结果参考DDK文档,使用了MmAllocateContiguousMemory函数,编译都通不过,加了ntddk.h头文件也没有,自己在源文件里申明后,连接时找不到这个符号,说明库里根本没有这个函数的实现,加入wdm.lib和ntoskrnl.lib都没有用,请问,这个函数是不是已经在WDM中取消了?那如果需要给设备分配连续的物理内存该怎么做呢?我只需要把物理内存地址写入设备的寄存器就可以了,不需要使用系统的DMA Adapter那些东西,还有物理地址与虚拟地址之间相互转换的函数是什么?linux下就有virt_to_phys之类的函数,WDM中对应的是什么呢?
nudtsong
驱动牛犊
驱动牛犊
  • 注册日期2004-11-16
  • 最后登录2011-03-02
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望268点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-04-23 13:20
楼主把“物理内存地址写入设备的寄存器”的目的恐怕就是让设备发起DMA操作吧,既然如此,为什么不用“系统的DMA Adapter那些东西”?
surefire
驱动牛犊
驱动牛犊
  • 注册日期2010-03-08
  • 最后登录2010-05-04
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望91点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-04-23 15:53
谢谢楼上的

怎么说呢,整个DMA操作都不需要驱动做什么处理,只要告诉设备,缓存的物理地址就OK了。就是驱动分配一段缓存,把缓存的物理地址告诉设备,设备通过DMA方式把数据送入缓存,驱动程序从缓存取数据给应用,过程就是这样,不知道如何使用系统的DMA适配器
nudtsong
驱动牛犊
驱动牛犊
  • 注册日期2004-11-16
  • 最后登录2011-03-02
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望268点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-04-23 18:48
现在的PCI卡基本上都不需要占用主机的DMA通道了,但是MS要求代码还得这么写,可能是为了兼容或者其它什么原因吧:)
surefire
驱动牛犊
驱动牛犊
  • 注册日期2010-03-08
  • 最后登录2010-05-04
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望91点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2010-04-23 22:39
楼上的,要怎么写呢,其实我只是要一个物理内存的地址而已,就这么简单
nudtsong
驱动牛犊
驱动牛犊
  • 注册日期2004-11-16
  • 最后登录2011-03-02
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望268点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2010-04-27 10:50
楼主可以参考一下网上使用DMA的WDM例子,也可以看看DriverStudio自动生成的代码框架。
surefire
驱动牛犊
驱动牛犊
  • 注册日期2010-03-08
  • 最后登录2010-05-04
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望91点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2010-05-04 16:57
多谢楼上的,我是直接用DDK写的驱动
yadun
驱动牛犊
驱动牛犊
  • 注册日期2008-05-17
  • 最后登录2014-08-17
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望161点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2010-05-24 16:34
我想问问楼上的各位大牛,我要写pci下的dma驱动,需不需要在dsp端做中断处理呢,芯片ti的dm642
游客

返回顶部