Xuefeng
驱动牛犊
驱动牛犊
  • 注册日期2001-05-09
  • 最后登录2016-09-27
  • 粉丝0
  • 关注0
  • 积分79分
  • 威望176点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:3780回复: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
顶一下!
skymelai
驱动牛犊
驱动牛犊
  • 注册日期2007-08-10
  • 最后登录2010-01-29
  • 粉丝1
  • 关注0
  • 积分81分
  • 威望711点
  • 贡献值3点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-08-23 09:40
顶一下吧,我初学也一直没有搞清楚PCI里面的地址映射
skymelai
驱动牛犊
驱动牛犊
  • 注册日期2007-08-10
  • 最后登录2010-01-29
  • 粉丝1
  • 关注0
  • 积分81分
  • 威望711点
  • 贡献值3点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-08-23 09:41
我有个问题想请问一下楼主,既然是在驱动里面,为什么还得把物理地址映射成线性地址呢?
物理地址和线性地址是什么关系呢??
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传输使用物理地址,而应用程序使用线性地址啊。
shirullan
驱动牛犊
驱动牛犊
  • 注册日期2008-06-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望352点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2009-08-25 09:39
通过设备管理器看到的地址以及地址范围,是系统地址,也就是在PCI总线驱动程序作用下,对PCI设备的配置寄存器进行分析后获取的设备资源的映射后地址。
Xuefeng
驱动牛犊
驱动牛犊
  • 注册日期2001-05-09
  • 最后登录2016-09-27
  • 粉丝0
  • 关注0
  • 积分79分
  • 威望176点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2009-08-25 14:40
引用第5楼shirullan于2009-08-25 09:39发表的  :
通过设备管理器看到的地址以及地址范围,是系统地址,也就是在PCI总线驱动程序作用下,对PCI设备的配置寄存器进行分析后获取的设备资源的映射后地址。

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

谢谢!@
lee922@gmail.co
驱动牛犊
驱动牛犊
  • 注册日期2007-07-31
  • 最后登录2010-06-22
  • 粉丝0
  • 关注0
  • 积分39分
  • 威望340点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分1分
9楼#
发布于:2009-09-27 11:54
不可以,它不是物理地址
philoman
驱动牛犊
驱动牛犊
  • 注册日期2005-05-29
  • 最后登录2011-07-13
  • 粉丝0
  • 关注0
  • 积分73分
  • 威望235点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2009-12-08 21:40
楼主没有说明所用的桥接芯片;若是PCI9054或与之类似的芯片,其PCIBAR0/PCIBAR1映射的是PCI9054的配置寄存器空间,通过这两个基址+offset可以访问PCI9054的内部寄存器;
PCIBAR2/PCIBAR3用于访问Local侧的两个地址空间,分别与LS0BA/LS1BA进行PCI地址到Local侧地址的映射;若要进行DMA,配置DMA寄存器DMAPADR /DMALADR必须使用物理地址;
当使用WinDriver进行开发时,可以使用WD_DMALock函数来获取物理地址;
xiaoxiao
驱动牛犊
驱动牛犊
  • 注册日期2002-08-05
  • 最后登录2018-04-08
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望30点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2010-01-29 10:49
问个问题:
如果PCI卡要在操作系统中映射256M的内存空间,那么机箱上插8块这样的卡,操作系统就要拿出2G的内存空间,这样操作系统自己、操作系统上的其它应用程序不就没有了内存。如果我的机子只有1G的物理内存,那么整个系统的性能岂不是非常低下?

noregister
驱动牛犊
驱动牛犊
  • 注册日期2012-08-19
  • 最后登录2012-08-19
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2012-08-19 23:16
顶起这个帖子,希望高手继续解答疑问
游客

返回顶部