输入“/”快速插入内容

总线 & PCIe 总线

2024年12月21日修改
2024年2月9日创建
2290
2395
Summary
总线带宽 (bit/s) = 频率 * 位宽
PCIe 是高速串行总线,差分信号。
采用端到端的连接方式,一条链路只能接 2 个设备。
一条 PCIe 链路,可以包含多个 lane。1, 2, 4, 8, 12, 16, 32。
一般来说,当系统上电后,host会自动查询PCIE设备枚举以获取总线拓扑结构。除一些特殊系统外,普通的系统只会在开机阶段进行设备的扫描,启动成功后,即枚举过程结束后,即使插入一个PCIE设备,系统也不会再去识别它。
PCIe在现代x86体系中除了传统的连接外部设备(真的有硬连线)的作用,更多的是充当IP粘合剂的作用,并不存在符合PCIe总线标准的硬连线。
Chip 内的 IP 之间,需要相互暴露接口。本质就是一组寄存器,准确的说是 CSR(Control and Status Register)。接下来唯一的问题是这些CSR如何暴露给带内内核了。在<b>ARM传统体系中</b>,这些CSR往往作为MMIO映射到地址空间中,某个IP CSR MMIO起始地址在SOC设计地址规划阶段就需要定下来,定好后一般后期不能改变。在<b>x86体系中</b>,传统上,南桥的设备映射到PCIe地址空间中,而北桥和CPU内部的设备映射到MMIO中。但后期随着北桥的功能被移入CPU,和CPU中加入越来越多的IP,传统做法让MMIO地址冲突越来越严重。更重要的是,MMIO的映射关系不是PnP的,也就是不可以枚举的,而是在ACPI中列举的,这在系统整合和SKU越来越多的时候,造成很大麻烦。为什么不和南桥设备一样,统一映射到PCIe地址空间呢?
Intel的架构师也有一样的想法,如果我们仔细跟踪Intel CPU中设备CSR的映射关系,就会发现有越来越多的设备IP从MMIO空间移入了PCIe空间(配置寄存器空间或者BAR上),有了自己的Device和Func号。在BIOS启动阶段设备甚至比在操作系统阶段可以看到的设备多得多,很多不需要终端用户关心的设备在启动最后阶段被隐藏了。那么这种迁移是如何做到的呢?是不是通过在芯片内部连接了无数PCIe总线呢?
并不是。这要归功于IOSF(Intel On-Chip System Fabric)总线,它提供Die内backbone Fabric(可以跨DMI),将各个IP整合在一起。IOSF总线包括两种接口(Interface):Primary Interface和Sideband Interface。主接口提供PCIe抽象,方便各个IP CSR映射到PCIe空间中;而简化的旁路接口是传统的index/value接口,提供轻量级的访问,方便一些简单的IP的CSR映射到带外IO空间中,缺点是速度慢。
借助于IOSF总线,大量的集成IP通过Primary Interface将自己的CSR暴露给带内CPU,从而在独立和互操作上取得平衡。它们在软件逻辑上,看起来和PCIe没有什么不同,其实原理大不相同。<b>正因为这样,我们今天,才能在x86 PC和服务器中,看到如此多的PCIe设备,它们不仅仅是传统的外部PCIe设备,还有很多是抽象的内部IP。
PCI-to-PCI桥规范是理解PCI体系结构的基础
常见总线
抛开PCIe不谈,如果我们设计一种板间通信的总线协议,我们关注的点至少有:
总线带宽
成本开销
信号完整性
可扩展性
从系统模块的角度,总线系统主要由 2 大部分组成:
1.
CPU 总线,又称为 FSB(Front Side Bus,前端总线)。
2.
PCI/PCIe 总线。
从功能实现上,可以分为 3 种总线类型:
1.
数据总线:用于在 CPU 与 Main Memory 或 I/O 设备之间传输数据。
2.
地址总线:用于在 CPU 与 Main Memory 或 I/O 设备之间传输地址信息。
3.
控制总线:用于在 CPU 与 Main Memory 或 I/O 设备之间传输控制信号。
Bus
Year
ISA
Industry Standard Architecture
1981
1984
8位的ISA提供了4.77MB/s的带宽(或传输率)
16位ISA第二代提供了8MB/s的传输率
第一代 IBM PC XT机型上(1981)