次の方法で共有


PF ミニポート ドライバーからのバックチャネル通信

PCI Express (PCIe) 物理機能 (PF) のミニポート ドライバーは、仮想関数 (VF) 構成ブロックのデータの変更に関する通知を発行する PCIe 仮想関数 (VF) のミニポート ドライバーと通信します。 PF ミニポート ドライバーは、VF 構成ブロック内のデータを無効にするこれらの通知を発行します。 この通知に応答して、VF ミニポート ドライバーは、無効な VF 構成ブロックからデータを読み取る PF ミニポート ドライバーにバックチャネル要求を発行できます。

VF 構成ブロックは、PF ミニポート ドライバーと VF ミニポート ドライバー間のバックチャネル コミュニケーションに使用されます。 IHV は、デバイスの 1 つ以上の VF 構成ブロックを定義できます。 各 VF 構成ブロックには、IHV で定義された形式、長さ、およびブロック ID があります。

: 各 VF 構成ブロックからのデータは、PF および VF ミニポート ドライバーによってのみ使用されます。 このデータの形式と内容は、Windows オペレーティング システムのコンポーネントに対して不透明です。

無効な VF 構成データの通知を発行して処理するときに、次の手順が発生します。

  1. ゲスト オペレーティング システムでは、NDISが IOCTL_VPCI_INVALIDATE_BLOCK のI/O 制御要求を発行します。 この IOCTL が完了すると、VF 構成データが変更されたことが NDIS に通知されます。

  2. Hyper-V 親パーティションで実行される管理オペレーティング システムでは、次の手順が実行されます。

    1. PF ミニポート ドライバーは、 NdisMInvalidateConfigBlock 関数を呼び出して、VF 構成データが変更され、有効ではなくなったことを NDIS に通知します。 ドライバーは、どの VF 構成ブロックが変更されたかを指定する ULONGLONG ビットマスクに BlockMask パラメーターを設定します。 ビットマスク内の各ビットは、VF 構成ブロックに対応します。 ビットが 1 に設定されている場合、対応する VF 構成ブロック内のデータが変更されました。

    2. NDIS は、VF 構成ブロック データへの変更について、管理オペレーティング システムで実行される仮想化スタックを通知します。 仮想化スタックは、 BlockMask パラメーターデータをキャッシュします。

      : PF ミニポート ドライバーが NdisMInvalidateConfigBlockを呼び出すたびに、 仮想化スタックは BlockMask パラメーター データとキャッシュ内の現在値とを OR 演算します。

    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_SRIOV_VF_INVALIDATE_CONFIG_BLOCK の OID オブジェクト識別子 (OID) を発行します。 NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO はOID 要求で渡されます。 この構造には、キャッシュされた BlockMask パラメーターデータを含んでいます。

      NDIS は、VF 構成データへの変更の連続した通知を処理する別の IOCTL_VPCI_INVALIDATE_BLOCK 要求も発行します。

    3. VF ドライバーは、OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK 要求を処理するときに NdisMReadConfigBlock を呼び出すことによって、指定した VF 構成ブロックからデータを読み取ることができます。 このプロセスの詳細については、「VF ミニポート ドライバーからのバックチャネル通信」を参照してください。