从 PF 微型端口驱动程序进行反向通道通信

PCI Express (PCIe 的微型端口驱动程序) 物理功能 (PF) 与 PCIe 虚拟函数 (VF) 的微型端口驱动程序进行通信,以发出有关 VF 配置块数据更改的通知。 PF 微型端口驱动程序发出这些通知,使 VF 配置块中的数据 失效 。 为了响应此通知,VF 微型端口驱动程序可以向 PF 微型端口驱动程序发出反向通道请求,以从无效的 VF 配置块读取数据。

VF 配置块用于 PF 和 VF 微型端口驱动程序之间的反向通道通信。 IHV 可以为设备定义一个或多个 VF 配置块。 每个 VF 配置块都有 IHV 定义的格式、长度和块 ID。

注意 每个 VF 配置块中的数据仅由 PF 和 VF 微型端口驱动程序使用。 此数据的格式和内容对于 Windows 操作系统的组件是不透明的。

发出和处理无效 VF 配置数据的通知时,将执行以下步骤:

  1. 在来宾操作系统中,NDIS 发出 IOCTL_VPCI_INVALIDATE_BLOCK的 I/O 控制请求。 完成此 IOCTL 后,NDIS 会收到 VF 配置数据已更改的通知。

  2. 在 Hyper-V 父分区中运行的管理操作系统中,执行以下步骤:

    1. PF 微型端口驱动程序调用 NdisMInvalidateConfigBlock 函数,以通知 NDIS VF 配置数据已更改且不再有效。 驱动程序将 BlockMask 参数设置为 ULONGLONG 位掩码,该位掩码指定哪些 VF 配置块已更改。 位掩码中的每个位对应于一个 VF 配置块。 如果位设置为 1,则相应 VF 配置块中的数据已更改。

    2. NDIS 向在管理操作系统中运行的虚拟化堆栈发出有关 VF 配置块数据的更改的信号。 虚拟化堆栈缓存 BlockMask 参数数据。

      注意 每次 PF 微型端口驱动程序调用 NdisMInvalidateConfigBlock 时,虚拟化会将 BlockMask 参数数据与缓存中的当前值一起堆栈。

    3. 虚拟化堆栈通知虚拟 PCI (VPCI) 驱动程序(在来宾操作系统中运行)VF 配置数据无效。 虚拟化堆栈将缓存的 BlockMask 参数数据发送到 VPCI 驱动程序。

  3. 在 Hyper-V 子分区中运行的来宾操作系统中,执行以下步骤:

    1. VPCI 驱动程序将缓存的 BlockMask 参数数据保存在与IOCTL_VPCI_INVALIDATE_BLOCK请求关联的VPCI_INVALIDATE_BLOCK_OUTPUT结构的 BlockMask 成员中。

    2. VPCI 驱动程序成功完成 IOCTL_VPCI_INVALIDATE_BLOCK 请求。 发生这种情况时,NDIS 会向 VF 微型端口驱动程序发出对象标识符 (OID) 方法请求 OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCKNDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO在 OID 请求中传递。 此结构包含缓存的 BlockMask 参数数据。

      NDIS 还发出另一 个IOCTL_VPCI_INVALIDATE_BLOCK 请求,用于处理 VF 配置数据更改的连续通知。

    3. 当 VF 驱动程序处理 OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK 请求时,它可以通过调用 NdisMReadConfigBlock 从指定的 VF 配置块读取数据。 有关此过程的详细信息,请参阅 来自 VF 微型端口驱动程序的反向通道通信