仮想関数初期化シーケンス

単一ルート I/O 仮想化 (SR-IOV) をサポートするネットワーク アダプターは、次のハードウェア コンポーネントをサポートできる必要があります。

  • 1 つの PCI Express (PCIe) 物理機能 (PF)。 PF は常にネットワーク アダプター上に存在し、Hyper-V 親パーティションに接続されます。

    このハードウェア コンポーネントの詳細については、SR-IOV 物理機能 (PF) を参照してください。

  • 1 つ以上の PCIe 仮想関数 (VF)。 ゲスト オペレーティング システムのネットワーク コンポーネントが VF 経由でパケットを送受信するには、各 VF を初期化して Hyper-V 子パーティションに接続する必要があります。

    このハードウェア コンポーネントの詳細については、SR-IOV 仮想関数 (VFs)を参照してください。

Hyper-V 親パーティションの管理オペレーティング システムで実行される PF ミニポート ドライバーは、SR-IOV ネットワーク アダプター上の PF と各 VF のリソースを初期化して割り当てます。 NDIS が PF ミニポート ドライバーの MiniportInitializeEx 関数を呼び出した後、NDIS と仮想化スタックは、オブジェクト識別子 (OID) の要求を PF ミニポート ドライバーに発行して、次のことを行うことができます。

  • ネットワーク アダプターに NIC スイッチを作成します。 NIC スイッチは、VM、PF、および物理ネットワーク ポート間のネットワーク トラフィックをブリッジします。

    詳細については「NIC スイッチ」をご覧ください。

    Windows Server 2012 以降では、SR-IOV インターフェイスは、ネットワーク アダプターの既定の NIC スイッチを1つのみサポートします。 このスイッチは既定の NIC スイッチと呼ばれており、NDIS_DEFAULT_SWITCH_ID 識別子で参照します。

  • PF ミニポート ドライバーを初期化し、ネットワーク アダプター上の VF のリソースを割り当てる要求します。

    詳細については 「SR-IOV 仮想関数 (VFs)」 を参照してください。

  • NIC スイッチに仮想ポート (VPort) を作成し、VF に接続します。

    詳細については、「仮想ポート (VPort)」を参照してください。

次の図は、VF の初期化に関連するステップを示しています。

example vf initialization sequence showing calls from the virtualization stack to ndis and then to the pf miniport driver.

NDIS、仮想化スタック、および PF ミニポート ドライバーは、VF 初期化シーケンスで次の手順に従います。

  1. NDIS は、レジストリから既定のスイッチ構成を読み取り、ネットワーク アダプターでスイッチをプロビジョニングする OID_NIC_SWITCH_CREATE_SWITCH の OID メソッド要求を発行します。 この OID 要求で渡されるパラメーターには、VM や VPorts などの重要なハードウェア リソースを構成する方法に関する情報が含まれます。 また、既定以外の VPort と PF にアタッチされている既定の VPort 間でリソースを分散する方法に関する情報も含まれています。

    PF ミニポート ドライバーによって OID が正常に完了した後、NIC スイッチを使用して VPort を作成し、その上に VM を割り当てる準備ができました。

    NIC スイッチを作成する方法の詳細については、「NIC スイッチの作成」を参照してください。

  2. VF は、仮想マシン (VM) ネットワーク アダプターのオフロード メカニズムとして扱われます。 このアダプターは、Hyper-V 子パーティションで実行されるゲスト オペレーティング システムで公開されます。 既定では、ゲスト オペレーティング システムのネットワーク コンポーネントは、ソフトウェア ベースの合成データ パスを介してパケットを送受信します。 ただし、VF オフロードの子パーティションが有効になっている場合、仮想化スタックは、リソースの割り当てと VF の初期化の PF ミニポート ドライバーに OID 要求を発行します。 VF が子パーティションと NIC スイッチの VPort に接続されると、ネットワーク コンポーネントは VF データ パス経由でパケットを送受信します。 これらのデータ パスの詳細については、「SR-IOV データ パス」を参照してください。

    HYPER-V 子パーティションが VF オフロードに対して有効になっている場合、仮想化スタックは PF ミニポート ドライバーに OID_NIC_SWITCH_ALLOCATE_VF の OID メソッド要求を発行します。 この OID 要求で渡されるパラメーターには、VF が割り当てられている NIC スイッチの識別子が含まれます。 その他のパラメーターには、VF がアタッチされる子パーティションの識別子が含まれます。

    PF ミニポート ドライバーは、VF に必要なハードウェアおよびソフトウェア リソースを割り当てます。 PF ミニポート ドライバーは、NDISMGetVirtualFunctionLocation を呼び出すことによって、VF の PCIe 要求元識別子 (RID) も決定します。 RID は、DMA 要求と割り込みが VF によって生成されるときに、DMA と割り込みの再マップに使用されます。

    OID_NIC_SWITCH_ALLOCATE_VF 要求が正常に完了すると、PF ミニポート ドライバーによって VF 識別子とともに RID が返されます。

    VF のリソース割り当ての詳細については、「仮想関数のリソースの割り当て」を参照してください。

  3. 仮想化スタックは、PF ミニポート ドライバーにOID_NIC_SWITCH_CREATE_VPORT の OID メソッド要求を発行することによって、NIC スイッチに VPort を作成します。 この OID 要求で渡されるパラメーターには、VPort を作成する NIC スイッチの識別子が含まれます。 その他のパラメーターには、VPort がアタッチされる VF の識別子が含まれます。

    注: NIC スイッチの既定の VPort は常に存在し、PF に接続されます。 VF に作成してアタッチできるのは、既定以外の VPort が 1 つだけです。

    NDIS は、PF ミニポート ドライバーに OID 要求を転送する前に、ネットワーク アダプター経由で一意の有効な VPort 識別子を割り当てます。

    PF ミニポート ドライバーは、OID 要求を処理するときに、VPort に必要なハードウェア リソースを割り当て、VPort の識別子を保持します。 この識別子は、後の OID 要求と SR-IOV 関数呼び出しで使用されます。

    VPort を作成する方法の詳細については、「仮想ポートの作成」を参照してください。

  4. HYPER-V 子パーティションは、VF と VPort が割り当てられるずっと前に開始される可能性があります。 この間、ゲスト オペレーティング システムのネットワーク コンポーネントは、合成データ パス経由でパケットを送受信します。 これには、PF に接続されている既定の VPort 経由のパケット トラフィックが含まれます。 子パーティションにトラフィックをブリッジするために、仮想化スタックは、子パーティションの VM ネットワーク アダプターのメディア アクセス制御 (MAC) フィルターと仮想 LAN (VLAN) フィルターを使用して既定の VPort を構成します。

    VF と VPort のリソースが割り当てられた後、仮想化スタックは、PF ミニポート ドライバーに OID_RECEIVE_FILTER_MOVE_FILTER の OID メソッド要求を発行します。 この OID 要求は、VM ネットワーク アダプターの MAC フィルターと VLAN フィルターを既定の VPort から VF にアタッチされている VPort に移動します。 これにより、これらのフィルターに一致するパケットが VF データ パス経由で VF VPort に転送されます。

    注: 既存の受信フィルターは、OID_RECEIVE_FILTER_MOVE_FILTER を使用して既定の VPort から VF VPort に移動できます。 また、OID_RECEIVE_FILTER_SET_FILTER を使用してして VF VPort に新しいフィルターを設定することもできます。

VF と VPort が正常に作成され、MAC フィルターが VPort に設定されると、仮想化スタックは仮想 PCI (VPCI) 仮想サービス プロバイダー (VSP) に通知します。 この VSP は、Hyper-V 親パーティションの管理オペレーティング システムで実行されます。 この通知は、正常に割り当てられ、子パーティションにアタッチされた VF を VPCI VSP に通知します。 VPCI VSP は、仮想マシン バス (VMBus) 経由で、子パーティションのゲスト オペレーティング システムで実行されている VPCI 仮想サービス クライアント (VSC) にメッセージを送信します。 VPCI VSC は、VF ネットワーク アダプターの PCI デバイスを公開するバス ドライバーです。

VF ネットワーク アダプターが公開された後、ゲスト オペレーティング システムで実行されている PnP サブシステムは、アダプターを検出し、VF ミニポート ドライバーを読み込みます。 このドライバーは NDIS に登録します。 VF ミニポート ドライバーが初期化され、VF ネットワーク アダプターで適切なパケット フィルターが構成されると、VF データ パスは完全に動作します。 その結果、ゲスト オペレーティング システムのパケット トラフィックは、合成データ パスからこのデータ パスに切り替わります。