设置虚拟功能的 PCI 配置数据
PCI Express (PCIe) Virtual Function (VF) 的微型端口驱动程序在 Hyper-V 子分区的来宾操作系统中运行。 因此,VF 微型端口驱动程序无法直接访问硬件资源,例如 VF 的 PCI 配置空间。 只有 PCIe 物理功能 (PF) 的微型端口驱动程序可以访问 VF 的 PCI 配置空间。 PF 微型端口驱动程序在 Hyper-V 父分区的管理操作系统中运行,并具有对 VF 资源的特权访问权限。
当 VF 微型端口驱动程序调用 NdisMSetBusData 写入其 PCI 配置空间时,上层驱动程序(如虚拟化堆栈)会发出OID_SRIOV_WRITE_VF_CONFIG_SPACE的 OID 集请求。
在发出此 OID 集请求之前,overlying 驱动程序必须通过以下方式设置NDIS_SRIOV_WRITE_VF_CONFIG_SPACE_PARAMETERS 结构的成员:
将 VFId 成员设置为要为其写入信息的 VF 的标识符。
将 Offset 成员设置为将写入数据的 VF 的 PCI 配置空间中的偏移量。
将 Length 成员设置为要写入 VF PCI 配置空间的字节数。
将 BufferOffset 成员设置为由 InformationBuffer 成员) 引用的缓冲区 (的偏移量,该成员将包含写入指定 VF 的 PCI 配置空间的数据。 此偏移量以字节为单位从 NDIS_SRIOV_WRITE_VF_CONFIG_SPACE_PARAMETERS 结构开始指定。
处理 OID_SRIOV_WRITE_VF_CONFIG_SPACE 的 OID 方法请求时,PF 微型端口驱动程序必须遵循以下准则:
PF 微型端口驱动程序必须验证由 NDIS_SRIOV_WRITE_VF_CONFIG_SPACE_PARAMETERS 结构的 VFId 成员指定的 VF 是否具有以前分配的资源。 PF 微型端口驱动程序通过 OID_NIC_SWITCH_ALLOCATE_VF的 OID 方法请求为 VF 分配资源。
如果尚未分配指定 VF 的资源,驱动程序必须使 OID 请求失败。
PF 微型端口驱动程序调用 NdisMSetVirtualFunctionBusData 以写入请求的 PCI 配置空间。 但是,PF 微型端口驱动程序还可以返回驱动程序从 PCI 配置空间的先前读取或写入操作中缓存的 VF 的 PCI 配置空间数据。
注意 如果独立硬件供应商 (IHV) 提供虚拟总线驱动程序 (VBD) 作为其 SR-IOV 驱动程序包的一部分,则其 PF 微型端口驱动程序不得调用 NdisMSetVirtualFunctionBusData。 相反,驱动程序必须通过专用信道与 VBD 进行交互,并请求 VBD 调用 SetVirtualFunctionData。 此函数从基础虚拟 PCI ( VPCI) 总线驱动程序支持的 GUID_VPCI_INTERFACE_STANDARD 接口公开。
如果 PF 微型端口驱动程序可以成功完成 OID 请求,则驱动程序必须将请求的 PCI 配置空间数据复制到 NDIS_OID_REQUEST 结构的 InformationBuffer 成员引用的缓冲区。 驱动程序将数据复制到NDIS_SRIOV_READ_VF_CONFIG_SPACE_PARAMETERS结构的BufferOffset 成员指定的偏移量处的 缓冲区 。