メッセージシグナル割り込み(MSI )は、専用の割り込みライン上の従来のアウトオブバンド信号を、特別なインバンドメッセージに置き換えることで割り込みをシグナリングする方式です。メッセージシグナル割り込みはデバイスへの実装がより複雑になりますが、割り込み処理性能の向上など、ピンベースのアウトオブバンド割り込みシグナリングに比べていくつかの大きな利点があります。これは、従来の割り込み要求(IRQ)システムなどの従来の割り込みメカニズムとは対照的です。
メッセージシグナル割り込みは、PCIバスのバージョン2.2以降、およびそれ以降にリリースされたPCI Expressバスでサポートされています。一部の非PCIアーキテクチャでも、メッセージシグナル割り込みが使用されています。
従来、デバイスは割り込みライン(ピン)を持ち、ホスト処理環境に割り込みを通知したいときにこれをアサートします。この従来の割り込みシグナリングは、メインデータパスとは別に専用のパスを使用して制御情報を送信するため、帯域外制御シグナリングです。MSIは、これらの専用割り込みラインを帯域内シグナリングに置き換え、メインデータパスを介して割り込みを示す特別なメッセージを交換します。具体的には、MSIでは、デバイスが少量の割り込み記述データを特別なメモリマップドI/Oアドレスに書き込むことができ、チップセットは対応する割り込みをプロセッサに配信します。[ 1 ] [ 2 ] [ 3 ]
MSIに関するよくある誤解は、デバイスが割り込みの一部としてプロセッサにデータを送信できるというものです。メモリ書き込みトランザクションの一部として送信されるデータは、チップセットがどのプロセッサでどの割り込みをトリガーするかを決定するために使用されます。そのデータは、デバイスが割り込みハンドラに追加情報を伝えるために使用することはできません。[ 1 ] [ 2 ] [ 3 ]
例えば、PCI Expressには独立した割り込みピンが全くありません。代わりに、特別なインバンドメッセージを使用して、ピンのアサートまたはデアサートをエミュレートします。一部の非PCIアーキテクチャもMSIを使用しています。別の例として、HP GSCデバイスには割り込みピンがなく、メモリ空間内のプロセッサの割り込みレジスタに直接書き込むことによってのみ割り込みを生成できます。HyperTransportプロトコルもMSIをサポートしています。[ 4 ]
デバイスへの実装はより複雑になるものの、メッセージ信号による割り込みは、ピンベースの帯域外割り込み信号に比べていくつかの大きな利点があります。機械的な面では、ピン数が少ないため、コネクタがよりシンプルで安価、かつ信頼性が高くなります。これは標準のPCIコネクタには当てはまりませんが、PCI Expressはこの利点を活用しています。
MSIは、可能な割り込みの数を増やします。従来のPCIはカードごとに4つの割り込みに制限されていましたが(そして、それらはすべてのカードで共有されていたため、ほとんどのカードは1つしか使用していません)、メッセージシグナル割り込みは、必要に応じてカードごとに数十の割り込みを可能にします。[ 1 ]
パフォーマンス面でも若干のメリットがあります。ソフトウェアでは、ピンベースの割り込みがメモリへの書き込みと競合する可能性があります。つまり、PCI デバイスがメモリにデータを書き込み、その後、DMA書き込みが完了したことを示す割り込みを送信します。しかし、PCI ブリッジまたはメモリコントローラは、他のメモリ使用に干渉しないように書き込みをバッファリングする場合があります。割り込みは DMA 書き込みが完了する前に到着し、プロセッサがメモリから古いデータを読み取ってしまう可能性があります。[ 5 ]この競合を防ぐために、割り込みハンドラはデバイスから読み取り、DMA 書き込みが完了したことを確認する必要がありました。この読み取りには、中程度のパフォーマンス低下がありました。MSI 書き込みは DMA 書き込みを通過できないため、競合は解消されます。[ 6 ]
PCIは、メッセージシグナル割り込み(MSI)とMSI-Xという2つのオプション拡張機能を定義しています。PCI Expressは、従来のPCI割り込みをエミュレートするための独自のメッセージベースのメカニズムを定義しています。
MSI(PCI 2.2で初めて定義)では、デバイスが1、2、4、8、16、または32個の割り込みを割り当てることができます。デバイスには、書き込み先のアドレス(このアドレスは通常、割り込みコントローラの制御レジスタ)と、それを識別するための16ビットのデータワードがプログラムされます。割り込み番号は、割り込みを識別するためにデータワードに追加されます。[ 1 ] Windowsなどの一部のプラットフォームでは、32個の割り込みすべてを使用せず、最大16個の割り込みのみを使用します。[ 7 ]
MSI-X (PCI 3.0 で最初に定義) では、デバイスが最大 2048 個の割り込みを割り当てることができます。オリジナルの MSI で使用されていた単一のアドレスは、一部のアーキテクチャでは制限的であることがわかりました。特に、個々の割り込みを異なるプロセッサにターゲットすることが難しく、これは一部の高速ネットワーク アプリケーションで役立ちます。MSI-X では、より多くの割り込みを許可し、それぞれに個別のターゲット アドレスとデータ ワードを与えます。MSI-X を備えたデバイスが必ずしも 2048 個の割り込みをサポートするとは限りません。[ 3 ] [ 8 ] [ 9 ] [ 10 ]
MSIのオプション機能(64ビットアドレッシングと割り込みマスキング)も、MSI-Xでは必須となります。
PCI Expressには物理的な割り込みピンはありませんが、Assert_INTAやDeassert_INTCなどの専用のPCI Expressメッセージを介して、PCIの4つの物理割り込みピンをエミュレートします。このメカニズムは(PCI Expressレイヤーで)メッセージベースであるため、PCIレイヤーのMSIメカニズムの利点の一部を提供しますが、すべてではありません。デバイスごとに4つの仮想ピンがバス上で共有されなくなり(ただし、PCI Expressコントローラは内部的に従来の割り込みを組み合わせる場合があります)、割り込みの変更が本質的に競合状態にならないようになります。
PCI Expressでは、デバイスがこれらの従来の割り込みメッセージを使用することが許可されており、PCIドライバとのソフトウェア互換性が維持されますが、PCIレイヤーでMSIまたはMSI-Xもサポートする必要があります。
Intel システムでは、単一プロセッサ (シングル コア) システムであっても、PCI (および PCI Express) MSI/MSI-X を動作させるにはLAPIC を有効にする必要があります。 [ 11 ] [ 12 ]これらのシステムでは、割り込みを処理する必要のあるプロセッサ/コアの LAPIC に割り込みベクタを直接書き込むことで MSI が処理されます。2009 年の Intel LAPIC は、最大 224 個の MSI ベースの割り込みをサポートしていました。[ 12 ] Linuxを使用した 2009 年の Intel ベンチマークによると、MSI を使用すると、I/O APIC 配信と比較して割り込みのレイテンシがほぼ 3 分の 1 に削減されました。[ 13 ]
Microsoft ファミリーのオペレーティングシステムでは、Windows Vista以降のバージョンは MSI と MSI-X の両方をサポートしています。サポートはLonghorn開発サイクルで 2004 年頃に追加されました。 [ 14 ] MSI は、 Windows XPやWindows Server 2003などの以前のバージョンではサポートされていません。[ 15 ]
2005年にリリースされたSolaris Express 6/05では、新しいデバイスドライバインターフェイス(DDI)割り込みフレームワークの一部として、MSIとMSI-Xのサポートが追加されました。[ 16 ]
2008年にリリースされたFreeBSD 6.3と7.0では、MSIとMSI-Xのサポートが追加されました。[ 17 ]
2011年にリリースされたOpenBSD 5.0ではMSIのサポートが追加されました。[ 18 ] 6.0ではMSI-Xのサポートが追加されました。[ 19 ]
Linux は2003 年頃に MSI および MSI-X のサポートを獲得しました。[ 20 ] Linux カーネルのバージョン 2.6.20 より前のバージョンでは、MSI/MSI-X の実装に深刻なバグや制限があることが知られています。[ 21 ]
Haikuは2010年頃にMSIのサポートを獲得しました。[ 22 ] MSI-Xのサポートはその後、2013年に追加されました。[ 23 ]
2018年にリリースされたNetBSD 8.0では、MSIおよびMSI-Xのサポートが追加されました。
VxWorks 7はMSIおよびMSI-Xをサポートしています。
{{cite book}}:|work=無視されました (ヘルプ){{cite book}}:|work=無視されました (ヘルプ){{cite book}}:|work=無視されました (ヘルプ)