阅读:3989回复:12
关于PCI数据采集卡的内存映射的问题
通过对PCI寄存器的设置,内存映射了256M的内存空间。
通过设备管理器可以看到内存范围是0xC0000000-0xCFFFFFFF(正好256M) 驱动里通过对采集卡配置空间的基地址寄存器BaseAddresses[1]访问可以得到0xC0000000这个地址,现在我的问题是0xC0000000这个地址是什么地址,是物理地址吗? 如果是,可以直接用这个地址来进行DMA传输吗,如果不是那么怎么样能转成物理地址? 如果可以进行DMA传输,那么如何转成线性地址给我的程序来读取数据呢? 驱动学的比较差,所以问题较多,请大家帮忙,谢谢! |
|
最新喜欢:![]() |
沙发#
发布于:2009-08-22 11:03
顶一下!
|
|
板凳#
发布于:2009-08-23 09:40
顶一下吧,我初学也一直没有搞清楚PCI里面的地址映射
|
|
地板#
发布于:2009-08-23 09:41
我有个问题想请问一下楼主,既然是在驱动里面,为什么还得把物理地址映射成线性地址呢?
物理地址和线性地址是什么关系呢?? |
|
地下室#
发布于:2009-08-24 08:40
|
|
5楼#
发布于:2009-08-25 09:39
通过设备管理器看到的地址以及地址范围,是系统地址,也就是在PCI总线驱动程序作用下,对PCI设备的配置寄存器进行分析后获取的设备资源的映射后地址。
|
|
6楼#
发布于:2009-08-25 14:40
|
|
7楼#
发布于:2009-08-26 09:21
回 6楼(Xuefeng) 的帖子
物理地址应该在START_DEVICE的时候就获取到了,也就是那个什么ResourcesRaw和ResourcesTranslated里面包含对应资源的PHYSICAL_ADDRESS这个参数,你将他们保存在DEVICE_EXTENSION中就可以了(pdx->MemoryPhysicalAddress = ResourceTranslated->u.Memory.Start;),另外,我还是没有尝试用DMA进行数据传输,所以相关的理论也不是很清楚,以上陈述仅供参考。 |
|
驱动牛犊
![]() |
9楼#
发布于:2009-09-27 11:54
不可以,它不是物理地址
|
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函数来获取物理地址; |
|
11楼#
发布于:2010-01-29 10:49
问个问题:
如果PCI卡要在操作系统中映射256M的内存空间,那么机箱上插8块这样的卡,操作系统就要拿出2G的内存空间,这样操作系统自己、操作系统上的其它应用程序不就没有了内存。如果我的机子只有1G的物理内存,那么整个系统的性能岂不是非常低下? |
|
12楼#
发布于:2012-08-19 23:16
顶起这个帖子,希望高手继续解答疑问
|
|