PCIでは複数のデバイスで同じIRQが使えるそうですが,なぜですか。また,どうしてISAバスでは同じ割り込みが使えないのでしょうか。
割り込みの共有と衝突のトラブルは,ハードウェアとともにソフトウェアが大きくかかわっているため,かなり複雑な問題になっています。実は,PCIバスが割り込みを共有できることと,IRQを共有できることは意味がまったく異なるのです。そこでまず,PCIの割り込みについて概略を説明していきましょう。
●PCIバスで割り込みを共有できてISAバスではできない理由
PCIはプラットフォーム非依存のシステムバスなので,割り込みもプラットフォームに依存していません。
PCIバスには,INTA#,INTB#,INTC#,INTD#という4本の割り込みラインが設けられています。これらの割り込みを,各プラットフォームが利用する方法は自由です。
各スロットの割り込みラインは,PCIバスコントローラに1対1で接続されていますから,例えばスロット1のINTA#とスロット2のINTA#は異なる信号線です。したがって,スロット1とスロット2のカードがともにINTA#を使用しても何の問題も起きません。
また,PCI割り込みは仕様で「ワイアードOR」(1本の線を二つ以上のデバイスで使用できる電気的仕様)かつ「レベルトリガ」(図)と定められていますから,1個の割り込みラインを複数のデバイスでコントロールできます(ただし,PCIでは1枚のカード内に5個以上の機能を持つ特殊なカード以外で割り込みラインが共有されることはありません)。ですから,PCIでは割り込みが共有されていても何の問題も発生しないのです。
一方,ISAバスの割り込みは,インテルの割り込みコントローラLSIであるi8259をカスケード接続して得られるIRQ0〜15をそのまま用いているという電気的仕様のため,1個の割り込みラインに複数のカードが設定できません。また,ISAバス仕様でIRQがレベルトリガに定められていますから,仮に1個のIRQに複数のカードを設定可能だとしても,正常な動作が期待できないのです。
●PCI割り込みとIRQの超複雑な関係
さきほど,PCIの割り込みがプラットフォーム非依存だと述べました。PCでは,PCI割り込みが最終的に,PC/AT標準のi8259のIRQ0〜15のどれかに割り当てられます。この割り当てと割り込みの変換を行っているのが「割り込みルーター」と呼ばれる回路です。現在の割り込みルーターは大部分が,割り込みのルーティングをプログラマブルに行えるようになっており,BIOSで設定できることはご存じのとおりです。
割り込みルーターは柔軟にPCI割り込みをIRQに割り当てることができます。例えば,スロット1のINTA#をIRQ10に,スロット2のINTA#をIRQ11に,という具合に各スロットが重ならないように設定すれば,割り込みの共有は発生しません。しかし,PCIバスにカードを多く取り付けているユーザーが上記のように設定していくと,必ずIRQが足りなくなります。
そこで,割り込みルーターは,例えばスロット1とスロット2のINT#Aを両方ともIRQ10に割り当てるという共有設定が可能で,このとき割り込みルーターは2個のPCI割り込みを1個のIRQのエッジトリガ割り込みに変換してくれます。このような設定を行えばIRQの不足は避けられますが,1個のIRQに2個のデバイスが接続されている「IRQの共有状態」になるわけです。
●最終的にはデバイスドライバがカギ
割り込みを処理するのはOSのデバイスドライバです。したがって,デバイスドライバが複数のデバイスからくる1個の割り込みを正常に処理できれば,割り込みの共有が可能と理解してください。
WindowsNTのデバイスドライバは割り込みの共有を完全な形でサポートします。ですから,PCIバスの割り込みをIRQで共有するように設定しても正常に動作します。
一方,Windows 95の現行バージョンにはやや制限があります。プロテクトモードドライバ(32ビットドライバ)間では割り込みの共有をサポートしますが,リアルモードドライバでは割り込みの共有動作が保証されません。また,リアルモードドライバとプロテクトモードドライバ間では機構的に割り込みの共有ができない仕組みになっています。したがって,PCIバスの割り込みを1個のIRQで共有する設定にすると,リアルモードドライバが関与しているときは,トラブルが発生します。ですから,Windows 95ユーザーは可能な限り,IRQが重ならないように設定したほうが安全でしょう。
この制限はOSR2以降のバージョンでは緩和されており,Windows 98では制限がなくなる予定です。とはいえ,前述のようにISAバスカード同士でのIRQ共有は(バス仕様上)不可能で,共有設定が可能なのはPCIデバイス同士(あるいはISAバスとPCIバス間)に限られているので気をつけてください。
(米田 聡)
図 エッジトリガとレベルトリガ