PCI 与 PCIe 区别详解
本文从规范演进、物理拓扑、事务模型、配置空间、中断与电源管理、Linux 内核视角等方面对比 经典 PCI(含 PCI-X) 与 PCI Express(PCIe)。不涉及某一芯片厂的寄存器级细节;规范细节请以 PCI Local Bus Specification 与 PCI 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 | CPU — Host Bridge —+—— Dev A |
- 同一 PCI bus segment 上多个设备 电气并联。
- 仲裁:谁占用总线由仲裁逻辑决定。
- 桥(Bridge) 分隔 不同 PCI bus number,扩展拓扑。
3.2 PCIe:交换/fabric(点对点)
1 | CPU — Root Complex — Root 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-X、AER、SR-IOV、ACS、PASID 等更丰富。 |
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/P2P、ATS(地址翻译服务) 等多见于服务器 GPU/NVMe 组网场景。
- PCIe-to-PCI 桥 会带来 地址窗口与 prefetch 行为差异(驱动偶尔需 quirk)。
6.3 BAR 是什么、谁在「控制」这块空间
BAR(Base Address Register) 位于配置空间 Header(Type 0 设备一般为 BAR0–BAR5),用来声明设备需要主机映射的 Memory 或 I/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 编程路径):
- 向 BAR 写入全 1(或规范允许的试探写)。
- 读回:低位中为 1 的位表示 可修改(参与译码);结合 类型位 解码 最小对齐 / 空间大小(IO 与 Memory、32/64-bit BAR 规则略有差异)。
- 64-bit Memory BAR 占用 相邻两个 BAR 寄存器(低 dword + 高 dword);探测时需 成对处理。
- 写入真实基址 后再启用
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 范围(设备树
ranges、pci-host-generic资源或 ACPI);桥设备(Type 1) 还有 Base/Limit 寄存器把上游大窗口 裁剪 给下游总线。 - Prefetchable vs Non-prefetchable Memory:影响处理器缓存策略与桥合并窗口行为;显卡大块 framebuffer 常为 prefetchable,MMIO 控制寄存器 常为 non-prefetchable。
- I/O BAR:在 x86 上仍有意义;许多 ARM/RISC SoC 将
pci=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 线与状态位为主,系统级错误模型相对简单。
- PCIe:AER(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/pci下pci_bus_type、struct pci_dev、pci_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 对照 |
正在加载留言…