PCI:关于BAR的疑惑

发布于 2022-09-19 12:44:49 字数 1907 浏览 30 评论 0

本来是做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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

铁轨上的流浪者 2022-09-26 12:44:50

bios分配的,bios分配的

隔纱相望 2022-09-26 12:44:50

BIOS从host的RAM中分配?

你的他你的她 2022-09-26 12:44:50

是,是从HOST的RAM中分配的

浪推晚风 2022-09-26 12:44:50

原帖由 zt868 于 2008-6-28 13:30 发表
是,是从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 编辑 ]

凉城凉梦凉人心 2022-09-26 12:44:50

原帖由 Cyberman.Wu 于 2008-7-7 23:59 发表

我看了一下Linux下PCI-E显卡的一些信息,另外也看了一些资料,可以肯定它不是从RAM中分配的,只是占用系统总线上的地址空间而已,具体写这些映射到PCI上的空间实际上是北桥(或其后续的Root Complex)转换为 ...

呵呵,我说的是有问题。其实我的意思是HOST给PCI设备进行编址的(高端地址),通过这个地址(PCI设备基地址),你才可以访问PCI设备寄存器和memory。这个是host的PCIC跟PCI device之间进行的。

岁月如刀 2022-09-26 12:44:50

原帖由 zt868 于 2008-7-8 10:40 发表

呵呵,我说的是有问题。其实我的意思是HOST给PCI设备进行编址的(高端地址),通过这个地址(PCI设备基地址),你才可以访问PCI设备寄存器和memory。这个是host的PCIC跟PCI device之间进行的。

最近又重新看了一些资料,有了一些更进一步的理解。对于配置寄存器不会按内存编址,因为它本来主要是在编址之前使用的,一般是通过bus+device+function来访问的(对于PCI是总线信号如何选择,而对于PCIe则是一个报文)。对于映射的内存,实际是层层编址的,即总体分配(传统的北桥或PCIe的RootComplex)一个,然后每一次的Brige中有一些寄存器组(Base/Limit)设置了下行接口的总线后面的设备所占用的地址空间范围,后面访问映射的空间时直接接地址层层往下寻址。我原来一直以前是北桥或RootComplex中能记录每一个设备中分配的地址空间,然后转换为bus+device+function呢,还说比较复杂,没看到说明。这种分配方式挺简单的,不过由于BAR申请的地址空间的对齐特性,浪费有可能比较明显。

欢迎交流。

抠脚大汉 2022-09-26 12:44:50

PCIe 桥如果支持增强型配置访问,则会把配置空间映射到CPU的地址空间中。

森林散布 2022-09-26 12:44:50

原帖由 eRicBIN 于 2008-8-14 07:03 发表
PCIe 桥如果支持增强型配置访问,则会把配置空间映射到CPU的地址空间中。

这个在标准中看到了,好像所有PCEe设备会占用256M地址空间。不过Linux好像不支持这种方式,反正我没找到任何相关的操作。

不乱于心 2022-09-26 12:44:50

原帖由 Cyberman.Wu 于 2008-8-14 08:41 发表

这个在标准中看到了,好像所有PCEe设备会占用256M地址空间。不过Linux好像不支持这种方式,反正我没找到任何相关的操作。

不是所有,而且一条总线占用256M

另外这个跟OS无关,只跟PCIe RC实现相关。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文