PCI 与 PCIe 区别详解

PCI 与 PCIe 区别详解

本文从规范演进、物理拓扑、事务模型、配置空间、中断与电源管理、Linux 内核视角等方面对比 经典 PCI(含 PCI-X)PCI Express(PCIe)。不涉及某一芯片厂的寄存器级细节;规范细节请以 PCI Local Bus SpecificationPCI Express Base Specification 为准。


1. 概述与命名

术语 常见所指
PCI Peripheral Component Interconnect,传统 并行 局部总线(33/66 MHz,32/64 bit)。
PCI-X PCI 并行总线的扩展,更高时钟与拆分事务;物理上与 PCI 槽位/信号形态相近,仍属「并行 PCI 家族」。
PCIe / PCI Express PCI-SIG 定义的 串行、点对点、分组交换 继任架构;与 PCI 在电气与链路层不兼容,通过 互连。

口语中「PCI 插槽」在现今 PC/嵌入式上 多数是 PCIe;真正的 并行 PCI 在新平台上已罕见。


2. 物理层与电气特性

2.1 并行 PCI / PCI-X

  • 多根并行数据线 + 地址线 + 控制线,公共参考时钟。
  • 共享介质:同一时刻总线上通常只有一个事务主导设备。
  • 频率上限信号skew、反射、负载 制约,难以持续推高(典型 33 MHz / 66 MHz,PCI-X 可到更高 MHz 但仍是并行瓶颈)。
  • 连接器:较长插槽、大量引脚(经典 PCI 金手指)。

2.2 PCIe

  • 差分对串行链路:每条 Lane 为一对发送 + 一对接收(TX+/TX−、RX+/RX−)。
  • 链路宽度×1、×2、×4、×8、×16(多 Lane 绑定同链路)。
  • 编码:Gen1/2 常用 8b/10b;更高代数常用 128b/130b,提高有效带宽。
  • 嵌入式时钟 recovery,利于提高速率与 PCB 走线
  • 连接器:较短的金手指(PCIe)、M.2、U.2 等也是 PCIe 电气封装的一种形态。

2.3 带宽直觉(量级)

PCIe 单 Lane 每代比特率大致翻番(规范表格可查);实际吞吐量还受 编码开销、协议头、链路开销 影响。并行 PCI 的总带宽 远低于 当代 PCIe ×4 以上链路。


3. 拓扑结构

3.1 PCI:共享总线段(multi-drop)

1
2
3
CPU — Host Bridge —+—— Dev A
+—— Dev B
+—— PCI-PCI Bridge —— 下游总线段 …
  • 同一 PCI bus segment 上多个设备 电气并联
  • 仲裁:谁占用总线由仲裁逻辑决定。
  • 桥(Bridge) 分隔 不同 PCI bus number,扩展拓扑。

3.2 PCIe:交换/fabric(点对点)

1
2
CPU — Root Complex — Root Port —[Link]— Endpoint
— Switch Upstream — Switch Downstream Port —[Link]— Endpoint
  • 链路两端点对点:无「同一电气总线上挂十几个设备」的形态。
  • Switch 提供 多下游端口,内部用 包交换 转发。
  • Bus/Device/Function(BDF) 仍用于 软件编号,但 物理连接链路 + 路由,不是一根并行线。

4. 事务与协议模型(概念对比)

4.1 PCI:基于周期的总线事务

  • 典型阶段:仲裁 → 地址 →(可选)数据多次传送 → 结束
  • Memory Read/Write、IO Read/Write、Configuration Read/Write 等在 并行信号时序 上体现。
  • 中断:传统 INTx 边带信号线(INTA#…),多个设备可线与共享。

4.2 PCIe:分层封包(Packet)

典型分层概念(与 OS 驱动日常工作远近不一):

层级(概念) 作用(简述)
物理层 Lane、电气、编码、链路训练(LTSSM)。
数据链路层 DLLP、ACK/NAK、重传、credits,链路可靠传输。
事务层 TLP(Transaction Layer Packet):Memory、IO、Configuration、Message 等;相当于 把 PCI 事务语义打成包在链路上传

要点:软件仍读写 MMIO/配置空间,仿佛「仍是 PCI」;底层已由 TLP + Credit 替代并行周期。


5. 配置空间

5.1 共同点(兼容内核枚举)

  • 256 字节标准配置头(Type 0 设备 / Type 1 桥)布局 一脉相承:Vendor ID、Device ID、Command、Status、BAR、Capability Pointer 等。
  • OS 枚举第一步仍是 读 Vendor/Device(Linux 见 pci_scan_device / pci_bus_read_dev_vendor_id)。

5.2 PCIe 扩展差异

特性 经典 PCI PCIe
扩展配置空间 有限或依赖具体主机实现 常见 4 KB/function(ECAM 映射)。
PCIe Capability 链路能力/状态(速度、宽度、ASPM 位等)。
扩展能力 较少 MSI/MSI-XAERSR-IOVACSPASID 等更丰富。

6. BAR、内存/IO 与 DMA(软件观感)

6.1 相似之处

  • 设备通过 BAR 请求 Memory 或 I/O 空间;操作系统分配 CPU 可见物理地址(或 No-MMIO 特殊情况)。
  • DMA:仍需关心 地址宽度、一致性、IOMMU;语义上仍是「设备 ↔ 内存」。

6.2 PCIe 侧额外关注点

  • Payload Size(MPS/MRR)Read Completion Boundary 等影响大包拆分与性能。
  • ACS/P2PATS(地址翻译服务) 等多见于服务器 GPU/NVMe 组网场景。
  • PCIe-to-PCI 桥 会带来 地址窗口与 prefetch 行为差异(驱动偶尔需 quirk)。

6.3 BAR 是什么、谁在「控制」这块空间

BAR(Base Address Register) 位于配置空间 Header(Type 0 设备一般为 BAR0–BAR5),用来声明设备需要主机映射的 MemoryI/O 窗口的大小与属性。

角色 做什么
硬件(设备) 提供 类型位(Memory / IO、32/64-bit、prefetch 等)与 位数编码(通过 sizing 暴露长度);上电或复位后 BAR 未必已是最终 CPU 物理地址。
固件/操作系统 在枚举阶段 探测长度计算对齐、把 总线可路由地址 写回 BAR;必要时配置上游 桥的 Memory/IO 窗口,令访问能落到正确下游。
驱动 通常依赖 pci_enable_device() 之后 pci_resource_start() / ioremap() 使用 BAR;一般 不应随意改写已由内核分配好的 BAR(除非平台文档明确要求且整套资源一致更新)。

要点:「BAR 空间」本质是一段主机地址空间与配置空间里 BAR 字段的对应关系控制权在枚举与资源分配流程(BIOS/UEFI + Linux pci_bus/pci_dev 资源树),设备只声明需求。

6.4 BAR 探测(Sizing)与大小编码

枚举时常用流程(规范语义,具体实现在 drivers/pci/probe.c 等与 pci_bus_read_dev_vendor_id 之后的 BAR 编程路径):

  1. 向 BAR 写入全 1(或规范允许的试探写)
  2. 读回:低位中为 1 的位表示 可修改(参与译码);结合 类型位 解码 最小对齐 / 空间大小(IO 与 Memory、32/64-bit BAR 规则略有差异)。
  3. 64-bit Memory BAR 占用 相邻两个 BAR 寄存器(低 dword + 高 dword);探测时需 成对处理。
  4. 写入真实基址 后再启用 PCI_COMMAND_MEMORY / PCI_COMMAND_IO(命令寄存器),设备才开始对该窗口译码。

这与 并行 PCI 与 PCIe 在配置头层面是一致的;差别主要体现在 CPU 侧如何访问配置空间(IO 端口间接索引 vs ECAM/MMIO),而不是 BAR 位域定义本身。

6.5 分配、对齐与「空间从哪来」

  • 对齐:BAR 大小天然等于 最小对齐边界(例如 64 KB 窗口须对齐到 64 KB);内核分配时需满足 pci_probe_bar / pci_assign_resource 等路径中的对齐约束。
  • 地址池:来自 主机桥 / Root Complex 声明的 PCIe Memory / IO 范围(设备树 rangespci-host-generic 资源或 ACPI);桥设备(Type 1) 还有 Base/Limit 寄存器把上游大窗口 裁剪 给下游总线。
  • Prefetchable vs Non-prefetchable Memory:影响处理器缓存策略与桥合并窗口行为;显卡大块 framebuffer 常为 prefetchable,MMIO 控制寄存器 常为 non-prefetchable。
  • I/O BAR:在 x86 上仍有意义;许多 ARM/RISC SoCpci=noio 或对 IO 范围声明为空, effectively 只使用 MEM BAR

6.6 Linux 中与 BAR 相关的常用接口(观感)

接口 / 概念 含义
pci_enable_device() 分配 IRQ、映射资源(含 BAR)并使能设备命令位中的 MEM/IO(配合电源状态)。
pci_resource_start(len/flags) 得到某 BAR 在 CPU 物理地址域 的起始与长度、IORESOURCE_MEM/IORESOURCE_IO 等标志。
devm_pci_remap_cfg_resource()(控制器侧) RC 驱动映射 ECAM/配置窗口,与 设备 BAR 是不同概念:前者访问 配置空间,后者是 设备寄存器/内存窗口
pci_release_regions() / request_region 独占或协调与其它驱动的资源冲突(视场景)。

Endpoint(EP)侧若在 Linux 里扮演 pci_epc,则由 pci_epc_ops.set_bar 等把 SoC 本地物理地址 写进 EP 硬件 BAR 译码(与 RC 枚举「主机分配总线地址」方向相反但语义对应)。

6.7 PCI / PCIe 在 BAR 上的结论句

  • 配置头布局与 BAR sizing 规则:PCI 与 PCIe 同一套软件模型
  • 物理实现:PCIe 通过 Memory Read/Write TLP 访问映射后的地址;并行 PCI 用 总线周期。对驱动而言,BAR 仍是 MMIO/PIO 入口
  • 复杂拓扑:经过 Switch / 桥 时,BAR 背后可达性依赖 各级窗口与路由;调试「读 BAR 挂死」常需同时查 链路、桥窗口、对齐与 COMMAND 位

7. 中断

方式 PCI PCIe
INTx 必选硬件线(分时共享) 常以 Message 模拟(Virtual Wire Message),减少专用引脚
MSI / MSI-X 后期可选 极为普遍;MSI-X 适合高队列设备(网卡、NVMe)

Linux 中 pci_alloc_irq_vectors 一类 API 主要面向 MSI-X;纯 legacy PCI 设备仍可能只用 INTx


8. 错误处理与可靠性(简要)

  • PCI:parity/error 线与状态位为主,系统级错误模型相对简单。
  • PCIeAER(Advanced Error Reporting)ECRC链路误码检测与恢复、根端口 错误上报 等更完备;Linux drivers/pci/pcie/aer.c 等与 RAS 挂钩。

9. 电源管理

  • PCI:PME、D 状态等已有基础。
  • PCIe:除传统 PCI PM 外,强调 链路级 ASPM(L0s/L1/L1.1/L1.2…);与 ACPI _PRT/OSCI 协同更常见。

内核 drivers/pci/pcie/aspm.c 即 OS 侧策略控制示例。


10. 热插拔与外形规格

  • 并行 PCI:热插依赖机箱 控制器 + 专有驱动(厂商方案多)。
  • PCIe:规范层面定义 Slot Capabilities / Slot Status,配合 pciehp 等做 原生热插(视平台固件与布线)。

外形:PCI 长槽 vs PCIe 各类长度(×16 显卡槽、×1 开口槽)、M.2 Key M(NVMe)等均为 PCIe 链路封装变化。


11. PCI-X 是什么(避免混淆)

  • 仍是并行 PCI 电气家族的增强:更高性能、拆分事务等。
  • 不是 PCIe:勿把 「PCI-X」读成「PCIe ×」。
  • 新系统设计几乎不再采用并行 PCI-X。

12. Linux 内核视角(与 RK3588 文档衔接)

  • 统一子系统drivers/pcipci_bus_typestruct pci_devpci_driver 同时服务 PCI 与 PCIe
  • 枚举配置空间访问(ECAM 或 SoC 自定义窗口);PCIe 设备同样挂在 pci 总线上
  • PCIe 特有逻辑:集中在 drivers/pci/pcie/(ASPM、AER、端口服务、pciehp 等)。
  • 判定pci_is_pcie(pdev)、读 PCIe Capability;Rockchip 等平台主机控制器多为 PCIe Root Complex,枚举路径仍走 pci_host_probe

13. 互连与兼容桥

  • PCIe-to-PCI(或 PCI-X)桥:允许 旧并行设备出现在 PCIe 拓扑下游,配置仍是 PCI 模型。
  • Root Complex Integrated Endpoint:片上 「逻辑 PCIe 设备」无独立插槽。

14. 对照总表

维度 PCI(并行) PCIe
介质 并行共享总线 串行点对点链路
拓扑扩展 Bridge 分段 Root Port / Switch / Endpoint
时钟 公共总线时钟 链路嵌入式时钟
典型带宽扩展 升频/位宽受限 加 Lane + 代数
配置空间 256B 头为主 256B 兼容 + 扩展 + PCIe Cap
传输抽象 总线周期 TLP + 链路层可靠传输
中断 INTx 线为主 Message / MSI-X 为主流
电源 PCI PM PCI PM + ASPM
物理连接器 经典 PCI 长槽 PCIe / M.2 等

15. 延伸阅读(本仓库 linuxDoc/pci

文档 关联
rk3588-kernel-6.1-pci总线架构分析.md Linux PCI 枚举与 RK Host
rk3588-kernel-6.1-drivers-pci-pcie端口与子系统模块说明.md PCIe 端口服务(AER/ASPM 等)

16. 修订记录

日期 说明
2026-05-08 初版:PCI/PCI-X/PCIe 多维对比与内核衔接
2026-05-08 §6 增补 BAR 空间控制:角色分工、sizing、分配对齐、桥窗口、Linux 接口与 RC/EP 对照

文章互动

阅读 --

留言

0 条留言

正在加载留言…