从 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 会向用户发送 I/O 控制 IOCTL_VPCI_INVALIDATE_BLOCK。 完成此 IOCTL 后,NDIS 会收到 VF 配置数据已更改的通知。

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

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

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

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

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

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

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

    2. VPCI 驱动程序成功完成 了IOCTL_VPCI_INVALIDATE_BLOCK请求 。 发生这种情况时,NDIS 会向 VF 微型端口驱动程序 (OID) OID OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK对象标识符。NDIS_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 微型端口驱动程序进行反通道通信