Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。












想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

上个月关闭。



Improve this question




我试图了解PCI网段(域)与多个主机桥之间的关系?

有人说多个PCI域对应于多个主机网桥,但有人说这意味着在单个主机网桥下有多个根网桥。我很困惑,在PCI SIG基本规范中找不到很多有用的信息。

我想知道

(1)假设我在MCFG中设置了3个PCI域,是否有3个连接3个CPU和总线的主机桥,或者我有3个支持3倍时间总线但都在一个CPU中共享一个公共(public)主机桥的根桥?

(2)如果我有多个主机桥(或根桥),这些桥是否共享一个公用的南桥(例如ICH9),或者它们有单独的桥?

我是一个初学者,谷歌并没有解决我的很多问题。如果有人可以给我一些提示,我将不胜感激。

最佳答案

使用的措辞令人困惑。
我将尝试通过对PCI和PCI Express技术的简短而不完整的总结来修正术语。
跳到最后一部分以阅读答案。

PCI接口(interface)

Conventional PCI bus(以下称为PCI)是围绕bus topology设计的:共享总线用于连接所有设备。

为了创建更复杂的层次结构,某些设备可以用作网桥:网桥将PCI总线连接到另一个辅助总线。
辅助总线可以是另一条PCI总线(该设备称为PCI-to-PCI bridge,此后称为P2P)或其他类型的总线(例如PCI-ISA桥)。

这将创建以下形式的拓扑:

           _____          _______
----------| P2P |--------| P2ISA |-------------  PCI BUS 0
           ‾‾|‾‾          ‾‾‾|‾‾‾
-------------|---------------+-----------------  ISA BUS 0
             |
-------------+---------------------------------  PCI BUS 1

非正式地,每个PCI总线称为一个PCI段。
在上图中,显示了两个部分(PCI BUS 0和PCI BUS 1)。

PCI定义了三种事务类型:内存,IO和配置。
假定前两个是必需的知识。
第三个用于访问每个设备的配置地址空间(CAS)。在此CAS中,可以对设备进行元配置。
例如,它在系统内存地址空间中的映射位置。

为了访问设备的CAS,设备必须是可寻址的。
在电气上,将PCI总线段中的每个PCI插槽(集成或未集成)连接在一起,以创建由以下三个部分组成的寻址方案:设备(0-31),功能(0-7),寄存器(0-255) 。
每个设备最多可以具有七个逻辑功能,每个逻辑功能具有256字节的CAS。

在上面的三元组中添加了一个总线号,以唯一地标识整个总线拓扑中的设备(不仅限于总线网段内)。
该四元组称为ID地址。
重要的是要注意,这些ID地址是由软件分配的(但对于设备部分则由布线固定)。
它们是合乎逻辑的,但是建议从根开始对总线进行顺序编号。

CPU本身不会生成PCI事务,因此需要主机桥。
它是一个桥接器(概念上是主机到PCI的桥接器),可让CPU执行PCI事务。
例如,在x86情况下,主机桥接器会将未被其他代理(例如,内存,内存映射的CPU组件,旧式设备等)回收的任何内存写入或IO写入传递到PCI总线。
为了生成CAS事务,x86 CPU将IO端口0xcf80xcfc写入(第一个包含ID地址,第二个包含要读取/写入的数据)。

CPU可以拥有的不仅仅是主机桥,没有什么可以阻止它的,尽管这种情况非常罕见。
一个系统更有可能具有多个CPU,并且每个主机都集成了一个主机桥,因此系统可以具有多个主机桥。

对于PCI,每个主机桥都建立一个PCI域:一组总线段。
PCI域的主要特征是它与其他PCI域是隔离的:不需要在域之间路由事务。

操作系统可以根据需要分配每个PCI域的总线号,它可以重复使用总线号或按顺序分配它们:
          NON OVERLAPPING                 |            OVERLAPPING
                                          |
Host-to-PCI        Host-to-PCI            |  Host-to-PCI        Host-to-PCI
 bridge 0           bridge 1              |   bridge 0           bridge 1
                                          |
   |                  |                   |     |                  |
   |                  |                   |     |                  |
  BUS 0   |         BUS 2    |            |    BUS 0   |         BUS 0    |
   |      |           |      |            |     |      |           |      |
   +------+           +------+            |     +------+           +------+
   |      |           |      |            |     |      |           |      |
   |      |           |      |            |     |      |           |      |
   |      BUS 1       |      BUS 3        |     |      BUS 1       |      BUS 1

不幸的是,PCI域一词在Linux内核中也有含义,它用于为每个主机桥编号。
就PCI而言,这是可行的,但是随着PCI Express的引入,这变得令人困惑,因为PCI Express具有自己的“主机桥号”(即PCI网段组)名称,而PCI域一词则表示PCI的下游链接。 PCI Express根端口。

PCI Express

PCI Express bus(以下称为PCIe)是围绕point-to-point拓扑设计的:一个设备仅连接到另一个设备。

为了保持软件兼容性,广泛使用了虚拟P2P桥。
PCI总线的基本组件是设备和桥接器,而PCIe的基本组件是设备和交换机。
从软件的 Angular 来看,什么都没有改变(但增加了新功能),并且总线的枚举方式相同:使用设备和桥接器。

PCIe交换机是设备之间的基本粘合剂,它具有n个下游端口。
交换机内部有一个PCI总线段,在内部总线段中为每个端口创建了一个虚拟P2P桥(存在虚拟形容词,因为每个P2P仅响应CAS事务,对于PCI兼容软件就足够了)。
每个下游端口都是一个PCIe链接。
PCIe链接被视为PCI总线段;这检查以下事实:交换机的每个下游端口都有一个P2P桥接器(交换机总共有1 + n PCI总线段)。
交换机还有一个端口:上游端口。
就像下游端口一样,但它使用减法解码,就像网络交换机一样,它用于接收来自“逻辑外部网络”的流量并路由未知目的地。

cpu - PCI段(域)与多个主机桥(或根桥)有何关系?-LMLPHP

因此,交换机需要1 + N + 1 PCI段总线。

设备直接连接到交换机。

在PCI的情况下,网桥将CPU连接到PCI子系统,因此逻辑上期望交换机将CPU连接到PCIe子系统。
使用PCI复合根(PCR)的情况确实如此。
从根本上说,PCR是一种具有重要意义的交换机:每个端口都建立一个新的PCI域。
这意味着不需要将流量从端口1路由到端口2(当然是在交换机上)。
如前所述,这给Linux术语带来了转变,因为Linux为每个主机桥或PCR分配了一个域名,而按照规范,每个PCR具有多个域。
长话短说:同一个词,不同的含义。
PCIe规范使用PCI段组一词来定义每个PCR的编号(简单地说,PCI段组是每个PCR的扩展CAS机制的基地址,因此本地存在一对一的映射)。

由于其隔离特性,PCR的端口称为PCIe根端口。

注意

根桥一词在规范中不存在,我只能在UEFI Root Bridge IO Specification中找到它作为主机桥和PCR的总称(因为它们承担相似的职责)。

主机桥也以主机适配器的名称命名。

最后你的问题



如果您有3个PCI域,则有3个主机桥接或3个PCIe根端口。

如果在PCI域中,您是指PCI总线,就PCI总线段而言(与它们的隔离程度无关),那么您可以让一个主机桥/ PCR处理具有3个总线的拓扑,也可以让多个主机桥/ PCR处理一个总线。 3辆巴士的组合。
在这种情况下,没有特殊要求,因为您可以看到可以将总线与桥级联。

如果希望不隔离总线(因此不要成为PCI域),则需要单个主机桥或单个PCIe根端口。
一组P2P桥(真实的或虚拟的)会将总线连接在一起。



桥接平台早在几年前就已淡出,现在我们已将集成到CPU中的系统代理公开了一组PCIe通道(通常为20个以上)和一个平台 Controller 中枢(PCH),该通道通过DMI链接连接到CPU。
PCH也可以集成到与CPU相同的插槽中。
从软件 Angular 看,PCH公开了更多的通道,这些通道似乎是从CPU PCR中获得的。

无论如何,如果您有多个主机桥,它们通常位于不同的插槽上,但是通常只有一个南桥可以同时容纳它们。
但是,这是(并非强制)严格执行的。
现代的英特尔C620 PCH可以在仅端点模式(EPO)下运行,在该模式下,它不用作主要PCH(具有固件和启动职责),而是用作一组PCIe端点。

这个想法是,主机桥只是将CPU事务转换为PCI事务,这些事务的路由取决于总线拓扑,这本身就是一个非常有创意的主题。
集成此拓扑的组件是另一项创造性的任务,最终,可以为每个主机桥分配单独的芯片,或者同时在所有甚至两者之间共享(或分区)一个大的单个芯片!

关于cpu - PCI段(域)与多个主机桥(或根桥)有何关系? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49050847/

10-11 18:44