SR-IOV、ATS、PRI、PASID 与 IOMMU 虚拟化
1. 能力边界
这些机制解决的问题不同:
| 机制 | 作用 |
|---|---|
| SR-IOV | 一个 Physical Function 在硬件中创建多个 Virtual Function |
| ATS | 设备缓存 IOMMU 地址翻译结果 |
| PRI | 设备遇到缺页时向系统发 Page Request |
| PASID | 在同一 Requester ID 下区分多个进程地址空间 |
| IOMMU | 做 DMA 地址翻译、权限与隔离 |
| VFIO | 把隔离后的设备安全交给用户态/VMM |
drivers/pci实现 PCI Capability 管理,不实现完整 IOMMU 或 VFIO;后两者分别位于drivers/iommu和drivers/vfio。
2. SR-IOV 数据模型
PF 的 SR-IOV Extended Capability 描述:
- TotalVFs、InitialVFs、NumVFs;
- First VF Offset 与 VF Stride;
- VF Device ID;
- VF BAR;
- VF Enable、VF MSE、ARI 等控制位。
VF 的 BDF 由 PF Routing ID 加 offset/stride 计算。VF 是可匹配普通pci_driver的pci_dev,但配置空间和资源由 PF/SR-IOV 能力约束。
3. 启用主链
iov.c关键入口:
pci_enable_sriov():1119 行;sriov_enable():633 行;pci_iov_add_virtfn():315 行;pci_disable_sriov():1136 行;sriov_disable():754 行。
流程可概括为:
1 | PF driver 或 sysfs sriov_numvfs |
禁用时必须先确认 VF 未被占用,再逆序移除 VF、关闭 VF Enable,并释放关联关系。
4. PF 驱动职责
硬件仅提供 VF 机制,PF 驱动仍要:
- 实现
sriov_configure或调用pci_enable_sriov(); - 分配队列、doorbell、MSI-X 等共享资源;
- 配置 VF MAC/VLAN/权限;
- 提供 PF↔VF mailbox;
- 在 remove、AER、suspend 前妥善关闭 VF。
PCI Core 不理解网卡或加速器的内部资源,因此“VF 已出现在 lspci”不等于 VF 可以正常收发。
5. VF BAR 与桥窗口
VF BAR 表示整组 VF aperture。固件未为其预留足够空间时,启用会失败。可检查:
- PF SR-IOV Capability 中 VF BAR 大小;
- Root Port/桥窗口;
- 64 位 prefetchable window;
pci=realloc=on与CONFIG_PCI_REALLOC_ENABLE_AUTO;- BAR 是否被其它资源冲突占用。
6. ATS
ats.c中:
pci_enable_ats():56 行;pci_disable_ats():94 行;pci_restore_ats_state():109 行。
ATS 允许设备的 Address Translation Cache 保存 IOVA→PA 翻译。页大小参数必须与 IOMMU 支持一致。撤销映射时,IOMMU 和设备 ATC 必须完成失效同步,否则设备可能继续使用旧权限。
7. PRI
关键入口:
pci_enable_pri():196 行;pci_disable_pri():242 行;pci_reset_pri():295 行。
PRI 允许设备提交 Page Request,从而支持可缺页共享虚拟内存。启用前要求 IOMMU、设备和上层驱动都能处理请求队列、超时及终止,不能仅设置 Capability 位。
8. PASID
关键入口:
pci_enable_pasid():361 行;pci_disable_pasid():407 行;pci_pasid_features():460 行。
PASID 将进程/地址空间标签随事务携带。它与 SVA 的安全边界依赖 IOMMU:设备可发出的 PASID 范围、绑定生命周期和进程退出必须同步。
9. 安全顺序
设备直通或共享虚拟地址时应遵循:
1 | 建立 IOMMU domain 与映射 |
顺序错误可能让设备 DMA 到已释放或已重新授权的内存。
10. RK3588 适用性
RK3588 Root Complex 驱动存在并不代表板载控制器或终端设备支持 SR-IOV/ATS/PASID。还需同时满足:
- Endpoint 暴露相应 Capability;
- 上游拓扑允许 ARI/ACS 等需要的路由和隔离;
- RK3588 PCIe 对应 IOMMU/SMMU stream 已正确接入;
- defconfig 启用
PCI_IOV/PCI_ATS/PCI_PRI/PCI_PASID; - PF 驱动实现硬件资源配置。
Rockchip 常用 defconfig 中未显式启用全部上述功能,因此部署前应以最终.config而非通用 ARM64 defconfig 为准。
正在加载留言…