查询虚拟功能的 PCI 配置空间

注意 此方法只能由在 Hyper-V 父分区的管理操作系统中运行的驱动程序过度使用。

PCI Express (PCIe) Virtual Function (VF 的微型端口驱动程序) 在 Hyper-V 子分区的来宾操作系统中运行。 因此,VF 微型端口驱动程序无法直接访问硬件资源,例如 VF 的 PCIe 配置空间。 只有 PCIe 物理功能 (PF) 的微型端口驱动程序可以访问 VF 的 PCIe 配置空间。 PF 微型端口驱动程序在 Hyper-V 父分区的管理操作系统中运行,并具有对 VF 资源的特权访问权限。

在管理操作系统中运行的过度驱动程序发出对象标识符 (OID) 方法请求 ,OID_SRIOV_READ_VF_CONFIG_SPACE 从网络适配器上的指定 VF 的 PCIe 配置空间读取数据。

例如,当 VF 微型端口驱动程序调用 NdisMGetBusData 从其 VF PCIe 配置空间读取时,在管理操作系统中运行的虚拟化堆栈发出 OID_SRIOV_READ_VF_CONFIG_SPACE 的 OID 方法请求。

在发出此 OID 方法请求之前,过度的驱动程序必须按以下方式设置 NDIS_SRIOV_READ_VF_CONFIG_SPACE_PARAMETERS 结构的成员:

  • VFId 成员必须设置为要从中读取信息的 VF 的标识符。

  • Offset 成员必须设置为要在其中读取数据的 VF 的 PCIe 配置空间中的偏移量。

  • 必须将 Length 成员设置为从 VF 的 PCIe 配置空间读取的字节数。

  • BufferOffset 成员必须设置为由 InformationBuffer 成员) 引用的缓冲区 (的偏移量,该成员将包含从指定 VF 的 PCI 配置空间读取的数据。 从 NDIS_SRIOV_READ_VF_CONFIG_SPACE_PARAMETERS 结构开始,此偏移量以字节为单位指定。

处理 OID_SRIOV_READ_VF_CONFIG_SPACE 的 OID 方法请求时,PF 微型端口驱动程序必须遵循以下准则:

  • 微型端口驱动程序必须验证由 NDIS_SRIOV_READ_VF_CONFIG_SPACE_PARAMETERS 结构的 VFId 成员指定的 VF 是否具有以前已分配的资源。 微型端口驱动程序通过 OID_NIC_SWITCH_ALLOCATE_VF的 OID 方法请求为 VF 分配资源。 如果尚未分配指定 VF 的资源,驱动程序必须使 OID 请求失败。

  • 微型端口驱动程序必须验证由 NDIS_OID_REQUEST 结构的 InformationBuffer 成员引用的缓冲区 () 是否足够大,足以返回请求的 PCIe 配置空间数据。 如果不是这样,则驱动程序必须使 OID 请求失败。

  • 微型端口驱动程序通常调用 NdisMGetVirtualFunctionBusData 来查询请求的 PCIe 配置空间。 但是,微型端口驱动程序还可以返回该驱动程序从 PCIe 配置空间的先前读取或写入操作中缓存的 VF 的 PCIe 配置空间数据。

    注意 如果独立硬件供应商 (IHV) 提供虚拟总线驱动程序 (VBD) 作为其 SR-IOV 驱动程序包的一部分,则其微型端口驱动程序不得调用 NdisMGetVirtualFunctionBusData。 相反,驱动程序必须通过专用信道与 VBD 进行交互,并请求 VBD 调用 ReadVfConfigBlock。 此函数从基础虚拟 PCI (VPCI ) 总线驱动程序支持的 GUID_VPCI_INTERFACE_STANDARD 接口公开。

成功从此 OID 方法请求返回后,NDIS_OID_REQUEST 结构的 InformationBuffer 成员包含指向调用方分配的缓冲区的指针。 此缓冲区的格式设置为包含以下内容:

  • 一个NDIS_SRIOV_READ_VF_CONFIG_SPACE_PARAMETERS结构,包含 VF 的 PCIe 配置空间的读取操作参数。

  • 用于从 PCIe 配置空间读取数据的额外缓冲区空间。 驱动程序将数据以NDIS_SRIOV_READ_VF_CONFIG_SPACE_PARAMETERS 结构的BufferOffset 成员指定的偏移量将数据复制到 缓冲区