一、拓扑结构
和PCI-X一样,PCIe链路是点对点的连接,而不是像传统PCI那样使用共享总线。这是由于其使用了非常高的传输速度。因此,链路只能连接两个接口,为了构建一个复杂的系统,必须采用某种方式来扩展连接。在PCIe中,这通过使用交换机(Switches)和桥接器(Bridges)来实现,它们允许系统拓扑结构的灵活构建,定义系统中各元素之间的连接方式。
二、系统组件
2.1 CPU
在PCIe拓扑结构中,CPU位于层级结构的顶部。与PCI类似,PCIe只允许使用简单的树状结构,意味着不允许出现环路或其他复杂的拓扑结构。这是为了保持与PCI软件的向后兼容性,PCI软件使用了简单的配置方案来跟踪拓扑,不支持复杂的网络环境。为了维持这种兼容性,软件必须能够以与之前相同的方式生成配置周期,并且总线拓扑必须与以前一样。因此,所有软件期望找到的配置寄存器仍然存在,并且它们的行为与以前一样。
2.2 RC
根复合体(Root Complex, RC)是PCIe架构中的一个关键组件,它是CPU与PCIe设备之间的接口,位于整个PCIe拓扑的“根部”。根复合体负责管理CPU与系统中其他PCIe设备之间的通信。它不仅是CPU访问PCIe设备的桥梁,还负责处理设备间的事务,并将各种总线和设备的连接整合在一起。
根复合体通常会包含多个子组件,例如处理器接口、内存控制器(如DRAM接口)等,并可能会支持多个PCIe端口(Root Ports),通过这些端口连接外部PCIe设备。从软件角度来看,根复合体内部的总线结构会被认为是一个标准的PCI总线,尽管实际上可能并不是物理的PCI总线,但它被设计为对软件呈现为PCI拓扑的一部分,以保持与旧版PCI软件的兼容性。
总体而言,根复合体不仅在物理上位于PCIe拓扑的顶部,而且在逻辑上也是整个PCIe系统的控制中心,它与系统中的所有PCIe设备建立连接,协调它们之间的通信。
2.3 交换机(Switches)和桥接器(Bridges)
交换机(Switches)和桥接器(Bridges)为系统提供了分支或聚合的能力,使更多的设备可以连接到单个PCIe端口。交换机的作用类似于数据包路由器,能够根据地址或其他路由信息识别数据包需要经过的路径。而桥接器则提供与其他总线(如PCI或PCI-X,甚至是另一条PCIe总线)的接口。在PCIe拓扑结构示例中,桥接器有时被称为“前向桥接器”,允许较旧的PCI或PCI-X卡插入新的系统中。相反的类型是“反向桥接器”,允许新的PCIe卡插入旧的PCI系统中使用。
2.4 Endpoints
在PCIe拓扑中,Endpoints是指非交换机或桥接器的设备,它们负责在总线上发起和完成事务。Endpoints位于树形拓扑的底部分支,并且只实现一个朝向根复合体的上行端口(Upstream Port)。相比之下,交换机可能有多个下行端口(Downstream Ports),但只能有一个上行端口。
三、与PCI(及PCI-X)的兼容
设备如果是为旧总线(如PCI-X)设计的,但现在配备了PCIe接口,则会在配置寄存器中将自己标识为“Legacy PCIe Endpoints”。这些设备可能使用PCIe标准中不再支持的功能,例如IO空间和IO事务,或者支持锁定请求。而“Native PCIe Endpoints”则是为PCIe架构从头设计的设备,而不是简单地给旧的PCI设备添加PCIe接口。Native PCIe Endpoints是内存映射设备(MMIO设备),不涉及旧的IO事务方式。
为了保持与旧版软件的兼容性,PCIe中的Endpoints和桥接器的配置头(Configuration Headers)与PCI中的保持一致。现在的区别在于桥接器通常会聚合到交换机和根复合体中,但旧版软件对此并不知晓,它们仍然会将这些设备视为桥接器。
如图所示,对比前面介绍的PCI的Header可以发现:PCIe的Header基本上与PCI的Header是一致的,只有少许差别。但是这些差别并不影响PCIe对PCI的兼容性(还有PCIe到PCI桥对其进行处理)。
在PCIe系统中,尽管实际的硬件拓扑可能非常复杂,但从软件的角度来看,系统的呈现方式依然较为简单。例如,在图2-8中展示的拓扑结构中,根复合体(Root)仍然位于层级结构的顶部。虽然根复合体内部可能非常复杂,通常会实现一个内部总线结构和多个桥接器来扩展多个端口的拓扑结构,但对配置软件来说,这个内部总线会表现为PCI总线编号为0,而PCIe端口则会显示为PCI到PCI桥接器。
虽然这个内部结构实际上不一定是物理的PCI总线,但为了保持与旧版软件的兼容性,它会以这种方式呈现给软件。这种内部设计不必符合任何通用标准,它可以根据不同供应商的具体需求来设计。因此,虽然内部的逻辑设计可以是供应商特定的,但在软件层面上,它依然会被认为是PCI总线结构的一部分。
类似地,图2-9中的交换机的内部组织在软件中也会显示为多个共享同一总线的桥接器集合。这种设计的一个主要优势是,它允许事务路由的工作方式与PCI中的相同。枚举(即配置软件发现系统拓扑并分配总线编号和系统资源的过程)也遵循相同的机制。一旦枚举过程完成,系统中的总线编号就会按照图2-9中的方式进行分配。
通过这种方式,软件可以轻松处理复杂的PCIe拓扑,而无需理解每个内部组件的具体设计。无论是根复合体内部的总线,还是交换机的多个端口,系统会通过与PCI相似的方式将其呈现给软件,使得传统的PCI枚举和配置流程能够继续使用。
四、PCIe 系统实例
图2-10展示了一个面向低成本应用(如PC)的PCIe系统示例。该系统实现了几个PCIe端口和一些扩展插槽,整体架构与旧式PCI系统并没有太大差别。相比之下,图2-11中展示的高端服务器系统包含了其他内置的网络接口。在PCIe早期发展阶段,有人曾设想让PCIe作为网络协议,替代那些传统的网络模型。毕竟,PCIe可以被视为一种简化版的网络协议,但由于多种原因,这一概念并未获得广泛应用,PCIe系统通常依旧通过其他传输方式连接外部网络。
此外,图2-11中的示例也为我们提供了重新审视根复合体(Root Complex)的机会。在这个示例中,标记为“Intel Processor”的部分包含了许多组件,这是大多数现代CPU架构的常见情况。该处理器包括一个用于连接图形设备的x16 PCIe端口和两个DRAM通道,这意味着内存控制器和一些路由逻辑已经集成到CPU封装中。通常,这些资源被称为“Uncore”逻辑,以区分它们和封装中的多个CPU核心及其相关逻辑。
既然我们之前提到根复合体是CPU与PCIe拓扑结构之间的接口,这意味着根复合体的一部分必须位于CPU封装内部。图2-11中虚线所示的区域表明,根复合体跨越了多个组件封装。这种设计在未来的系统中可能会更加普遍,表明根复合体将是一个分布在多个模块中的逻辑单元。
每个层原则上与链路另一端设备的对应层进行通信。上面的两层通过将一串比特组织成数据包来实现通信,形成一个可以被接收端相应层识别的模式。这些数据包通过其他层传递,最终到达链路的发送端或接收端。物理层也直接与另一设备的物理层通信,但方式有所不同。为了更好地理解这一点,我们可以先简单了解一下各层如何交互。
总体来说,设备发出的请求或完成数据包的内容首先在**事务层(Transaction Layer)中组装,这个过程基于设备核心逻辑提供的信息,这些信息有时也被称为软件层(虽然规范中没有使用这个术语)。这些信息通常包括所需命令的类型、目标设备的地址、请求的属性等。新创建的数据包会被存储在一个称为虚拟通道(Virtual Channel)**的缓冲区中,直到它准备好传递给下一层。
当数据包传递到数据链路层(Data Link Layer)时,会在数据包中添加额外的信息,以便在相邻的接收端进行错误检查,并且数据包的副本会在本地存储,以便在发生传输错误时能够重新发送。随后,数据包到达物理层(Physical Layer),在该层中,数据包会被编码并通过链路上所有可用的通道进行差分传输。
这种分层的通信机制确保每个层能够有效处理数据并确保数据在设备之间安全且可靠地传输。