求助:关于PCI bar和pci_dev结构体中resource的一点疑问
PCI 配置空间bar中保存的不是物理地址的首地址么,而pci_dev结构体中的resource也是保存bar相关资源的描述,包括开始,结束,大小等,那么我的疑问来了1、我直接读桥设备的bar 0值为0x8010 0000, 而读取resource的start值为0xc010 0000,为什么这连个值会不一样?
2、pci配置空间的bar到底是用来映射什么用的?
3、pci_dev中的resource结构体中保存的值到底是什么值?
哪位大侠了解给讲讲啊,迷惑中。。。 没有大哥搞过pci么?快来给我解答下啊,迷惑中。。。 1。 你确定你读的没错么?另外,为啥去读桥呢?一般的都是读设备
2。PCI BAR就是用来分配物理地址的。里面保存的是物理地址。OS要用的时候,要调用IOREMAP来建立个相应的页表和虚拟地址。
3。RESOURCE里放的应该是物理地址。 1、确认没有读错,我直接映射bar0里面的地址是失败的,导致内存错误;而resource里面的地址映射是没有问题的,都能用;
我需要通过桥的配置信息来配置NT端口,做NT实验。NT的virtual side地址只有通过上行端口的bar 0才能够访问,所以我得映射那个bar0的地址
我也很迷惑,按说bar0里面保存的物理地址和resource里面的地址应该是一致的,可是偏偏却不一致,目前是resource里面的地址应该是cpu认可的地址,而bar里面的不是。
另外,linux内核里面pci枚举的时候哪个函数是为pci 设备(比如NT端口被识别为“其他桥接设备”)分配memory资源的啊,能否告知小弟下,急用啊。 PCI设备可以有好几个BAR,也许是用的其他的BAR? 而且还要看是IO PORT 还是 MEMORY MAP。
你说的NT是啥? WINDOWS NT 4.0? :lol:
其他不知道了。。。 PCI桥就两个可用的bar,另外一个bar没有被分配任何资源,这个我可以确定。也许是pci的修订过程给修改了资源吧。
NT是非透明桥的意思 PCI设备可以有好几个BAR,也许是用的其他的BAR? 而且还要看是IO PORT 还是 MEMORY MAP。
你说的NT是啥? ...
accessory 发表于 2010-04-19 22:57 http://linux.chinaunix.net/bbs/images/common/back.gif
PCI设备可以有好几个BAR,也许是用的其他的BAR? 而且还要看是IO PORT 还是 MEMORY MAP。
哪个bar对应的是IO资源,哪个对应的是内存资源? 看PCI SPEC。 我记得是在PCI CONFIGURATION SPACE里,某个地址的一个BIT 为0 还是1。分别表示IO 还是memory 映射 经过一段时间的学习、探讨,对这个贴做个总结吧:
1、0x8010 0000代表的是总线地址, 0xc010 0000代表的cpu认识的物理地址,这两个地址在X86架构下应该是一致的,可惜的是我的是ARM 架构,bus 地址和 物理地址之间存在一个偏移,这也是为什么这两个值代表的是统一资源,而不相同的原因
2、pci配置空间中的bar是用来映射pci设备的配置寄存器用的(或者映射别的,反正是映射用),里面的值是bus地址的首地址,至于空间的大小,可以先想bar中写0xFFFFFFFFF,然后读取,选最低的一位非0的,比如为0x10000,那个空间的大小就为0x1000(十进制的自己转换下吧)
3、pci resouce一系列的函数和结构体中保存的才是cpu识别的物理地址,才是可以用ioremap映射之后进行读写的地址,在做驱动程序对bar相应位置读写的时候一定要用这个
以上如果有不对的地方,请各位大侠、前辈指正 good to know
页:
[1]
2