Xuefeng
驱动牛犊
驱动牛犊
  • 注册日期2001-05-09
  • 最后登录2016-09-27
  • 粉丝0
  • 关注0
  • 积分79分
  • 威望176点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:3800回复:12

关于PCI数据采集卡的内存映射的问题

楼主#
更多 发布于:2009-08-21 15:22
通过对PCI寄存器的设置,内存映射了256M的内存空间。
通过设备管理器可以看到内存范围是0xC0000000-0xCFFFFFFF(正好256M)
驱动里通过对采集卡配置空间的基地址寄存器BaseAddresses[1]访问可以得到0xC0000000这个地址,现在我的问题是0xC0000000这个地址是什么地址,是物理地址吗?
如果是,可以直接用这个地址来进行DMA传输吗,如果不是那么怎么样能转成物理地址?

如果可以进行DMA传输,那么如何转成线性地址给我的程序来读取数据呢?

驱动学的比较差,所以问题较多,请大家帮忙,谢谢!


最新喜欢:

noregisternoregi...
Xuefeng
驱动牛犊
驱动牛犊
  • 注册日期2001-05-09
  • 最后登录2016-09-27
  • 粉丝0
  • 关注0
  • 积分79分
  • 威望176点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2009-08-22 11:03
顶一下!
Xuefeng
驱动牛犊
驱动牛犊
  • 注册日期2001-05-09
  • 最后登录2016-09-27
  • 粉丝0
  • 关注0
  • 积分79分
  • 威望176点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2009-08-24 08:40
引用第3楼skymelai于2009-08-23 09:41发表的  :
我有个问题想请问一下楼主,既然是在驱动里面,为什么还得把物理地址映射成线性地址呢?
物理地址和线性地址是什么关系呢??


DMA传输使用物理地址,而应用程序使用线性地址啊。
Xuefeng
驱动牛犊
驱动牛犊
  • 注册日期2001-05-09
  • 最后登录2016-09-27
  • 粉丝0
  • 关注0
  • 积分79分
  • 威望176点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2009-08-25 14:40
引用第5楼shirullan于2009-08-25 09:39发表的  :
通过设备管理器看到的地址以及地址范围,是系统地址,也就是在PCI总线驱动程序作用下,对PCI设备的配置寄存器进行分析后获取的设备资源的映射后地址。

这个地址可以用来进行DMA传输吗?需要转化为物理地址吗,如何转换?
如果上面的可以,那么我的应用程序里如果读这些数据呢,是不是还要把它转换为线性地址(虚拟地址)?
Xuefeng
驱动牛犊
驱动牛犊
  • 注册日期2001-05-09
  • 最后登录2016-09-27
  • 粉丝0
  • 关注0
  • 积分79分
  • 威望176点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2009-08-27 09:03
Re:回 6楼(Xuefeng) 的帖子
引用第7楼shirullan于2009-08-26 09:21发表的 回 6楼(Xuefeng) 的帖子 :
物理地址应该在START_DEVICE的时候就获取到了,也就是那个什么ResourcesRaw和ResourcesTranslated里面包含对应资源的PHYSICAL_ADDRESS这个参数,你将他们保存在DEVICE_EXTENSION中就可以了(pdx->MemoryPhysicalAddress = ResourceTranslated->u.Memory.Start;),另外,我还是没有尝试用DMA进行数据传输,所以相关的理论也不是很清楚,以上陈述仅供参考。

谢谢!@
游客

返回顶部