支持单根 I/O 虚拟化(SR-IOV)的网络适配器必须能够支持以下硬件组件:
一个 PCI Express (PCIe) 物理功能 (PF)。 PF 始终存在于网络适配器上,并附加到 Hyper-V 父分区。
有关此硬件组件的详细信息,请参阅 SR-IOV 物理功能(PF)。
一个或多个 PCIe 虚拟函数(VF)。 必须先初始化每个 VF 并将其附加到 Hyper-V 子分区,然后来宾作系统的网络组件才能通过 VF 发送和接收数据包。
有关此硬件组件的详细信息,请参阅 SR-IOV 虚拟函数(VFs)。
在拆解 VF 及其资源释放之前,虚拟化堆栈会通知虚拟 PCI(VPCI)虚拟服务提供商(VSP)。 此 VSP 在 Hyper-V 父分区的管理作系统中运行。 通知VPCI VSP,VF将被拆除并从子分区分离。 在子分区的来宾操作系统中运行的 VPCI 虚拟服务客户 (VSC) 接收来自 VPCI 虚拟服务提供者 (VSP) 通过虚拟机总线 (VMBus) 发送的消息。 这些消息请求 VPCI VSC 优雅地移除在 VF 附加到子分区时暴露的 VF 网络适配器。 这会导致 NetVSC 与 VF 微型端口驱动程序解除绑定,并使驱动程序停止运行。 此时,子分区中的数据包流量从 VF 数据路径迁移到基于软件的合成数据路径。 有关这些数据路径的详细信息,请参阅 SR-IOV 数据路径。
故障转移到合成数据路径完成后,VF 会被拆解,并释放其资源。 下图显示了 VF 拆解所涉及的步骤。
NDIS、虚拟化堆栈和 PF 微型端口驱动程序在 VF 拆解序列中执行以下步骤:
虚拟化堆栈将虚拟机(VM)网络适配器的媒体访问控制(MAC)和虚拟 LAN(VLAN)筛选器移动到附加到 PF 的默认虚拟端口(VPort)。 VM 网络适配器在子分区的虚拟客体操作系统中暴露。
将筛选器移动到默认 VPort 后,综合数据路径可完全正常处理在来宾操作系统中运行的网络组件的进出网络流量。 PF 微型端口驱动程序在默认 PF VPort 上指示接收到的数据包,使用综合数据路径将数据包指示给来宾操作系统。 同样,来自来宾作系统的所有传输数据包都通过综合数据路径路由,并通过默认 PF VPort 传输。
虚拟化堆栈通过向 PF 微型端口驱动程序发出对象标识符 (OID) 集请求 OID_NIC_SWITCH_DELETE_VPORT 来删除附加到 VF 的 VPort。 微型端口驱动程序释放与 VPort 关联的任何硬件或软件资源,并完成 OID 请求。
有关详细信息,请参阅 删除虚拟端口。
在解除分配 VF 资源之前,虚拟化堆栈会请求 VF 的 PCIe 函数级别重置(FLR)。 堆栈通过向 PF 微型端口驱动程序发出 OID_SRIOV_RESET_VF的 OID 集请求来执行此作。 FLR 将 SR-IOV 网络适配器上的 VF 置于静止状态,并清除 VF 上所有未决中断事件。
重置 VF 后,虚拟化堆栈通过向 PF 微型端口驱动程序发出 OID 集 OID_NIC_SWITCH_FREE_VF 请求来解除分配 VF 资源。 这会导致微型端口驱动程序释放与 VF 关联的硬件资源。