
本文基于 PCI Express Base Specification Revision 6.0重点总结Access Control Services (ACS)和ACS Extended Capability。1. 概述1.1 定义ACSAccess Control Services是在 PCIe 拓扑中设置的一组访问控制点用来判断一个 TLP 应该正常路由或被阻断还是被重定向到上游 Root Complex 处理。ACS 适用于 Root Complex、Switch 和 Multi-Function Device 中的相关 Function。从行为上看ACS 不是单一开关而是一组硬件能力和软件可配置控制位。硬件通过 ACS Extended Capability 报告支持哪些控制机制软件再通过 ACS Control Register 启用对应功能。1.2 目的ACS 的核心目的是增强 PCIe 拓扑内的访问隔离尤其是控制 peer-to-peerP2P访问。没有 ACS 时两个位于同一 Switch 或同一设备内部的 Function 可能直接通信绕过 Root Complex、Translation Agent 或 IOMMU 之类的上游访问控制逻辑。启用 ACS 后系统可以让可疑或需要校验的 P2P Request 走上游路径由 Root Complex 进行验证也可以直接阻断不允许的访问并报告 ACS Violation。1.3 主要用途ACS 主要用于以下场景限制设备之间的 P2P 访问避免不受控的数据路径。支持虚拟化和设备直通场景中的隔离需求。配合 Translation Agent使来自虚拟机或设备的 DMA Request 经过地址翻译。通过 P2P Request Redirect、P2P Egress Control 等机制把访问控制决策集中到 Root Complex 或指定控制点。在发生非法访问时通过 ACS Violation、AER 日志和 Target Abort 状态帮助定位问题。下图展示了 ACS 在一个典型 Host、Root Complex、Switch、Endpoint 拓扑中的位置和作用图中的黄色节点表示 ACS 控制点。对于 EP A 到 EP B 的 P2P 访问ACS 可以允许其直接路由也可以将 Request 重定向到 Root Complex由上游验证逻辑决定是否转发到下游目标或者报告 ACS Violation。2. 适用对象ACS 不只等价于“桥端口属性”。它既可以是 Root Port、Switch Downstream Port 上的端口级控制也可以是 Multi-Function Device 内部的 Function 级控制用来覆盖可能绕过 Root Complex、Translation Agent 或 IOMMU 的 P2P/内部访问路径。对象实现或规范要求主要作用Root Port实现属性可以实现 ACS Extended Capability。P2P 支持要求如果支持与其他 Root Port 之间的 P2P traffic需要支持 P2P Request Redirect。RC 配合要求如果 Root Complex 支持 Redirected Request Validation还需要支持 Upstream Forwarding。控制不同 Hierarchy Domain 之间的 P2P 访问。被重定向到 Root Complex 的 Request 由内部验证逻辑决定是转发到目标还是阻断为 ACS Violation。Switch Downstream Port使用位置是 ACS 的重要控制点。基础机制实现 ACS Extended Capability 时需要支持 Source Validation、Translation Blocking、P2P Request Redirect、P2P Completion Redirect 和 Upstream Forwarding。ATS/P2P 相关机制需要支持 Direct Translated P2P。控制从某个下游端口进入 Switch 的上游 Request 是否允许访问其他下游端口、是否需要重定向上游或者是否作为违规访问处理。Switch Upstream Port归类属于 Multi-Function Device 中的适用 Function不按 ACS Downstream Ports 规则处理。实现属性可以实现 ACS Extended Capability。适用场景当 Switch Upstream Port 或其关联 Function 存在需要保护的 Function 级访问路径时使用。补充 Downstream Port 之外的 Function 级保护避免误解为 Switch Upstream Port 一定没有 ACS 属性。Multi-Function Device Function控制层级属于 Function 级 ACS不是桥端口级 ACS。适用 Function包括 Endpoint、Switch Upstream Port、Legacy Endpoint 和 RCiEP 等适用 Function。不适用机制Source Validation、Translation Blocking 和 Upstream Forwarding 不适用。按能力实现P2P Request Redirect、P2P Completion Redirect、P2P Egress Control 和 Direct Translated P2P 根据设备是否支持对应 P2P 或 ATS 能力决定是否实现。控制同一设备内部不同 Function 之间的 P2P 访问可以将 Function 间 Request 重定向到上游 Root Complex或者按 Function Number / Function Group 做细粒度控制。SR-IOV 设备模型归类SR-IOV capable 的单功能设备在 ACS 要求上按 Multi-Function Device 处理。原因启用 VF 后设备在隔离模型上等价于多个 Function。强制条件如果非 Root Complex 内的 SR-IOV 设备支持内部 P2P transaction则 ACS 是必需的。必需机制必须支持 ACS P2P Egress Control。控制 PF/VF 或 VF/VF 之间的直接访问路径满足虚拟化场景下的设备隔离需求。RCiEP实现属性可以实现 ACS但不是强制要求。局部实现同一个 Root Complex 内部允许只有部分 RCiEP 实现 ACS。风险来源RCiEP 虽然位于 Root Complex 内部但仍可能发起 DMA 或访问其他目标。替代保护对于没有 ACS Capability 的 RCiEP规范强烈建议 Root Complex 确保其访问先经过内部 Translation Agent。降低 RCiEP 发起访问绕过地址翻译或隔离逻辑的风险。3. 控制机制3.1 Source ValidationSource Validation 用于检查 Upstream 方向的 Request 的 Requester ID 是否合理。对于 Downstream Port它会检查 Requester ID 中的 Bus Number 是否属于该 Downstream Port 对应虚拟桥的 secondary side。判断方式可以包括Requester ID 是否落在 Secondary Bus Number 到 Subordinate Bus Number 的 bus aperture 内。如果实现并启用了 FPBRequester ID 是否通过 FPB Routing ID 机制被识别为该桥的 secondary side。如果检查失败该 Request 被报告为 ACS Violation。Completion 不受 Source Validation 影响。3.2 Translation BlockingTranslation Blocking 用于阻断携带非默认 Address TypeAT字段的 Upstream 方向的 Memory Request。启用后Downstream Port 检查每个 Upstream 方向的 Memory Request 的 AT 字段如果 AT 不是 default则报告 ACS Violation。该错误优先级高于 ACS Upstream Forwarding 和其他 P2P 控制机制。Completion 不受 Translation Blocking 影响。3.3 P2P Request RedirectP2P Request Redirect 控制 P2P Request 是否被重定向上游。在 Switch Downstream Port 中启用后P2P Request 必须被重定向到 Root Complex 方向。在 Root Port 中启用后P2P Request 会进入 Root Complex 内部的 Redirected Request Validation 逻辑。该逻辑可以决定将 Request 转发到原始目标或将其阻断为 ACS Violation。Downstream 方向的 Request 不会被 Downstream Port 通过该机制重定向。Completion 不受 P2P Request Redirect 影响。3.4 P2P Completion RedirectP2P Completion Redirect 用于避免 P2P Request 被重定向后造成 Completion 与 Request 的排序规则问题。启用后非 Relaxed Ordering 的 P2P Completion 需要被重定向上游如果 Completion 设置了 Relaxed Ordering则可以正常路由。P2P Completion Redirect 不参与 Request 的访问控制判断Request 也不受该机制影响。3.5 Upstream ForwardingUpstream Forwarding 用于处理已经被下游 ACS 组件重定向上游的 TLP。对于 Switch Downstream Port如果其 Ingress Port 收到一个 Upstream 方向的 Request 或 Completion且正常路由目标是该 Port 自己的 Egress Port则在启用 Upstream Forwarding 时必须继续向上游转发。对于 Root Port类似 TLP 会按 Root Port 自己重定向 Request 或 Completion 的方式处理。如果拓扑中启用了 P2P Request Redirect 或 P2P Completion Redirect相关路径上的 Root Port 和中间 Switch 通常需要支持 Upstream Forwarding否则对被重定向 TLP 的处理是未定义的。3.6 P2P Egress ControlP2P Egress Control 是可选机制用于更细粒度地控制哪些 P2P Request 可以到达哪些 Egress Port 或 Function。在 Switch 中它可以配置某个 Downstream Port 是否允许向其他 Downstream Port 发起 P2P Request。在 Root Complex 中它可以配置某个 Root Port / Hierarchy Domain 是否允许向其他 Root Port / Hierarchy Domain 发起 P2P Request。在 Multi-Function 或 SR-IOV capable 设备中它可以按 Function Number 或 Function Group 控制 Function 之间的 P2P 访问。P2P Egress Control 的判断发生在发送侧也就是 Ingress Port 或发送 Function。Completion 不受该机制影响。3.7 Direct Translated P2PDirect Translated P2P 与 ATS 场景相关。启用后如果 P2P Memory Request 的 AT 字段表示 Translated address则该 Request 必须直接路由到 peer Port 或 peer Function不受 P2P Request Redirect 和 P2P Egress Control 的影响。其他 P2P Request 仍然要接受 P2P Request Redirect 和 P2P Egress Control 的判断。Completion 不受 Direct Translated P2P 影响。需要注意的是如果 ACS Translation Blocking Enable 为 1则 ACS Direct Translated P2P Enable 被忽略因为 Translation Blocking 会优先阻断非 default AT 的 Upstream 方向的 Memory Request。3.8 I/O Request BlockingI/O Request Blocking 是 ACS Enhanced Capability 引入的机制。启用后Downstream Port Ingress 收到的 Upstream 方向的 I/O Request 必须作为 ACS Violation 处理。该机制用于扩展原始 ACS 对 Memory/P2P 访问之外的保护范围。3.9 DSP Memory Target AccessDSP Memory Target Access 控制 Upstream 方向的 Request 访问 Downstream Port 或 Root Port 相关 Memory BAR Space 时的处理方式。该控制可以选择直接访问目标阻断 Request将 Request 重定向上游。在 Switch 中所有 Downstream Port 都属于适用对象包括接收该 Request 的 Ingress Port 自身。在 Root Complex 中适用 Root Port 集合由实现决定但至少包括接收 Request 的 Root Port。3.10 USP Memory Target AccessUSP Memory Target Access 只适用于 Switch Downstream Port不适用于 Root Port。它控制 Upstream 方向的 Request 访问 Switch Upstream Port 相关 Memory BAR Space 时的处理方式。该控制同样可以选择直接访问、阻断或重定向。如果 Upstream Port 还关联了 Switch Upstream Port 之外的其他 Function则该字段不控制这些 Function 的 Memory BAR Space这些访问由对应 Function 自己的 ACS Extended Capability 控制。3.11 Unclaimed Request RedirectUnclaimed Request Redirect 适用于支持 ACS Enhanced Capability 的 Switch Downstream Port不适用于 Root Port。当一个进入 Switch Downstream Port Ingress 的 Request 落在 Switch Upstream Port 的 memory window 内但不属于 Switch 内任何 Downstream Port 的 memory window 或 Memory BAR Target 时如果启用 Unclaimed Request Redirect该 Request 被重定向上游离开 Switch如果未启用该 Request 由 Switch Downstream Port 按 Unsupported RequestUR处理。4. P2P 控制组合4.1 P2P Request 路径对每个 P2P RequestACS 可能让它进入三类处理路径正常路由到 peer 目标立即阻断并报告 ACS Violation重定向上游到 Root Complex由上游验证逻辑决定后续处理。P2P Completion 的重定向不由这些 Request 控制组合决定而是由 P2P Completion Redirect 独立决定。4.2 Direct Translated P2P 优先级如果某个 Port 或 Function 启用了 ACS Direct Translated P2P且 P2P Memory Request 的 AT 字段表示 Translated address则该 Request 必须直接路由到 peer Port 或 peer Function。这一路径优先于 ACS P2P Request Redirect 和 ACS P2P Egress Control。也就是说对于 Translated P2P Memory Request只要 Direct Translated P2P 生效Redirect 和 Egress Control 不再改变它的 P2P 路由。4.3 Redirect 与 Egress Control对于不受 Direct Translated P2P 覆盖的 P2P Request其处理由三个值共同决定EACS P2P Egress Control EnableRACS P2P Request Redirect EnableV与目标 Egress Port、Root Port、Function 或 Function Group 对应的 Egress Control Vector bit。ERVP2P Request 处理00X - Don’t Care直接路由到 P2P 目标01X - Don’t Care重定向上游101作为 ACS Violation 处理100直接路由到 P2P 目标111重定向上游110直接路由到 P2P 目标可以看出Egress Control Vector bit 为 1 时表示该目标受控。当 Redirect 未启用时受控目标会被阻断当 Redirect 启用时受控目标会被重定向上游。4.4 Egress Control VectorEgress Control Vector 是 ACS P2P Egress Control 的位图。它的大小由 ACS Capability Register 中的 Egress Control Vector Size 字段给出。对于 Root Port 和 Switch Downstream Port位图中的每一位对应一个 Port Number。对于 Multi-Function Device 中的 Function位图中的每一位对应一个或多个 Function Number或者在 ARI Function Group 模式下对应 Function Group Number。实现该 ACS Extended Capability 的 Function 自身对应的 bit 必须硬连为 0。对于 Root Complex如果某些 Port Number 表示内部 Port则对应 bit 也需要硬连为 0。4.5 Completion RedirectP2P Completion Redirect 只控制 P2P Completion不参与 Request 的 allow / block / redirect 决策。当启用 P2P Completion Redirect 时非 Relaxed Ordering 的 P2P Completion 会被重定向上游。其目的是让这些 Completion 与已经被重定向的 Posted Request 走一致路径从而避免 Completion 越过 Posted Request 造成 ordering violation。4.6 Ordering 影响ACS Redirect 会改变部分 TLP 的路径因此可能影响 PCIe ordering rules。一种典型风险是P2P Posted Request 被重定向上游而后续非 Relaxed Ordering 的 P2P Completion 仍直接路由导致 Completion 实际上越过了 Posted Request。P2P Completion Redirect 可以避免这种情况但会增加延迟并可能增加 Link 和 Root Complex 拥塞。另一种风险出现在 ACS P2P Request Redirect 和 ACS Direct Translated P2P 同时启用时Translated P2P Memory Request 直接路由而其他 P2P Request 被重定向两类 Request 可能走不同路径。软件只有在确认不会破坏正确性时才应同时启用这些机制。5. 错误处理5.1 Violation 触发场景ACS Violation 可以由硬件缺陷、软件配置错误或非法访问引起。常见触发场景包括Source Validation 检查 Requester ID 失败Translation Blocking 检测到非 default AT 的 Upstream 方向的 Memory RequestP2P Egress Control 判定某个 P2P Request 不允许直接访问I/O Request Blocking 阻断 Upstream 方向的 I/O RequestDSP / USP Memory Target Access 控制字段选择阻断Root Complex Redirected Request Validation 不允许某个被重定向的 Request。5.2 Non-Posted Request 处理当 ACS Violation 涉及 Non-Posted Request 时作为 Completer 的 ACS 组件必须返回一个 Completion并将 Completion Status 设置为 Completer AbortCA。虽然 Completion Status 使用 CA但错误日志应记录为 ACS Violation而不是普通 Completer Abort。这样软件可以区分真正的访问控制违规和一般完成器异常。5.3 AER 日志规范建议 ACS 组件实现 AER以便在出现 ACS Violation 时提供更好的故障定位能力。AER 的 Header Log 和 Prefix Log 可以记录违规 Request 的头部或前缀信息。ACS Violation Status、Mask 和 Severity 位可以明确标识该错误并控制错误是否被屏蔽以及按何种严重性上报。在 AER 的 Uncorrectable Error Status、Mask 和 Severity Register 中ACS Violation对应 bit 215.4 Target Abort发生 ACS Violation 时Completer 还需要设置其 Status Register 或 Secondary Status Register 中合适的 Signaled Target Abort 位。如果违规 Request 是 Non-Posted Request则 Requester 收到 CA Completion 后也需要设置对应的 Received Target Abort 位。在 Status Register 和 Secondary Status Register 中Signaled Target Abort对应 bit 11Received Target Abort对应 bit 125.5 RC Validation 失败通常情况下检测到 ACS Violation 的 ACS 组件也是 Completer。一个例外是 Root Complex 的 Redirected Request Validation 逻辑拒绝被重定向的 Request。如果该 Request 是通过 Root Port 重定向来的则对应 Root Port 作为 Completer。如果该 Request 来自 RCiEP则相关 Root Complex Event Collector 作为 Completer。6. ACS Extended Capability6.1 结构布局ACS Extended Capability 是 PCIe Extended Capability 链表中的一个可选 Capability用于报告和控制 ACS 功能。其 Capability ID 为000DhCapability Version 在 PCIe 6.0 中为1h。结构布局如下Offset内容00hACS Extended Capability Header04hACS Capability Register 与 ACS Control Register08hEgress Control Vector Register如果需要0Ch额外的 Egress Control Vector DWORD如果需要6.2 ACS Extended Capability HeaderACS Extended Capability Header 是标准 PCIe Extended Capability Header包含PCI Express Extended Capability IDACS 的 ID 为000Dh。Capability VersionPCIe 6.0 中必须为1h。Next Capability Offset指向下一个 Extended Capability若不存在则为000h。6.3 ACS Capability RegisterACS Capability Register 位于 offset04h用于只读报告硬件支持的 ACS 功能。Bit名称含义0ACS Source Validation支持 Source Validation1ACS Translation Blocking支持 Translation Blocking2ACS P2P Request Redirect支持 P2P Request Redirect3ACS P2P Completion Redirect支持 P2P Completion Redirect4ACS Upstream Forwarding支持 Upstream Forwarding5ACS P2P Egress Control支持 P2P Egress Control6ACS Direct Translated P2P支持 Direct Translated P2P7ACS Enhanced Capability支持 Enhanced Capability 相关机制15:8Egress Control Vector Size指示 Egress Control Vector 的 bit 数如果某功能对该 Function 类型不适用或者硬件未实现对应 capability bit 必须硬连为 0。若 ACS P2P Egress Control bit 为 0则 Egress Control Vector Size 字段未定义Egress Control Vector Register 不要求存在。6.4 ACS Control RegisterACS Control Register 位于 offset06h用于由软件启用或配置 ACS 功能。主要字段如下Bit名称作用0ACS Source Validation Enable启用 Requester ID bus number 检查1ACS Translation Blocking Enable阻断非 default AT 的 Upstream 方向的 Memory Request2ACS P2P Request Redirect Enable控制 P2P Request 是否重定向上游3ACS P2P Completion Redirect Enable控制非 RO P2P Completion 是否重定向上游4ACS Upstream Forwarding Enable转发由下游组件重定向上游的 TLP5ACS P2P Egress Control Enable结合 Egress Control Vector 控制 P2P Request6ACS Direct Translated P2P Enable允许 Translated P2P Memory Request 直接路由7ACS I/O Request Blocking Enable将 Upstream 方向的 I/O Request 作为 ACS Violation9:8ACS DSP Memory Target Access Control控制访问 Downstream Port / Root Port Memory BAR Space 的 Request11:10ACS USP Memory Target Access Control控制访问 Switch Upstream Port Memory BAR Space 的 Request12ACS Unclaimed Request Redirect Control控制未声明 Memory Space Request 是否重定向上游主要 enable bit 的默认值均为 0。如果某功能没有实现对应 control bit 必须硬连为 0 或作为保留位处理。DSP / USP Memory Target Access Control 的编码为编码含义00bDirect Request access enabled01bRequest blocking enabled10bRequest redirect enabled11bReserved6.5 Egress Control Vector RegisterEgress Control Vector Register 位于 offset08h在支持 ACS P2P Egress Control 时提供一个可读写 bit-array。bit-array 的长度由 Egress Control Vector Size 字段指定。对于任意 bitK其所在 DWORD offset 和 bit number 为DWORD offset 08h (K div 32) * 4 DWORD bit# K mod 32如果 bit-array 横跨多个 DWORD则后续 DWORD 从0Ch开始连续排列。超出 Egress Control Vector Size 指定范围的 bit 为保留位。在 ARI Device 中如果启用了 ACS Function Groups则前 8 个 Egress Control Vector bit 对应 Function Group Number而不是 Function Number。此时访问控制按 Function Group 粒度执行。7. 总结7.1 核心价值ACS 的核心价值是为 PCIe 拓扑提供可配置的访问控制点使系统能够判断 P2P Request 是直接路由、阻断还是重定向上游验证。将原本可能绕过 Root Complex 的设备间访问纳入可控路径从而提高系统隔离能力。7.2 隔离关系ACS 与系统隔离能力密切相关。对于虚拟化、SR-IOV、设备直通等场景软件通常需要确保设备发起的 DMA 或 P2P Request 不会绕过 Translation Agent、IOMMU 或 Root Complex 中的访问验证逻辑。ACS 通过 Source Validation、P2P Redirect、Egress Control、Translation Blocking 和 Enhanced Capability 机制覆盖 Requester ID、地址类型、P2P 目标、Memory BAR 访问和未声明地址区域等多个风险点。7.3 配置注意点配置 ACS 时需要注意以下问题ACS 硬件功能默认关闭需要 ACS-aware 软件启用。未实现的 capability 对应 control bit 不能被软件当作可用功能。P2P Request Redirect 依赖路径上的 Upstream Forwarding 支持否则重定向 TLP 的处理可能未定义。P2P Completion Redirect 可以解决部分 ordering 风险但会带来延迟和拥塞开销。Direct Translated P2P 能优化 ATS 场景下的性能但可能与 Redirect 组合产生不同路径导致的 ordering 风险。Enhanced Capability 扩展了对 I/O Request、Memory BAR 目标和 unclaimed memory request 的处理能力适合需要更完整隔离的系统。