PCIe的ATS和PRS

在 PCIe(高速外设互联)协议中,ATS ​ 和 PRS ​ 是一对协同工作的机制,主要用于解决 I/O 设备 DMA 内存访问​ 的效率与灵活性问题。它们让设备(如网卡、GPU)能像 CPU 一样使用虚拟地址,并处理"缺页"异常。

核心概念速览

缩写 全称 中文 核心职责 类比理解
ATS Address Translation Services 地址转换服务 "查字典":将虚拟地址(VA)翻译成物理地址(PA)。 相当于设备端的 MMU/TLB
PRS Page Request Services 页请求服务 "要内存":当翻译失败(页不在内存)时,请求系统调入页面。 相当于设备端的 缺页中断

机制深度解析

1. ATS (Address Translation Services)

ATS 是 PCIe 规范(自 3.0 起)定义的基础服务,旨在降低 DMA 延迟减少 IOMMU 瓶颈

  • 工作原理

    1. 请求:PCIe 设备(Endpoint)在发起 DMA 前,如果不知道物理地址,会向 Root Complex(RC)发送 ATS 转换请求(ATR)。

    2. 翻译:RC 侧的 IOMMU/TA(转换代理)查询页表,返回物理地址及权限。

    3. 缓存 :设备将 虚拟地址 -> 物理地址的映射缓存到本地的 ATC(Address Translation Cache)中。

    4. 加速:后续访问同一页面时,设备直接查 ATC,无需经过 IOMMU,极大提升了效率。

  • 解决的问题

    • 避免每次 DMA 都经过 IOMMU 查表,减轻主机侧压力。

    • 支持设备直接使用虚拟地址(IOVA),便于与 CPU 共享地址空间(SVA)。

2. PRS (Page Request Services)

PRS 是构建在 ATS 之上的扩展机制,用于处理内存换页(Paging)场景。它允许设备访问被换出到磁盘的内存。

  • 触发条件

    当设备发起 ATS 请求时,IOMMU 发现该虚拟地址对应的物理页不在内存中(缺页),返回一个"转换失败"或"页不存在"的响应。

  • 工作流程

    1. 请求 :设备收到 ATS 失败后,发送 Page Request Message​ 给主机,说明"我需要这个页"。

    2. 换入:主机 OS 执行缺页处理,将数据从磁盘换入物理内存,并建立页表映射。

    3. 响应 :主机通过 Page Response Message​ 通知设备"页已就绪"。

    4. 重试:设备重新发起 ATS 请求,获取新的物理地址,完成 DMA。

  • 核心价值

    • 取消 Pinning:传统 DMA 必须锁定(Pin)内存以防被换出。PRS 允许内存换页,大幅提升系统内存利用率。

    • 支持共享虚拟内存:设备可以和 CPU 进程共享同一虚拟地址空间,即使该内存被换出也能恢复。

两者关系与依赖

  • 依赖关系 :PRS 必须依赖 ATS 存在。设备必须先通过 ATS 尝试翻译,才能触发 PRS 流程。ATS 是基础,PRS 是补充

  • 协同流程

    设备 DMA -> 查本地 ATC(Miss)-> 发 ATS 请求 -> IOMMU 返回缺页 -> 发 PRS 请求 -> 主机换页 -> 重试 ATS -> 成功 DMA

应用场景与硬件要求

  • 典型场景

    • 高性能计算:GPU 或智能网卡(SmartNIC)需要直接访问用户态虚拟内存。

    • 虚拟化:SR-IOV 场景下,虚拟机内的设备直接访问宿主机内存。

    • 大内存服务器:避免因 DMA 锁定大量物理内存导致系统僵死。

  • 硬件支持

    • 设备端(EP):必须支持 ATS 和 PRS 能力,并内置 ATC 缓存。

    • 主机端(RC):CPU/芯片组需支持 IOMMU(如 Intel VT-d, AMD-Vi)且驱动支持 PRS 处理。

简单来说,ATS 负责"快",PRS 负责"活"。ATS 让设备 DMA 更快,PRS 让设备 DMA 更灵活,不再受限于物理内存锁定。

相关推荐
Java搬码工6 小时前
CompletableFuture 完整详解 + 全场景使用案例
java
许心月6 小时前
Java学习资料网站汇总
java
程序员JerrySUN6 小时前
Jetson 刷机深度解析:flash.sh vs l4t_initrd_flash.sh(含安全与磁盘加密对比)
linux·网络·arm开发·安全·系统安全
c238566 小时前
第二篇:《测试指挥官:可视化单题自测框架(含 assert 实操)》
java·数据库·c++·算法·安全性测试
我科绝伦(Huanhuan Zhou)7 小时前
MySQL极端场景数据丢失防护:从Crash-Safe到异地备份
数据库·mysql
辞旧 lekkk7 小时前
【Redis初阶】常见数据类型
开发语言·数据库·c++·redis·学习·缓存·bootstrap
视觉AI7 小时前
VS Code Remote-SSH 连接Jetson踩坑完整解决记录(网段不通+主机密钥变更双重故障)
运维·网络·人工智能·windows·ssh·边缘计算
帅次7 小时前
Kotlin 与 Java 互操作:混合工程里的平台类型与 API 边界
java·开发语言·kotlin·suspend·nullable
明志数科7 小时前
人形机器人格斗场景下的技术挑战:动力学控制、感知融合与实时决策
网络·数据库
酉鬼女又兒7 小时前
零基础入门 DeepSeek V4 Pro API 开发:从环境搭建、消息格式规范到翻译函数实战、少样本提示、多轮对话聊天机器人与常见报错全流程详解指南
大数据·网络·数据库·人工智能·macos·机器人·github