查询虚拟功能的 PCI 基址寄存器

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

在 Hyper-V 父分区的管理操作系统中运行的 PCI 总线驱动程序查询网络适配器的每个 PCI 基址寄存器 (BAR) 的内存或 I/O 地址空间要求。 PCI 总线驱动程序在首次检测到总线上的适配器时执行此查询。

通过此 PCI BAR 查询,PCI 总线驱动程序确定以下内容:

  • 网络适配器是否支持 PCI BAR。

  • 如果支持 BAR,则表示 BAR 需要多少内存或 I/O 地址空间。

PCI 驱动程序按以下方式执行此 PCI BAR 查询:

  1. PCI 驱动程序首先将所有数据写入 BAR。

  2. 然后,PCI 驱动程序读取 BAR 以确定 BAR 所需的内存或地址空间。 值为零表示网络适配器不支持 BAR。

虚拟 PCI (VPCI) 总线驱动程序在 Hyper-V 子分区的来宾操作系统中运行。 将 PCI Express (PCIe) Virtual Function (VF) 附加到子分区时,VPCI 总线驱动程序会公开 VF (VF 网络适配器 的虚拟网络适配器) 。 在执行此操作之前,VPCI 总线驱动程序必须执行 PCI BAR 查询,以确定 VF 网络适配器所需的所需内存或地址空间。

由于对 PCI 配置空间的访问是特权操作,因此只能由 Hyper-V 父分区的管理操作系统中运行的组件执行。 当 VPCI 总线驱动程序查询 PCI BAR 时,NDIS 会发出对象标识符 (OID) 向 PF 微型端口驱动程序 发出OID_SRIOV_PROBED_BARS 的查询请求。 此 OID 查询请求返回的结果将转发到 VPCI 总线驱动程序,以便它可以确定 VF 网络适配器需要多少内存地址空间。

注意 OID_SRIOV_BAR_RESOURCES的 OID 请求只能由 NDIS 发出。 OID 请求不得由过度分配驱动程序(如协议或筛选器驱动程序)发出。

OID_SRIOV_PROBED_BARS查询请求包含 NDIS_SRIOV_PROBED_BARS_INFO 结构。 当 PF 微型端口驱动程序处理此 OID 时,驱动程序必须返回由 NDIS_SRIOV_PROBED_BARS_INFO 结构的 BaseRegisterValuesOffset 成员引用的数组中的 PCI BAR 值。 对于数组中的每个偏移量,PF 微型端口驱动程序必须将 array 元素设置为 BAR 的 ULONG 值,其偏移量与物理网络适配器的 PCI 配置空间中的偏移量相同。

驱动程序返回的每个 BAR 值必须与管理操作系统中运行的 PCI 驱动程序执行的 PCI BAR 查询后面的值相同。 PF 微型端口驱动程序可以调用 NdisMQueryProbedBars 来确定此信息。

有关 PCI 设备的基址寄存器的详细信息,请参阅 PCI 本地总线规范