PCI:关于BAR的疑惑
本来是做PCI-E,但其中对于BAR没讲,应该是兼容的所以又看了一下PCI的规范,里面倒是专门讲了,但还是不明白:
1. BAR0~BAR1只是Memory或I/O空间的大小及相关的特性。在Linux中有如下定义:
#define pci_resource_start(dev,bar) ((dev)->resource[(bar)].start) #define pci_resource_end(dev,bar) ((dev)->resource[(bar)].end) #define pci_resource_flags(dev,bar) ((dev)->resource[(bar)].flags) |
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
bios分配的,bios分配的
BIOS从host的RAM中分配?
是,是从HOST的RAM中分配的
我看了一下Linux下PCI-E显卡的一些信息,另外也看了一些资料,可以肯定它不是从RAM中分配的,只是占用系统总线上的地址空间而已,具体写这些映射到PCI上的空间实际上是北桥(或其后续的Root Complex)转换为PCI的读写信号(或PCI-E的读写报文)。
现在我没在公司所以还不能给出详细的信息,但它的BAR0启动之后起始地址是0xc0000000,大小(操作系统或BIOS写全1之后再取反加1得到的值)是256M(刚好是我的X600显卡的显存)。如果说是从系统RAM中分配的,则系统的物理内存肯定会小256M,但实际上它还是2G。
至于说是BIOS分配这些地址空间还是软件做可能不同的系统中不同吧,PC可能是BIOS直接完成的,而嵌入式系统可能是在BSP中配置的。
只是我现在迷惑的是32位系统只有4G的地址空间,如果系统中真的装有4G的RAM在32位方式下如何使用?要知道它需要把一部分地址空间映射给外设的。还有就是老的外设只支持映射到低地址空间的话,物理内存的起始地址又如何分配,它可以分段映射?
[ 本帖最后由 Cyberman.Wu 于 2008-7-8 00:00 编辑 ]
呵呵,我说的是有问题。其实我的意思是HOST给PCI设备进行编址的(高端地址),通过这个地址(PCI设备基地址),你才可以访问PCI设备寄存器和memory。这个是host的PCIC跟PCI device之间进行的。
最近又重新看了一些资料,有了一些更进一步的理解。对于配置寄存器不会按内存编址,因为它本来主要是在编址之前使用的,一般是通过bus+device+function来访问的(对于PCI是总线信号如何选择,而对于PCIe则是一个报文)。对于映射的内存,实际是层层编址的,即总体分配(传统的北桥或PCIe的RootComplex)一个,然后每一次的Brige中有一些寄存器组(Base/Limit)设置了下行接口的总线后面的设备所占用的地址空间范围,后面访问映射的空间时直接接地址层层往下寻址。我原来一直以前是北桥或RootComplex中能记录每一个设备中分配的地址空间,然后转换为bus+device+function呢,还说比较复杂,没看到说明。这种分配方式挺简单的,不过由于BAR申请的地址空间的对齐特性,浪费有可能比较明显。
欢迎交流。
PCIe 桥如果支持增强型配置访问,则会把配置空间映射到CPU的地址空间中。
这个在标准中看到了,好像所有PCEe设备会占用256M地址空间。不过Linux好像不支持这种方式,反正我没找到任何相关的操作。
不是所有,而且一条总线占用256M
另外这个跟OS无关,只跟PCIe RC实现相关。