尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

PCIe 基础与配置空间详解

PCIe 基础与配置空间详解 PCIe 基础与配置空间详解本文目录NVMe for PCIe 连载系列 (一)PCIe 基础与配置空间详解1. 前言为什么选择 PCIe 作为 NVMe 的基石2. PCIe 与常用总线的横向对比2.1 PCI vs. PCIe从并行到串行的进化2.2 常用总线维度对比表3. PCIe 拓扑结构简述4. PCIe 空间结构详解4.1 PCIe 配置空间的演进256B→ \rightarrow→4KB4.2 配置空间的访问与 ECAM 寻址机制BDF 寻址法ECAM 内存映射地址计算公式公式位移逻辑解析4.3 PCIe 配置空间寄存器布局 (Header)关键寄存器原理解析5. 总结与下章预告NVMe for PCIe 连载系列 (一)PCIe 基础与配置空间详解1. 前言为什么选择 PCIe 作为 NVMe 的基石在固态硬盘SSD主宰存储领域的今天NVMeNon-Volatile Memory Express非易失性内存主机控制器接口规范已经成为高速存储的代名词。然而NVMe 的超凡性能并非凭空而来它深度依赖于底层的硬件通道——PCIePCI Express。在传统机械硬盘时代SATASerial ATA总线与 AHCIAdvanced Host Controller Interface协议是绝对的主流。但随着 NAND 闪存技术的爆发闪存介质的读写速度从几百 MB/s 飙升至数 GB/sSATA 3.0 接口理论最大带宽 6Gbps实际极限约 600MB/s迅速沦为系统瓶颈。此外AHCI 协议仅支持单个命令队列Queue Depth 32根本无法发挥闪存多通道、并行读写的物理特性。为了打破这一瓶颈由行业巨头联合制定的 NVMe 协议横空出世。NVMe 抛弃了慢速的 SATA 通道转而直接连接到PCIe 总线。高带宽与可扩展性PCIe 采用多通道Lane设计支持 x1、x2、x4、x8、x16 等灵活的通道配置且随着 PCIe 世代演进Gen 3→ \rightarrow→Gen 4→ \rightarrow→Gen 5带宽成倍增长。极低延迟PCIe 总线直接挂载在 CPU 的根复合体Root Complex上NVMe 寄存器直接映射到 CPU 的物理内存空间MMIO。这种“直接对话”免去了传统存储架构中复杂的控制器转换使延迟降至微秒级。海量并行队列NVMe 协议原生支持多达 64K65536个队列每个队列可容纳 64K 个并发命令。这一恐怖的并发处理能力必须依赖 PCIe 的点对点高速数据传输机制才能得以释放。本连载系列将由浅入深从底层的 PCIe 硬件特性一路剖析至上层的 NVMe 协议细节。作为本系列的第一章我们将首先搞懂 PCIe 的基础知识及其至关重要的空间结构。2. PCIe 与常用总线的横向对比为了更直观地理解 PCIe 的设计先进性我们将其与传统的 PCI 总线以及存储领域常见的 SATA、外设领域常用的 USB 总线进行对比。2.1 PCI vs. PCIe从并行到串行的进化传统的PCIPeripheral Component Interconnect是一种共享并行总线。这意味着所有挂载在 PCI 总线上的设备共享同一组数据和地址线并且需要在同一时钟周期下同步工作。当设备增多时不仅总线仲裁延迟增加还会因为并行信号间的串扰Crosstalk和时钟偏斜Clock Skew导致工作频率难以提升通常限制在 33MHz 或 66MHz。而PCIe彻底颠覆了这一设计引入了点对点Point-to-Point串行差分总线。点对点拓扑每个 PCIe 设备独占一条物理链路连接到上游端口设备之间互不干扰消除了总线争抢。差分信号传输每个通道Lane由两对差分信号线组成Rx 发送对Tx 接收对采用低压差分信号LVDS技术抗干扰能力极强。嵌入式时钟PCIe 摒弃了传统的共享时钟线将时钟信息编码在数据流中如 Gen3 开始使用的 128b/130b 编码从而可以将工作频率提升到数 GHz。2.2 常用总线维度对比表下面汇总了 PCIe 与其他主流总线在拓扑、物理和传输性能上的核心差异维度PCIPCIe (Gen 4 x4 典型值)SATA 3.0USB 3.2 Gen 2x2拓扑结构共享总线 (Shared Bus)点对点 (Point-to-Point)点对点 (连接至 HBA/PCH)主从式星型拓扑 (Hub-Spoke)信号方式单端并行 (Single-ended Parallel)差分串行 (Differential Serial)差分串行 (Differential Serial)差分串行 (Differential Serial)传输模式半双工 (Half-Duplex)全双工 (Full-Duplex)半双工 (Half-Duplex)全双工 (Full-Duplex)最大吞吐速率133 MB/s (32-bit 33MHz)~7.88 GB/s (单向)600 MB/s (约 6 Gbps)2.5 GB/s (约 20 Gbps)典型延迟中等极低 (微秒级 / 纳秒级)较高 (受 AHCI 协议限制)高 (受软件轮询机制限制)核心应用场景早期显卡、声卡、网卡显卡、NVMe SSD、高速网卡机械硬盘、传统 2.5 SSD鼠标、键盘、外置移动硬盘通过上表可以清晰看出PCIe 在带宽与延迟上的绝对优势使其成为现代高速固态硬盘NVMe SSD的唯一合理选择。3. PCIe 拓扑结构简述在深入其空间结构前我们需要了解 PCIe 系统的骨架——拓扑结构。一个标准的 PCIe 拓扑呈树状结构主要由以下三个核心组件构成CPU / MemoryRoot Complex 根复合体PCIe LinkEndpoint 1: 显卡PCIe LinkSwitch 交换机PCIe LinkPCIe LinkEndpoint 2: NVMe SSDEndpoint 3: 10G 网卡Root Complex (RC根复合体)它是 PCIe 树的根部通常集成在 CPU 内部。RC 负责将 CPU 的系统总线如 Intel 的 UPI 或 AMD 的 Infinity Fabric与 PCIe 结构连接起来。它代表 CPU 发起配置事务Configuration Transaction、内存读写事务并管理整个 PCIe 树的系统资源分配。Switch (交换机)类似于以太网交换机PCIe Switch 用于扩展 PCIe 端口提供“扇出”Fan-out功能。它在内部进行数据包路由允许一个上游端口Upstream Port连接多个下游端口Downstream Port。Endpoint (EP终端设备)它是 PCIe 拓扑树的叶子节点是实际执行特定功能的硬件设备。NVMe SSD 就是典型的 Endpoint 设备。其他如 GPU、网卡等同样属于 Endpoint。4. PCIe 空间结构详解PCIe 空间结构是软件开发人员与硬件交互的桥梁。PCIe 继承并扩展了 PCI 的空间概念主要支持四大地址空间Memory 空间用于设备与主机之间的大量数据传输以及映射设备的内部控制寄存器MMIO。Configuration (配置) 空间专门用于系统软件BIOS、OS在引导和运行阶段自动识别、配置和管理设备。I/O 空间早期 x86 架构遗留的产物出于性能和地址空间限制的考虑在 PCIe 设备尤其是现代 NVMe中已被废弃或极力避免使用。Message 空间PCIe 特有的空间不通过传统地址线寻址而是通过带内数据包Message来传递中断如 MSI/MSI-X、错误报告和电源管理信号。对于驱动开发和 NVMe 控制器初始化而言配置空间Configuration Space是最为核心的基础。4.1 PCIe 配置空间的演进256B→ \rightarrow→4KB传统的 PCI 配置空间只有256 字节。这在早期功能单一的设备上尚显足够但随着现代硬件复杂度激增支持高级电源管理、MSI-X 多队列中断、虚拟化 SRI-OV 等256 字节显得捉襟见肘。为此PCIe 将配置空间扩展到了4096 字节4KB。其结构划分如下前 256 字节0x00 - 0xFFPCI 兼容配置空间PCI 3.0 Compatible Space。任何传统的 PCI 配置读取工具都可以正常访问这一区域保证了向后兼容性。后 3840 字节0x100 - 0xFFFPCIe 扩展配置空间PCIe Extended Configuration Space。用于存放 PCIe 特有的能力结构如 PCIe Express Capability、AER高级错误报告以及更复杂的 MSI-X 链表结构。--------------------------------------------- 0x000 | | | PCI 兼容配置空间 (256 字节) | | | --------------------------------------------- 0x100 | | | | | PCIe 扩展配置空间 (3840 字节) | | | | | --------------------------------------------- 0xFFF4.2 配置空间的访问与 ECAM 寻址机制在传统 PCI 时代CPU 访问 PCI 配置空间通常需要借助一对特殊的 I/O 端口CF8hCONFIG_ADDRESS和CFChCONFIG_DATA。这种机制被称为IO Access由于每次读写都需要两次 I/O 事务效率极低且不支持多线程并发访问。为了解决这一问题PCIe 引入了ECAMEnhanced Configuration Access Mechanism增强型配置访问机制在 x86 系统中也常被称为MMCFG。ECAM 的核心思想是将系统中所有 PCIe 设备的配置空间映射到一段连续 of 系统内存空间中。系统软件只需要像读写普通内存一样MMIO使用指针读写对应的物理内存地址RC根复合体就会自动将该内存访问请求转换为 PCIe 配置事务CfgRd/CfgWr TLP发送给目标设备。BDF 寻址法要精确定位一个 PCIe 设备或功能系统使用BDFBus, Device, Function三元组Bus Number (总线号)8 位支持最大 256 条总线0 ~ 255。Device Number (设备号)5 位每条总线最多支持 32 个设备0 ~ 31。Function Number (功能号)3 位每个物理设备内部最多支持 8 个独立的功能0 ~ 7即多功能设备Multi-Function Device。ECAM 内存映射地址计算公式当操作系统OS或内核驱动需要访问某个特定 BDF 设备中、偏移量为Register_Offset的寄存器时其对应的 CPU MMIO 物理地址计算公式如下PCIE_MMIO_Addr Base_Addr ( Bus ≪ 20 ) ( Device ≪ 15 ) ( Function ≪ 12 ) Register_Offset \text{PCIE\_MMIO\_Addr} \text{Base\_Addr} (\text{Bus} \ll 20) (\text{Device} \ll 15) (\text{Function} \ll 12) \text{Register\_Offset}PCIE_MMIO_AddrBase_Addr(Bus≪20)(Device≪15)(Function≪12)Register_Offset公式位移逻辑解析Register_Offset占用第 0 ~ 11 位共 12 位对应2 12 4 KB 2^{12} 4\text{KB}2124KB的设备配置空间大小。Function占用第 12 ~ 14 位共 3 位对应2 3 8 2^3 8238个功能。因为每个功能占 4KB所以左移 12 位。Device占用第 15 ~ 19 位共 5 位对应2 5 32 2^5 322532个设备。因为每个设备包含 8 个功能共占8 × 4 KB 32 KB 8 \times 4\text{KB} 32\text{KB}8×4KB32KB即左移 15 位。Bus占用第 20 ~ 27 位共 8 位对应2 8 256 2^8 25628256条总线。因为每条总线包含 32 个设备共占32 × 32 KB 1 MB 32 \times 32\text{KB} 1\text{MB}32×32KB1MB即左移 20 位。Base_Addr系统 BIOS 预留给 PCIe ECAM 的 MMIO 基地址例如常见的值为0xE0000000。有了这个公式OS 驱动程序就可以极速地、并发地读写任意 PCIe 设备的配置空间。4.3 PCIe 配置空间寄存器布局 (Header)每个 PCIe Function 的前 64 字节0x00 - 0x3F被称为Header。Header 的布局由Header Type寄存器偏移量 0x0E决定Header Type 0针对终端设备Endpoint如我们的 NVMe SSD。Header Type 1针对桥接设备PCI-to-PCI Bridge如 Switch 端口或 RC 根端口。下图展示了针对 NVMe SSDHeader Type 0的标准配置空间前 64 字节布局---------------------------------------------------------------------- (Offset) | Device ID (2B) | Vendor ID (2B) | 0x00 ---------------------------------------------------------------------- | Status (2B) | Command (2B) | 0x04 ---------------------------------------------------------------------- | Class Code (3B) |RevID | 0x08 -------------------------------------------------------------------- | BIST (1B) | Header Type(1B)| Latency Timer(1B| Cache Line Sz(1B| 0x0C -------------------------------------------------------------------- | BAR0 (4B) | 0x10 ----------------------------------------------------------------------- | BAR1 (4B) | 0x14 ----------------------------------------------------------------------- | BAR2 (4B) | 0x18 ----------------------------------------------------------------------- | BAR3 (4B) | 0x1C ----------------------------------------------------------------------- | BAR4 (4B) | 0x20 ----------------------------------------------------------------------- | BAR5 (4B) | 0x24 ----------------------------------------------------------------------- | CardBus CIS Pointer (4B) | 0x28 ---------------------------------------------------------------------- | Subsystem Device ID (2B) | Subsystem Vendor ID (2B) | 0x2C ---------------------------------------------------------------------- | Expansion ROM Base Address | 0x30 --------------------------------------------------------------------- | Reserved (3B) | Cap Pointer(1B) | 0x34 ---------------------------------------------------------------------- | Reserved (4B) | 0x38 -------------------------------------------------------------------- | Max_Lat (1B) | Min_Gnt (1B) | Interrupt Pin(1B| Interrupt Line | 0x3C --------------------------------------------------------------------关键寄存器原理解析Vendor ID Device ID (0x00 - 0x03)Vendor ID芯片厂商标识由 PCI-SIG 统一分配例如 Intel 为0x8086Samsung 为0x144D。Device ID厂商自定义的设备标识用来标识具体的芯片型号。系统软件通过读取这两个 ID 来匹配和加载对应的驱动程序。Class Code (0x09 - 0x0B)只读寄存器用于分类设备类型。对于标准的NVMe SSD其 Class Code 固定为010802h。Base Class 01h(Mass Storage Controller大容量存储控制器)Sub-Class 08h(Non-Volatile Memory非易失性存储)Programming Interface 02h(NVMe ControllerNVMe 接口)这种标准化的 Class Code 设计使得操作系统可以使用一个通用的 NVMe 驱动程序来管理和启动市面上所有品牌 and 型号的 NVMe SSD。Header Type (0x0E)Bit 7 指示该物理器件是否为多功能设备1 为多功能0 为单功能。Bit 6 ~ 0 指示 Header 布局类型00h 表示 Type 0 Endpoint01h 表示 Type 1 Bridge。Base Address Registers (BAR0 ~ BAR5偏移 0x10 - 0x27)BAR 是整个 PCIe 设备配置中最关键的寄存器。它决定了设备内部寄存器在主机内存空间MMIO或 I/O 空间中的映射位置。在 NVMe 控制器中BAR0 和 BAR1 通常会被合并组合成一个 64 位的基地址映射一段大小通常为 8KB 或 16KB 的内存空间。映射流程系统引导阶段软件向 BAR 写入全 10xFFFFFFFF然后读回。BAR 内部的特殊逻辑会使只读的低位保持为 0以此向软件宣告该设备所需的地址空间大小例如读回的值只留高位计算可知其需要 16KB 空间。操作系统根据该大小在物理内存中划分出一块未分配的连续物理地址区域例如0xFD000000。操作系统将该物理基地址写入 BAR0/BAR1。此后当 CPU 访问内存地址0xFD000000 - 0xFD003FFF时RC 会将访问请求转换为 TLP 包发送给 NVMe SSD直接读写 NVMe 控制器内部的硬件寄存器如 Submit Queue Tail Doorbell、Completion Queue Head Doorbell 等。Capabilities Pointer (0x34)这是一个链表的头部指针。因为 256 字节的兼容配置空间中剩下的空间非常零散PCI 引入了链表来挂载不同的“能力结构”Capability Structures。每一个 Capability 都有一个 ID表明功能如电源管理、MSI-X 中断、PCIe 自身的高级特性和指向下一个 Capability 偏移地址的指针。软件可以沿着这个链表依次遍历完成对设备各种高级特性的枚举与配置。5. 总结与下章预告本章中我们梳理了 NVMe 与 PCIe 之间相辅相成的物理纽带通过横向对比揭示了 PCIe 点对点串行差分结构在速度和延迟上的巨大优势。在此基础上我们进一步剖析了 PCIe 的树状拓扑网络并深入探讨了 PCIe 最为关键的地址空间与配置空间结构。借由ECAM 机制与BAR 映射CPU 能够以极高的效率控制包括 NVMe 在内的所有 PCIe 设备。在硬件配置空间被成功配置、BAR 被映射之后主机的 CPU 已经具备了与 PCIe 设备进行数据传输的通道。但是数据是如何在物理链路中传输的两端的设备又是如何保证数据传输不发生冲突的在下一章中我们将进入 PCIe 的底层协议栈详解PCIe 事务层与数据链路层机制深入分析 PCIe 报文TLP的传输流程以及基于信用额度Credit的流量控制机制Flow Control。敬请期待作者注本系列为深度硬件与协议层连载文章如果你对 PCIe 链路初始化、NVMe 队列机制、DMA 传输等底层细节感兴趣欢迎关注本系列专栏
返回列表