Chapter 4: Address Space Transaction Routing

张开发
2026/4/14 1:01:10 15 分钟阅读

分享文章

Chapter 4: Address Space  Transaction Routing
Chapter 4: Address Space Transaction Routing书籍: PCI Express Technology 3.0 (MindShare Press, 2012)页码: Book Pages 121-168 | PDF Pages 180-227学习日期: 2026-04-12本章概要本章深入讲解地址空间与事务路由包括三种地址空间Memory/IO/Configuration、BARs设备如何请求地址空间、Bridge 的 Base/Limit 寄存器路由 TLPs、三种 TLP 路由方式ID/Address/Implicit Routing以及 Posted vs Non-Posted 事务。4.1 地址空间总览PCIe 支持与 PCI 完全相同的三种地址空间地址空间用途大小访问方式Configuration设备配置寄存器256B (兼容) 4KB (扩展)配置事务Memory内存映射外设寄存器可变 (32-bit 或 64-bit)Memory 事务I/O旧式外设寄存器32-bit (4GB), 通常只用 64KBI/O 事务Memory vs I/O 地址空间历史原因:早期 PC 使用 I/O 地址空间访问外设I/O 地址空间有诸多限制32-bit 限制访问效率低后来转向 Memory-Mapped I/O (MMIO)将外设寄存器映射到内存地址空间现代做法:新设备只使用 MMIOMemory 地址空间I/O 地址空间仅用于向后兼容 legacy 软件PCIe 规范实际上不鼓励使用 I/O 地址空间将来可能废弃4.2 Prefetchable vs Non-Prefetchable MemoryPrefetchable Memory (P-MMIO)两个关键属性:读取无副作用: 读取数据不会改变设备状态允许写合并 (Write Merging): 可以将多次写操作合并为一次为什么要预取?假设请求者要读 128 字节Completer 可以自作主张额外预取 128 字节如果请求者后续需要数据已在缓存中性能提升如果不需要丢弃即可因为读取无副作用例子: 视频内存、显示缓冲区 - 读取不会改变显存内容Non-Prefetchable Memory (NP-MMIO)特点:读取有副作用如读取自动清零的状态寄存器不能预取不能写合并例子: 硬件状态寄存器、DMA 控制寄存器为什么这个区别重要?PCI: 事务不包含传输长度bridge 需要猜测传输大小PCIe: 事务包含确切长度这个区别影响较小但为向后兼容保留4.3 Base Address Registers (BARs)BAR 的作用设备通过 BARs向系统报告自己需要多大的地址空间系统BIOS/OS通过 BARs分配地址空间给设备软件读取 BARs 了解设备需求写入 BARs 完成地址分配BAR 工作原理步骤:软件先向 BAR 写入全 1 (0xFFFFFFFF)软件读取 BAR 的值根据返回值确定设备需要的地址空间大小软件分配地址范围并将起始地址写入 BARBAR 示例 1: 32-bit Memory 请求原始 BAR 值设备硬连线: [Bit 0-3: 0x0 (表示 Memory, 32-bit, 不可预取)] [Bit 4-31: 设备自定义表示需要的地址范围] 写入全 1 后读取: Value 0xF000_0004 (设备只需要最低位为1的空间) 计算所需地址空间大小: ~0xF000_0004 1 0x1000_0000 256 MB 系统分配: 0xE000_0000 - 0xEFFF_FFFF (256 MB) 写入 BAR: BAR 0xE000_0000BAR 示例 2: 64-bit Memory 请求BAR[0] Bit 0 1 表示 64-bit 写入全 1 后读取: BAR0 0x0000_0004 BAR1 0xFFFF_FFFF ~0x0000_0004 1 0xFFFF_FFFC 1 0x10 16 MB 64-bit 地址意味着可以访问 64-bit 地址空间 实际分配需要 BAR0 BAR1 组成 64-bit 地址BAR 示例 3: I/O 请求BAR Bit 0 1 表示 I/O 空间 写入全 1 后读取: Value 0x0000_00FF 计算: ~0xFF 1 0x100 256 bytes重要规则所有 BAR 必须按顺序评估: 系统必须从 BAR0 开始依次检查BAR1 可能与 BAR0 组成 64-bit: 如果 BAR0 是 64-bit则 BAR1 不能单独使用Resizable BARs (PCIe 3.0): 设备可以支持多种尺寸的 BAR便于系统灵活分配4.4 Base and Limit Registers (Bridge 路由)Switch 内部结构Switch 内部包含多个 P2P Bridge每个 Bridge 有自己的 Base/Limit 寄存器负责路由 TLPsBase/Limit 寄存器对寄存器用途Memory Base / Memory LimitP-MMIO 地址范围I/O Base / I/O LimitI/O 地址范围Prefetchable Memory Base / Limit可预取 MMIO 范围路由过程TLP 进入 Switch Upstream Port ↓ 检查目标地址属于哪个地址范围 ↓ 匹配 Base/Limit 对 ↓ 路由到对应的 Downstream Port示例:Bridge 配置: Memory Base/Limit: 0xE000_0000 / 0xEFFF_FFFF (256 MB P-MMIO) Memory Base/Limit: 0xD000_0000 / 0xD0FF_FFFF (16 MB NP-MMIO) TLP 目标地址: 0xE010_0000 ↓ 匹配 Memory Base/Limit (E000_0000 - EFFF_FFFF) ↓ 从 Port 2 转发范围检查Bridge 的范围检查是闭区间[Base, Limit]。示例:Base 0xE000_0000 Limit 0xEFFF_FFFF 地址 0xE000_0000: 在范围内 ✓ 地址 0xEFFF_FFFF: 在范围内 ✓ 地址 0xD000_0000: 不在范围内 ✗4.5 TLP 路由基础三种路由方式路由方式用于路由依据ID RoutingConfiguration, Memory, IOBus/Device/Function (BDF)Address RoutingMemory, IO目标地址Implicit RoutingMessages消息类型广播接收方检查三种类型当 TLP 到达端口时接收方按顺序检查Address Routing?→ 是则检查地址是否匹配ID Routing?→ 是则检查 BDF 是否匹配Implicit Routing?→ 是则处理通常是消息4.6 ID Routing何时使用 ID RoutingConfiguration 请求Memory Read/Write某些场景Completion 返回ID 格式Bus Number (8 bits) | Device Number (5 bits) | Function Number (3 bits)Endpoint 处理 ID RoutingEndpoint 只检查自己的 BDF如果匹配则接收否则忽略Switch 处理 ID RoutingSwitch 上游端口检查设备是否在 Switch 下游Switch 下游端口检查设备是否直连该端口每个 Switch 端口检查两次4.7 Address Routing何时使用 Address RoutingMemory Read/Write 请求I/O Read/Write 请求32-bit vs 64-bit 地址32-bit 地址: TLP Header 32 位地址字段64-bit 地址: TLP Header 使用两个 32 位字段表示 64 位地址Endpoint 处理 Address RoutingEndpoint 检查自己的 BARs如果地址在某个 BAR 范围内则接收Switch 路由 Address Routing下游端口 (收到 TLP):检查地址是否在 Base/Limit 范围内 ↓ 是 → 转发到对应的下游端口 否 → 忽略上游端口 (收到 TLP):Switch 收到来自下游的 TLP ↓ 总是转发到上游端口 ↓ 因为地址路由不会反向发送4.8 Implicit Routing (隐式路由)何时使用 Implicit Routing仅用于消息 (Messages)消息类型消息类型隐式路由目的广播消息所有端口接收根 Complex 消息仅根 Complex 接收本地消息仅相邻端口接收Implicit Routing 字段消息 TLP Header 包含Type字段指示隐式路由类型。Switch 处理隐式路由消息消息进入 Switch ↓ 检查消息类型和隐式路由方式 ↓ 决定本地处理 / 广播 / 转发4.9 Split Transaction Protocol (分离事务)问题Non-Posted 事务长时间占用总线Memory Read 需要等待 Completer 返回数据期间总线空闲其他设备无法使用解决分离事务读请求阶段:Requester 发送 Memory Read RequestCompleter 准备数据Requester 释放总线其他设备可以使用Completer 申请总线Completer 返回 Completion with DataSplit vs Posted特性Split TransactionPosted Transaction需要 Response是否总线占用短仅请求时长数据写入完成效率高取决于写入大小4.10 Posted vs Non-PostedPosted 事务无需 Completer 返回状态直接完成总线快速释放示例: Memory Write, Message WriteNon-Posted 事务需要 Completer 返回完成状态包括所有读取 IO 写入 Configuration 写入示例: Memory Read, IO Read/Write, Configuration Read对比事务类型Posted?说明Memory Write✅Posted无需响应Message Write✅Posted广播消息Memory Read❌Non-Posted需要数据返回IO Read/Write❌Non-PostedConfiguration Read/Write❌Non-PostedCompletion❌Non-Posted返回给请求者4.11 DLLPs 和 Ordered Sets 不路由DLLPs只在相邻端口的 Data Link 层之间传输不穿越 Switch/RC每个端口独立处理 DLLPsOrdered Sets只在相邻端口的 Physical 层之间传输用于链路训练、时钟补偿、功耗管理不进入 Transaction Layer为什么这样设计?DLLPs 和 Ordered Sets 是本地链路管理用的只需要相邻设备知道不需要穿越整个 fabric关键知识点速记MMIO vs I/O: 现代设备只用 MMIOI/O 空间仅为兼容Prefetchable Memory: 读取无副作用可预取和写合并BARs 工作方式: 写入全 1 → 读取确定大小 → 分配地址 → 写入 BAR64-bit BAR: BAR0 Bit 0 1且 BAR0 BAR1 组成 64-bit 地址Base/Limit: Bridge 路由 TLP 的依据闭区间 [Base, Limit]三种 TLP 路由: ID Routing (BDF)、Address Routing (地址)、Implicit Routing (消息)Posted 无需响应(Memory Write, Message Write)Non-Posted 需要 Completion(所有读取、IO、配置)DLLPs/Ordered Sets 隔壁设备专用不过 SwitchSplit Transaction: Read 请求分两阶段总线利用率高思考题为什么 Prefetchable Memory 必须满足读取无副作用如果读取有副作用会怎样BAR 的大小计算~Value 1的原理是什么为什么 Switch 处理 Address Routing 时上游端口收到的 TLP 总是转发而不是检查地址为什么 PCIe 要区分 Posted 和 Non-Posted 事务这个设计对性能有什么影响DLLPs 和 Ordered Sets 为什么不路由到 Transaction Layer如果它们穿越 Switch 会发生什么问题笔记结束

更多文章