详解)
目录一、总体理解二、VF 的底层原理1. PCIe Function 是什么2. VF 是如何创建出来的三、“有与性能相关的资源”是什么意思1. 队列资源2. 描述符环3. MSI-X 中断4. BAR 和寄存器窗口5. 硬件上下文6. 资源不一定物理独占独立或专属资源配额化资源共享资源四、“可独立 DMA”的原理1. 基本 DMA 路径2. 为什么 VF 可以被 IOMMU 区分3. IOMMU 的重要性4. “独立 DMA”不等于“独立 DMA 硬件”逻辑独立物理独立五、“无设备初始化/配置能力”如何理解1. VF 不能做的全局操作安全原因硬件架构原因2. VF 通常可以做的本地配置3. PF-VF Mailbox六、完整生命周期和工作流程阶段 1PF 初始化物理设备阶段 2PF 创建 VF阶段 3宿主机设置 VF 策略阶段 4VF 分配给虚拟机或容器虚拟机直通容器使用 VF阶段 5VF 驱动初始化本地数据通路阶段 6数据面独立运行阶段 7复位和回收七、数据面与控制面的关系八、典型应用场景1. 虚拟机网络直通2. DPDK 和 NFV3. 容器网络4. RDMA5. 存储设备6. GPU、加速卡和智能网卡九、性能分析1. 性能优势缩短 I/O 路径支持硬件卸载支持多队列并行2. 性能不一定等于物理设备独占3. NUMA 影响十、隔离与安全分析1. 内存隔离2. 网络身份隔离3. 资源型拒绝服务4. 共享故障域十一、可管理性分析1. 优点2. 缺点十二、VF 与 Virtio 的对比十三、常见误区误区 1VF 是一块独立的物理设备误区 2VF 可以访问任意内存误区 3VF 完全不能配置误区 4VF DMA 必须经过 PF误区 5VF 一定拥有独立 DMA 引擎误区 6VF 性能一定等于 PF十四、一个完整示例控制流程发送流程特权配置流程十五、最终总结1. 轻量 PCIe Function2. 数据面资源3. 受控独立 DMA4. 管理能力受限一、总体理解SR-IOVSingle Root I/O Virtualization允许一个物理 PCIe 设备暴露出多个 PCIe FunctionPFPhysical Function完整功能负责设备初始化、资源管理和 VF 生命周期管理VFVirtual Function轻量级功能主要负责高速数据通路。可以概括为PF 负责控制面和管理面VF 负责数据面。VF 通常具有独立 PCIe BDF有限的 PCI 配置空间VF BAR队列和描述符资源MSI-X 中断DMA 请求能力独立的硬件上下文。但 VF 通常不具有物理设备上电初始化能力固件加载能力全局寄存器访问能力PHY、端口、链路配置能力全局队列和共享缓存分配能力创建或销毁其他 VF 的能力整个设备的复位能力。因此原描述更准确地说是VF 拥有被 PF 分配的数据面资源可以基于自己的队列和 PCIe Requester ID 独立发起受控 DMA但不能初始化整个物理设备也不能修改设备级全局配置。VF 只能进行有限的本地配置或者通过 mailbox 请求 PF 代为执行特权操作。二、VF 的底层原理1. PCIe Function 是什么PCIe 通过 BDF 标识一个 FunctionBus : Device . Function例如0000:3b:00.0 PF 0000:3b:02.0 VF0 0000:3b:02.1 VF1 0000:3b:02.2 VF2启用 SR-IOV 后系统会把每个 VF 枚举成独立的 PCIe Function。因此从操作系统或虚拟机的角度看VF 很像一块独立设备有自己的 PCI Device ID可以绑定自己的驱动可以映射 BAR可以注册 MSI-X可以成为 DMA Bus Master可以通过 VFIO 直通给虚拟机。但 VF 并不对应一套完整的物理硬件。它通常只是设备内部的一组队列寄存器窗口中断向量DMA 上下文过滤规则调度上下文统计信息权限标识。底层的物理端口、PCIe 链路、缓存、DMA 引擎和处理流水线往往仍然是共享的。2. VF 是如何创建出来的支持 SR-IOV 的 PF 在 PCIe 配置空间中包含 SR-IOV Extended Capability其中会描述TotalVFs设备最多支持多少个 VFNumVFs当前启用多少个 VFFirst VF Offset第一个 VF 与 PF 的路由位置关系VF Stride不同 VF 之间的 Function 间隔VF Device IDVF 使用的设备 IDVF BARVF 的 BAR 资源支持的页大小等。PF 驱动初始化设备后可以设置NumVFs并使能 VF。随后 PCIe 子系统根据这些信息枚举出 VF。Linux 中常见操作为echo 8 /sys/bus/pci/devices/0000:3b:00.0/sriov_numvfs表示通过该 PF 创建 8 个 VF。销毁 VFecho 0 /sys/bus/pci/devices/0000:3b:00.0/sriov_numvfsVF 不能自行创建其他 VF也不能决定自己使用多少全局资源这些权限属于 PF。三、“有与性能相关的资源”是什么意思VF 的主要设计目标是让虚拟机或容器能够绕过复杂的软件转发路径直接使用设备的数据通路。以网卡 VF 为例PF 可能为每个 VF 分配VF0 ├─ Rx Queue 0~3 ├─ Tx Queue 0~3 ├─ Completion Queue ├─ MSI-X Vector ├─ MAC/VLAN Filter ├─ Queue Context └─ DMA/调度上下文常见资源包括1. 队列资源例如Tx QueueRx QueueSubmission QueueCompletion QueueWork QueueEvent Queue。队列通常是 VF 高性能数据路径的核心。2. 描述符环驱动在内存中建立描述符环例如Tx Descriptor Ring: ----------------------- | Addr | Length | Flags | -----------------------描述符包含数据缓冲区地址长度校验和或分段卸载参数完成标志所有权状态。VF 读取描述符后执行 DMA。3. MSI-X 中断每个 VF 通常拥有一个或多个 MSI-X 向量用于收包完成通知发包完成通知错误事件队列事件。中断可以直接送达宿主机或虚拟机对应的 vCPU。高负载场景下也可能使用轮询例如NAPIDPDK Poll Mode DriverRDMA Completion Polling。4. BAR 和寄存器窗口VF 可以拥有自己的 VF BAR驱动通过该区域访问队列控制寄存器Doorbell中断控制本地状态mailbox 寄存器VF 复位状态。VF BAR 通常只是设备整体 MMIO 空间中的受限窗口。VF 无法通过它访问 PF 的全局管理寄存器。5. 硬件上下文设备通常根据 VF ID 或 PCIe Requester ID 维护独立上下文例如队列属于哪个 VFVF 允许使用哪些 DMA 地址VF 的 MAC/VLANVF 速率限制VF 能访问哪些内部对象VF 能否修改某些参数VF 是否处于 trusted 模式。这些上下文构成 VF 间隔离的基础。6. 资源不一定物理独占“VF 有独立资源”并不一定意味着每个 VF 拥有完全独立的物理 DMA 引擎。实际设备中通常分为三类独立或专属资源队列编号队列上下文MSI-X 向量VF 寄存器窗口过滤规则统计计数器。配额化资源队列数量带宽流表项缓存额度RDMA QP 数量Completion Queue 数量。共享资源物理端口PCIe 链路内部交换结构DMA 引擎片上缓存外部内存带宽固件物理链路带宽。所以 VF 的性能可以接近物理设备但多个 VF 之间仍然可能出现资源竞争。四、“可独立 DMA”的原理1. 基本 DMA 路径以网卡发送数据为例Guest Driver │ │ 1. 在内存中准备数据和描述符 ▼ Guest Memory / DMA Buffer │ │ 2. 写 VF Doorbell ▼ VF Queue Context │ │ 3. 设备发起 PCIe DMA Read ▼ IOMMU 地址检查和转换 │ │ 4. 读取允许访问的内存 ▼ NIC Packet Processing │ │ 5. 从物理端口发送 ▼ Network接收方向Network │ ▼ Physical NIC │ │ 根据 MAC/VLAN/Flow Rule 分类 ▼ VF Rx Queue │ │ DMA Write ▼ IOMMU │ ▼ Guest DMA Buffer │ ▼ MSI-X / Polling数据收发过程中PF 一般不需要逐包参与。这就是 VF 性能高的重要原因不需要每个数据包都经过宿主机软件交换减少虚拟化陷入减少上下文切换减少软件复制降低时延和 CPU 开销。2. 为什么 VF 可以被 IOMMU 区分每个 VF 通常有自己的 PCIe BDF也就有独立的 PCIe Requester ID。设备发起 DMA 时事务中带有对应的 Requester ID。IOMMU 根据 Requester ID 查找该 VF 的地址转换和访问权限VF Requester ID │ ▼ IOMMU Context │ ├─ 允许访问 Guest Page A ├─ 允许访问 Guest Page B └─ 禁止访问 Host/Other Guest Memory所以“独立 DMA”更准确的含义是VF 可以不经过 PF 软件逐次代理自主发起属于该 VF 的 DMA 请求但 DMA 访问范围由 IOMMU、宿主机和设备权限共同限制。它不意味着 VF 可以访问任意物理内存。3. IOMMU 的重要性如果没有正确配置 IOMMU一个直通设备理论上可能通过 DMA 访问不属于自己的内存造成宿主机内存破坏跨虚拟机数据泄漏权限提升系统崩溃。因此VF 直通通常配合Intel VT-dAMD-ViARM SMMUVFIO/IOMMU GroupInterrupt Remapping。使用。4. “独立 DMA”不等于“独立 DMA 硬件”需要区分逻辑独立VF 有自己的队列VF 可以写自己的 doorbellDMA 请求带有自己的身份DMA 完成送到自己的中断PF 不参与每次请求。物理独立每个 VF 有独占 DMA 引擎有独占缓存有独占总线有独占物理端口。大部分 SR-IOV 设备只保证前者不保证后者。五、“无设备初始化/配置能力”如何理解这个说法是相对 PF 而言不能简单理解为“VF 完全不能配置”。1. VF 不能做的全局操作通常包括设备上电初始化固件加载和升级物理链路训练PHY 初始化物理端口速率设置全局队列资源划分全局缓存划分创建或删除 VF管理其他 VF修改 SR-IOV 全局配置访问整个设备的寄存器空间执行设备级复位修改整个端口的流控模式修改共享调度器管理设备安全策略。原因主要有两个安全原因如果某个 VF 能修改全局配置它可能影响PF其他 VF其他虚拟机整个物理端口整台服务器。硬件架构原因VF 本质上只有受限寄存器和资源窗口并没有映射完整的设备控制寄存器。2. VF 通常可以做的本地配置VF 驱动通常仍然需要进行本地初始化例如分配并设置描述符环设置队列地址设置队列深度配置自己的 MSI-X开启或停止自己的队列写自己的 doorbell设置中断合并参数查询链路状态申请部分卸载能力执行 VF 级别复位。所以更准确的表述是VF 没有完整的物理设备初始化和全局配置能力但具有有限的 VF 本地初始化能力。3. PF-VF MailboxVF 需要执行特权操作时通常通过 mailbox 向 PF 请求。例如VF Driver PF Driver/Firmware │ │ │ Request: 设置 MAC 地址 │ ├─────────────────────────────────►│ │ │ 检查 VF 权限和策略 │ │ 配置硬件过滤表 │ Response: Success/Denied │ ◄─────────────────────────────────┤常见 mailbox 操作包括查询 API 或协议版本查询链路状态请求队列资源请求设置 MAC请求设置 VLAN请求启用校验和卸载请求设置 MTU请求重置 VF获取设备能力获取错误状态。PF 可以根据安全策略拒绝请求。例如宿主机管理员预先指定ip link set eth0 vf 0 mac 52:54:00:12:34:56 ip link set eth0 vf 0 vlan 100 ip link set eth0 vf 0 spoofchk on ip link set eth0 vf 0 max_tx_rate 5000这种情况下虚拟机内的 VF 驱动不能随意修改这些属性。六、完整生命周期和工作流程阶段 1PF 初始化物理设备系统启动后PF 驱动完成PCIe 设备识别BAR 映射固件加载全局寄存器初始化DMA 引擎初始化PHY 和链路初始化中断系统初始化全局队列、缓存和调度器配置SR-IOV 能力检查。此时物理设备已经能够正常工作。阶段 2PF 创建 VF管理员或虚拟化管理平台请求启用若干 VFAdministrator │ ▼ PF Driver │ ├─ 设置 NumVFs ├─ 为 VF 分配队列 ├─ 创建 VF 上下文 ├─ 设置 VF BAR 资源 ├─ 设置中断资源 └─ 设置安全和带宽策略系统随后枚举出多个 VF。阶段 3宿主机设置 VF 策略PF 或宿主机可以设置MAC 地址VLAN带宽上限spoof checktrust 模式是否允许混杂模式队列数量QoS流量导向规则。这些配置构成 VF 的安全边界。阶段 4VF 分配给虚拟机或容器虚拟机直通典型流程将 VF 从宿主机 VF 驱动解绑绑定到vfio-pci建立 IOMMU 映射将 VF 的配置空间、BAR 和中断映射给虚拟机虚拟机加载厂商 VF 驱动。结构如下---------------- Virtual Machine ---------------- | Guest Application | | │ | | Guest VF Driver | | │ MMIO / DMA / MSI-X | --------┼----------------------------------------- │ VFIO │ IOMMU │ --------▼----------------------------------------- | VF Queue / Context | | Physical Device | --------------------------------------------------容器使用 VF容器通常不会直接管理 PCIe 生命周期而是通过SR-IOV CNIKubernetes Device PluginNetwork Attachment DefinitionVFIO 或 VF netdevice将 VF 暴露给 Pod。阶段 5VF 驱动初始化本地数据通路虚拟机中的 VF 驱动通常执行读取 VF 配置空间映射 VF BAR与 PF 协商 mailbox 版本查询允许使用的能力分配 DMA 内存创建 Tx/Rx 队列设置描述符环地址配置 MSI-X启动本地队列开始收发数据。注意这是 VF 的本地初始化不是物理设备的全局初始化。阶段 6数据面独立运行发送时应用 → Guest Network Stack/DPDK → VF Tx Descriptor → 写 Doorbell → 设备 DMA 读取数据 → 硬件调度 → 物理端口发送接收时物理端口收包 → 硬件分类 → 定位目标 VF → DMA 写入 VF 缓冲区 → MSI-X 或轮询 → Guest Driver → 应用PF 不需要逐包复制或转发。阶段 7复位和回收VF 可能支持 FLRFunction Level Reset用于重置单个 VF停止 VF 队列清理未完成 DMA清空 VF 上下文恢复 VF 默认状态尽量不影响其他 VF。但 VF 通常不能执行PF ResetSecondary Bus Reset全设备复位物理链路复位。虚拟机关闭后宿主机通常会停止 VF DMA撤销 IOMMU 映射执行 VF FLR清除安全上下文将 VF 重新绑定给宿主机或分配给其他虚拟机。七、数据面与控制面的关系可以用下图理解控制面 ---------------- | PF Driver | | Firmware | | Hypervisor | --------------- | 配置 MAC/VLAN/QoS/队列/权限/资源 | ---------------------------▼-------------------------- | Physical Device | | | | VF0 Context VF1 Context VF2 Context | | Queue/IRQ/DMA Queue/IRQ/DMA Queue/IRQ/DMA | | | | | | -------|-----------------|-----------------|----------- | | | Guest 0 Guest 1 Container \ | / \________________|________________/ | 数据面关键点是控制面仍由 PF 掌握数据面可以由 VF 直接操作PF 不必参与每一次数据传输PF 仍负责资源、安全、生命周期和异常处理。八、典型应用场景1. 虚拟机网络直通这是最常见的场景。传统虚拟网络路径可能是Guest → Virtio → vhost → Linux Bridge/OVS → Host NICSR-IOV VF 路径则更短Guest VF Driver → VF Queue → Physical NIC适合云计算高性能网络数据库虚拟机高频交易实时通信网络功能虚拟化高吞吐存储网络。2. DPDK 和 NFV在 DPDK 场景中应用可以轮询 VF 队列DPDK Application │ Poll Mode Driver │ VF Queue │ NIC Hardware它可以减少内核协议栈开销中断开销上下文切换数据复制。常用于虚拟防火墙vRouter5G UPF负载均衡DPI虚拟基站网络功能。3. 容器网络Kubernetes 中可通过 SR-IOV CNI 将 VF 分配给 Pod。适合低时延 Pod电信云高吞吐网络应用需要 RDMA 的容器需要硬件卸载的网络功能。限制是 VF 数量有限调度器还需要考虑PCIe 拓扑NUMAVF 数量驱动兼容性设备健康状态。4. RDMA支持 SR-IOV 的 RDMA 网卡可以为 VF 提供QPCQDoorbellMemory RegionCompletion Event受限的 RDMA 资源。应用可以获得较低时延和较低 CPU 消耗。需要注意MR 注册和内存权限仍然需要严格控制PF 负责全局资源限制不同设备的 VF RDMA 能力差异很大。5. 存储设备部分 NVMe、FC、SAS 或智能存储控制器支持 SR-IOV。VF 可能表现为一个虚拟控制器拥有Submission QueueCompletion QueueNamespace 或逻辑卷访问权限MSI-XDMA 上下文。适用于虚拟化数据库高 IOPS 存储NVMe 直通软件定义存储虚拟机低时延块设备。6. GPU、加速卡和智能网卡部分 GPU、FPGA、压缩卡、密码卡和 SmartNIC 也可能使用 SR-IOV。VF 可以被分配计算队列命令队列部分计算单元上下文内存窗口DMA 通道中断。但 GPU 虚拟化不一定采用标准 SR-IOV也可能使用mediated device厂商 vGPUScalable FunctionPASID/SVA时间片复用。因此不能把所有虚拟加速设备都直接等同于 VF。九、性能分析1. 性能优势VF 能提升性能的主要原因是缩短 I/O 路径绕过或减少虚拟交换机宿主机协议栈软件设备模拟数据包复制VM Exit额外调度。支持硬件卸载例如checksum offloadTSO/GSORSSVLAN offload流分类加密卸载RDMA存储命令处理。支持多队列并行多个 vCPU 可以对应多个队列vCPU0 → Queue0 vCPU1 → Queue1 vCPU2 → Queue2 vCPU3 → Queue3有利于提升吞吐和多核扩展能力。2. 性能不一定等于物理设备独占VF 的性能仍可能受以下因素限制多个 VF 共享物理端口PCIe 带宽有限DMA 引擎共享片上缓存竞争内存带宽竞争NUMA 跨节点访问IOMMU 转换开销中断配置不合理队列数量不足PF 配置的限速固件调度策略其他 VF 的突发流量。例如一块 100 Gbit/s 网卡创建 16 个 VF并不意味着每个 VF 都能同时获得 100 Gbit/s。3. NUMA 影响如果 VF 位于 NUMA Node 0而虚拟机内存和 vCPU 位于 NUMA Node 1则 DMA 和 CPU 访问可能跨 NUMAVF/NIC on NUMA 0 │ │ Inter-Socket Link ▼ Guest Memory on NUMA 1这会增加内存访问时延跨 Socket 流量CPU 消耗抖动。高性能部署应尽量做到VF虚拟机内存vCPU中断HugePage位于同一 NUMA 节点。十、隔离与安全分析1. 内存隔离主要依赖IOMMUVF Requester IDVFIODMA 映射设备内部权限检查。如果 VF、IOMMU 或设备固件存在缺陷可能造成 DMA 越权风险。2. 网络身份隔离PF 通常需要限制 VFMAC 地址伪造VLAN 越权混杂模式广播风暴非法流表操作随意修改带宽策略。常见机制包括spoof checkingtrusted/untrusted VFMAC lockingVLAN filteringrate limitingACLeSwitch 策略。3. 资源型拒绝服务即使 DMA 内存隔离正确一个恶意 VF 仍可能通过大量操作争抢共享资源例如高频 doorbell中断风暴队列占满大量小包消耗流表项占用缓存触发固件异常消耗共享链路带宽。因此需要队列配额中断限制带宽限速流表配额固件看门狗VF 错误隔离PF 侧健康监控。4. 共享故障域虽然 VF 在逻辑上独立但它们共享同一物理设备和固件。下列问题可能影响所有 VFPF 复位固件崩溃PCIe 链路故障物理端口断链设备过热驱动升级全局资源耗尽。所以VF 提供的是较强的数据路径隔离但并不等同于完全独立的物理设备。十一、可管理性分析1. 优点接近裸机的 I/O 性能时延低CPU 开销小虚拟机直接使用硬件队列硬件卸载能力较强多租户可共享一个物理设备数据面不需要 PF 逐次介入。2. 缺点VF 数量受硬件限制队列和中断资源有限配置依赖 PF 和厂商驱动直通后宿主机可观测性降低虚拟机热迁移更困难设备复位和升级可能影响多个租户不同型号 VF 能力差异较大虚拟交换、ACL、抓包和监控可能更复杂对 NUMA、IOMMU 和中断亲和性较敏感。十二、VF 与 Virtio 的对比对比项SR-IOV VFVirtio/vhost数据路径直接进入硬件队列通常经过宿主机后端性能通常更高较高但有软件路径时延通常更低通常略高CPU 开销较低相对更高隔离机制IOMMU 设备硬件Hypervisor 软件后端热迁移较困难通常更容易可观测性相对较弱宿主机更容易观测灵活策略依赖硬件能力软件策略更灵活硬件依赖强相对较弱VF 数量受设备限制通常更灵活因此强调性能和低时延时倾向 VF强调迁移、灵活性和统一管理时倾向 Virtio/vhost部分平台会采用混合方案例如高性能流量走 VF管理流量走 Virtio。十三、常见误区误区 1VF 是一块独立的物理设备不是。VF 是一个独立可枚举的 PCIe Function但其底层通常共享物理端口PCIe 链路DMA 引擎缓存固件调度器。误区 2VF 可以访问任意内存不能。VF 的 DMA 应受到 IOMMU 和宿主机映射限制。误区 3VF 完全不能配置不准确。VF 可以配置自己的局部数据路径例如队列、描述符和中断但不能控制物理设备的全局状态。误区 4VF DMA 必须经过 PF通常不需要。数据面 DMA 可由 VF 自主发起PF 主要负责前期配置、权限管理和异常处理。误区 5VF 一定拥有独立 DMA 引擎不一定。VF 通常有逻辑独立的 DMA 上下文但底层 DMA 引擎可能共享。误区 6VF 性能一定等于 PF不一定。VF 可能受到队列数限制功能限制带宽限制共享资源竞争IOMMUNUMA固件调度等因素影响。十四、一个完整示例假设一块 100G 网卡支持 64 个 VF管理员创建 8 个 VF并将 VF0 分配给 VM1。控制流程1. PF 驱动加载网卡固件 2. PF 初始化物理端口和全局资源 3. PF 创建 8 个 VF 4. PF 为 VF0 分配 4 个 Rx 队列、4 个 Tx 队列 5. 宿主机设置 VF0 的 MAC、VLAN、限速 6. VF0 绑定 vfio-pci 7. IOMMU 为 VF0 建立 VM1 的 DMA 地址映射 8. VF0 直通给 VM1 9. VM1 加载 VF 驱动 10. VF 驱动建立描述符环和 MSI-X发送流程VM1 应用生成数据 ↓ VF 驱动填写 Tx 描述符 ↓ VF 驱动写 Doorbell ↓ 网卡根据 VF0 上下文读取描述符 ↓ IOMMU 验证并转换 DMA 地址 ↓ 网卡 DMA 读取 VM1 内存 ↓ 网卡执行校验和/分段等卸载 ↓ 通过物理端口发包特权配置流程如果 VM1 想修改 MACVF Driver ↓ mailbox request PF Driver ↓ 检查管理员策略 允许写入硬件过滤表 拒绝返回 permission denied整个数据面无需 PF 逐包转发但资源、安全和全局配置仍然由 PF 控制。十五、最终总结VF 可以从四个关键词理解1. 轻量 PCIe FunctionVF 有独立 BDF、BAR、驱动、中断和 DMA 身份可被操作系统或虚拟机当作设备使用。2. 数据面资源VF 拥有或被分配队列、描述符、中断和硬件上下文重点解决高吞吐和低时延问题。3. 受控独立 DMAVF 可以不经过 PF 逐次代理直接发起 DMA但 DMA 地址范围受到 IOMMU、VFIO 和设备内部权限约束。4. 管理能力受限VF 可以初始化自己的局部队列和数据通路但不能初始化整个物理设备、修改全局配置或管理其他 VF。特权操作通常需要通过 mailbox 请求 PF。最精炼的描述是VF 是 PF 创建并管理的轻量级 PCIe 功能。它拥有独立的数据面队列、DMA 上下文和中断能力能够直接完成高性能 I/O但它只拥有有限的本地配置权限设备初始化、物理链路、全局资源、安全策略和 VF 生命周期均由 PF、固件或 Hypervisor 管理。SR-IOV 中的 PFPhysical Function详解-CSDN博客