PCIe PRI(Page Request Interface)技术详解

张开发
2026/4/10 9:51:24 15 分钟阅读

分享文章

PCIe PRI(Page Request Interface)技术详解
PCIe PRIPage Request Interface技术详解1. PCIe PRI 概述PRIPage Request Interface页面请求接口是 PCIe 协议中地址翻译服务ATS的重要组成部分属于 Page Request Services页面请求服务功能范畴。PRI 与 IOMMUI/O Memory Management Unit、ATCAddress Translation Cache协同工作共同实现虚拟化环境下的高效地址翻译与内存页面管理。在虚拟化场景中当 PCIe 设备Endpoint通过 DMADirect Memory Access访问主机内存时访问的地址是 IOVAI/O Virtual AddressI/O 虚拟地址。IOMMU 负责将 IOVA 翻译为物理地址PA。ATC 作为 PCIe 设备本地的翻译缓存缓存最近使用的地址翻译条目Page Table Entries减少对 IOMMU 的翻译请求。PRI 则在 ATC 未命中cache miss且对应页面不在内存中时由设备主动向系统发起页面请求保证 DMA 操作继续进行。2. 与相关技术的关系2.1 ATSAddress Translation Services地址翻译服务ATS 是 PRI 的上一层协议框架定义了 PCIe 设备与 IOMMU 之间地址翻译的通信机制。ATS 主要实现以下功能限制损坏的或错误的 DMA I/O function 的破坏性——通过 IOMMU 实现地址隔离与访问保护提供 Scatter/Gather 支持——支持非连续物理地址的高效 DMA在不需要的情况下将 MSI/MSI-X 中断消息重定向到不同地址区间虚拟化支持——允许多个虚拟机共享同一 PCIe 设备ATS 机制的核心前提处理器系统RC 侧必须支持 IOMMU。只有 RC 支持 IOMMU 时PCIe 设备EP才能启用 ATS 机制。2.2 ATCAddress Translation CacheATC 是 PCIe 设备EP上的一块本地缓存用于存储最近使用的地址翻译条目。当设备发起 DMA 请求时首先在 ATC 中查找对应的翻译结果命中Hit直接使用缓存的翻译结果无需向 IOMMU 发起请求延迟最低未命中Miss向 IOMMU 发起地址翻译请求同时可能触发 PRI 流程2.3 PRSPage Request Services页面请求服务PRS 是 ATS 中的一个子功能专门用于管理 ATS 使用的页面申请。当设备因 ATC 未命中而访问的页面不在内存中被换出到磁盘时设备通过 PRI 向系统软件发起页面请求系统将页面调入内存后再通知设备重试访问。三者关系ATS 定义通信框架ATC 提供本地缓存加速PRS 定义页面请求机制PRI 是 PRS 的核心接口。3. PRI 工作原理3.1 页面请求场景在以下场景中PRI 机制发挥关键作用虚拟机场景下Guest OS 将部分内存页面换出到磁盘SwapPCIe 设备发起 DMA 访问地址在 ATC 中未命中IOMMU 查询页表发现对应 IOVA 的物理页面不在内存中如果设备不具备 PRI 能力该 DMA 访问将失败可能导致系统错误或数据丢失3.2 PRI 流程标准协议流程步骤1DMA 请求发起PCIe Device --MRd/MWrIOVA-- PCIe Switch/RC步骤2ATC 查询Device 本地 ATC 查询翻译缓存命中 -- 直接使用缓存翻译 -- 访问物理内存未命中 -- 进入步骤3步骤3IOMMU 地址翻译PCIe RC/IOMMU 查询 IOVA -- 页表页表条目有效PTE Present -- 翻译地址 -- 访问物理内存页表条目无效页面不在内存 -- 进入步骤4步骤4设备发起 Page RequestPR消息PCIe Device --Page Request TLP-- IOMMU/RCPR TLP 包含Requester ID (BDF)、IOVA、Page Request Code步骤5系统软件处理IOMMU 向 OS/VMM 报告页面错误OS 将所需页面从磁盘调入物理内存更新页表清除相关 TLB/ATC 条目步骤6系统响应OS/VMM --Completion-- PCIe Device告知设备页面已就绪可以重试 DMA步骤7DMA 重试PCIe Device --MRd/MWr重试-- 物理内存成功访问3.3 Page Request TLP 格式Page Request TLP 的 Header 格式如下基于 PCIe 事务层 TLP Header字段位置Byte说明Fmt[2:0]Byte 0[7:5]TLP 格式0b010 3DW 带数据0b000 3DW 无数据Type[4:0]Byte 0[4:0]类型字段标识为 Page RequestTC[2:0]Byte 1[6:4]Traffic Class优先级THByte 1[0]TLP Processing HintTDByte 2[7]TLP DigestECRCEPByte 2[6]Poisoned DataAT[1:0]Byte 2[1:0]Address Type0Translate1UntranslatedLength[9:0]Byte 2[9:0] Byte 3数据长度DWRequester IDByte 8~9设备 BDFBus:Device:FunctionTagByte 10~11事务标签用于匹配 CompletionIOVA [63:32]Byte 12~15IOVA 高 32 位64b 地址时IOVA [31:0]Byte 16~19IOVA 低 32 位PRG Index/PasidByte 20~23页面请求组索引 / PASIDPage Request CodeByte 22请求类型Started/Response/Stopped3.4 Page Request CodePRCPRC 值含义描述0b00Page Request Started开始一个新页面的请求0b01Page Request Continued页面请求继续需要多个 TLP 完成一个大页0b10Page Request Response系统对页面请求的响应由 RC 发送给设备0b11Reserved保留3.5 PRI 与 ATS 的协同PRI 和 ATS 在同一个扩展能力结构ATS Extended Capability中配置和管理。标准流程如下设备启用 ATS 时同时使能 PRI如果需要页面请求支持每个 DMA 访问首先经过 ATC 查询ATC miss 时向 IOMMU 请求翻译IOMMU 反馈页面不在内存时设备通过 PRI 发送 Page Request TLP系统响应后设备清除 ATC 中陈旧条目重新发起 DMA 访问4. PCIe 配置空间中的 PRI 支持4.1 ATS/Pri Extended Capability 结构在 PCIe 扩展配置空间中ATS Capability ID 为 0x000B包含 ATS 和 PRI 的配置与状态寄存器。字段偏移位宽说明ATS Capability Header0x0016bCapability ID 0x000B, 版本 1ATS Control0x0416b使能位、STUSmallest Translation Unit等ATS Status0x0616b状态信息PRI Capability Header0x0816bPRI Capability ID 0x000CPRI Control0x0C16bPRI 使能、最大 OS 页面请求数等PRI Status0x0E16bPRI 状态页面请求响应码4.2 PRI Control RegisterOffset 0x0C位字段名说明15:8Max_OS_Req操作系统最大可处理页面请求数7:5Reserved保留4PRI_EnablePRI 使能位1使能0禁用3:0Reserved保留4.3 PRI Status RegisterOffset 0x0E位字段名说明15:13Response_Type页面请求响应类型12:8PRG_Response_Code页面请求组响应码7:5Reserved保留4Busy设备忙标志系统响应前不应接收新请求3:0Reserved保留5. 实际使用场景与注意事项5.1 典型使用场景PRI 主要在以下场景中使用SR-IOV 虚拟化场景多个 VFVirtual Function共享同一 PCIe 物理设备每个 VF 都有独立的 IOVA 空间需要 IOMMU ATS PRI 协同工作高性能计算HPC加速器设备如 GPU、FPGA通过 DMA 访问大量内存内存页面可能被换出PRI 保证 DMA 访问的连续性NVMe SSD支持 SR-IOV 的 NVMe 设备通过 VF 向不同虚拟机提供存储服务每个 VF 的 DMA 访问需要 ATS PRI 保证隔离和正确性智能网卡SmartNIC多个虚拟机共享网卡资源每个 VM 的 IOVA 需要 IOMMU 翻译页面换出时由 PRI 恢复5.2 启用 PRI 的前提条件PRI 不能独立于 ATS/IOMMU 工作启用 PRI 必须满足RCRoot Complex支持 IOMMUIntel VT-d 或 AMD-ViRC 操作系统支持 ATS 和 PRILinux kernel 需要启用 IOMMU 和 ATSPCIe EP 设备支持 ATS 和 PRI通常通过 Synopsys、DWC 等 IP 实现设备驱动正确配置 ATS/Pri Capability 寄存器设备端 ATC 容量足够ATC 大小直接影响 PRI 触发频率5.3 注意事项与常见问题实际开发中需要注意以下问题ATC 与 PRI 的一致性当页面被换出后系统更新页表但设备 ATC 中仍保留旧的翻译条目。设备在收到 PRI 响应前必须确保不会使用陈旧的 ATC 条目。通常需要软件清除相关 ATC 条目。性能影响PRI 页面请求涉及磁盘 I/O页面调入延迟可能高达毫秒级。频繁的页面调入会严重影响 DMA 性能。建议对关键 DMA 缓冲区设置 pinned不可换出属性避免页面被换出。最大请求数限制PRI Control 寄存器中的 Max_OS_Req 限制了系统同时处理的页面请求数。如果设备发送过多未响应的页面请求可能导致 DMA 死锁。PRI 与 PASID 的结合在支持 PASIDProcess Address Space ID的系统中每个 DMA 请求带有 PASIDIOMMU 根据 PASID IOVA 定位正确的页表。PASID 与 PRI 协同使用实现进程级别的内存隔离。兼容性问题部分老旧的 PCIe 设备不支持 ATS/PRI这类设备在启用 IOMMU 的系统中可能遇到 DMA 访问问题需要 bounce buffer。5.4 软件配置流程参考 Linux# 1. 确认 IOMMU 已启用dmesg | grep -i iommu# 若未启用修改 kernel boot 参数intel_iommuon 或 amd_iommuon# 2. 确认设备支持 ATS/PRIlspci -s BDF -vvv | grep -A5 ATS# 查看 ATS Capabilities 和 PRI Capabilities 是否存在# 3. 在设备驱动中启用 ATS 和 PRI# 示例代码Linux Kernel DMA APIstruct pci_dev *pdev to_pci_dev(dev);# 使能 ATS设置 ATS Control Registerpci_enable_ats(pdev, ats_queue_depth);# 使能 PRI设置 PRI Control Registerpci_enable_pri(pdev, max_os_pages);# 4. DMA 映射时使用 IOMMUiova dma_map_single(pdev-dev, cpu_addr, size, DMA_TO_DEVICE);# 此时 DMA 地址为 IOVA经过 IOMMU 翻译后访问实际物理内存# 如果对应页面不在内存系统通过 PRI 机制通知设备6. 小结PCIe PRIPage Request Interface是虚拟化环境中确保 DMA 访问可靠性的关键机制。它与 ATS、ATC、IOMMU 共同构成了完整的地址翻译与页面管理框架。理解 PRI 的工作原理对于 PCIe 虚拟化功能的开发、调试和问题排查具有重要意义。在实际项目中需要确认 Synopsys PCIe IP 是否已配置 ATS 和 PRI 功能并在操作系统层面启用 IOMMU 支持同时确保设备驱动正确初始化相关寄存器。关注 ATC 与页表的一致性问题以及 PRI 触发时对 DMA 性能的影响是保证系统稳定运行的关键。

更多文章