割り込みリソース記述子の使用

プラグ アンド プレイ (PnP) マネージャーは、2 つのパスを使用して割り込みメッセージをデバイスに割り当てます。 まず、PnP マネージャーは、デバイスに割り当てる予定の割り込みメッセージを含むハードウェア リソースのリストとともに、ドライバーに IRP_MN_FILTER_RESOURCE_REQUIREMENTS 要求を送信します。 ドライバーはこのリストを変更し、割り込みメッセージの数やメッセージごとの設定を変更することができます。 その後、PnP マネージャーは実際にリソースを割り当てた後、IRP_MN_START_DEVICE 要求を送信し、ドライバーのデバイスに割り当てられた割り込みメッセージを含むハードウェア リソースの完全なリストを提供します。

IRP_MN_FILTER_RESOURCE_REQUIREMENTS 要求は、IO_RESOURCE_DESCRIPTOR 構造体のリストを提供します。 デバイスに PCI 2.2 仕様で定義されている MSI (メッセージシグナル割り込み) 機能構造がある場合、PnP マネージャーは単一の割り込みメッセージ記述子を提供します。 デバイスに PCI 3.0 仕様で定義されている MSI-X 機能構造がある場合、PnP マネージャーは割り込みメッセージごとに 1 つの構造体を提供します。 割り込みメッセージ記述子には Type = CmResourceTypeInterruptFlags = CM_RESOURCE_INTERRUPT_LATCHED |CM_RESOURCE_INTERRUPT_MESSAGE があります。 ドライバーは、構造体の u.Interrupt メンバーを変更することで、割り込みアフィニティなどの設定を変更することもできます。 MSI を使用する場合、割り込みはすべて同じアフィニティを持ちますが、MSI-X を使用する場合は異なるアフィニティを持つことができます。 詳しくは、「割り込みアフィニティと優先順位」を参照ください。

MSI の場合、PCI 2.2 で定義されているように、u.Interrupt.MaximumVector - u.Interrupt.MinimumVector + 1 はデバイスに割り当てられた割り込みメッセージの数です。 ドライバーは、u.Interrupt.MinimumVector を変更することで割り込みメッセージの数を変更できます。 MSI 割り込みメッセージの場合、u.Interrupt.MaximumVector は常に CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN です。 MessageCount 割り込みメッセージを割り当てるには、u.Interrupt.MinimumVector を CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN - MessageCount + 1 に設定します。

MSI-X の場合、PCI 3.0 で定義されているように、ドライバーは、リストにエントリを追加または削除することによって割り当てられた割り込みメッセージの数を変更できます。 この方法で追加された割り込みメッセージ リソースは、その後、IRP_MN_START_DEVICE 要求に応答して削除しないでください。 MSI-X の場合、PnP マネージャーはメッセージ割り込みごとに 1 つの記述子を提供し 、この記述子の u.Interrupt.MinimumVector メンバーと u.Interrupt.MaximumVector メンバーの両方が CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN に設定されます。

プラグ アンド プレイ マネージャーは、割り込みメッセージを含むデバイスのすべてのハードウェア リソースを割り当てると、IRP_MN_START_DEVICE 要求をドライバーに送信します。 この要求では、CM_PARTIAL_RESOURCE_DESCRIPTOR 構造体の 2 つのリストが提供されます。1 つは生のリソースと変換されたリソースに対してそれぞれ 1 つです。 割り込みメッセージの場合、PnP マネージャーは、割り当てられたメモリ アドレスごとに Type = CmResourceTypeInterruptFlags = CM_RESOURCE_INTERRUPT_LATCHED | CM_RESOURCE_INTERRUPT_MESSAGE を持つ構造体を 1 つ提供します。

MSI を使用する場合、すべてのメッセージが同じアドレスを共有するため、ドライバーは割り込みリソース記述子を 1 つだけ受け取ります。 u.MessageInterrupt.RawMessageCount メンバーを使用して、割り当てられたメッセージの数を決定できます。 MSI-X を使用する場合、ドライバーは割り込みメッセージごとに個別のリソース記述子を受け取ります。

Windows 8 では、オペレーティング システムは、デバイス機能ごとに 2048 を超える割り込みメッセージに対するリソース要求をサポートしていません。 Windows 7 および Windows Vista では、オペレーティング システムは、デバイス機能ごとに 910 を超える割り込みメッセージのリソース要求をサポートしていません。 デバイス ドライバーがこの制限を超えると、デバイスの起動に失敗する可能性があります。 ドライバーが多数の論理プロセッサを含むコンピューターで動作できるようにするには、プロセッサごとに複数の割り込みを要求しないようにする必要があります。

割り込みリソースのシステム再調整中に、PnP マネージャーは、リソース要件のリストから代替割り込みリソースの優先セットを選択するようにドライバーに求める場合があります。 ただし、PnP マネージャーは、常にドライバーが望むリソースを割り当てることはできません。 そのため、ドライバーは、リソース要件のリストから代替割り込みリソースのセットを割り当て、エラーなく許容する必要があります。 たとえばデバイスには、デバイスが要求したよりも少ない数のメッセージ割り込みが割り当てられている可能性があります。 最悪の場合、ドライバーは、1 つのラインベースの割り込みだけでデバイスを操作する準備をする必要があります。