
Intel 8259は、 Intel 8080およびIntel 8085マイクロプロセッサ向けに設計されたプログラマブル割り込みコントローラ(PIC)です。最初の製品は8259で、後の8259Aは上位互換性があり、8086または8088プロセッサで使用できました。8259は、複数の割り込み入力ソースを単一の割り込み出力に統合してホストマイクロプロセッサに送り、プロセッサチップ上の1つまたは2つのレベルを超えてシステムで使用可能な割り込みレベルを拡張します。8259Aは、初代IBM PCおよびIBM PC ATのISAバスの割り込みコントローラでした。
8259 は、1976 年に Intel のMCS 85ファミリーの一部として導入されました。8259A は、1981 年に導入された初代 PC に搭載され、 1983 年に導入されたPC/XTにも搭載されました。2 つ目の 8259A は、 PC/ATの導入に伴って追加されました。8259 は、対称型マルチプロセッサPCに導入されて以来、Intel APIC アーキテクチャと共存してきました。現代の PC では、Intel APIC アーキテクチャを優先して 8259A の段階的廃止が始まっています。しかし、もはや独立したチップではありませんが、8259A インターフェースは、現代のx86マザーボードのプラットフォームコントローラハブまたはサウスブリッジによって引き続き提供されています。[ 1 ]
8259の主な信号ピンは以下のとおりです。IRQ0~IRQ7の8本の割り込み要求入力線、INTRの割り込み要求出力線、INTAの割り込み確認線、割り込みレベルまたはベクタオフセットを伝達するためのD0~D7のピン。その他、8259をカスケード接続するためのCAS0~CAS2のピンがあります。
最大8台のスレーブ8259をマスター8259にカスケード接続することで、最大64個のIRQを提供できます。8259のカスケード接続は、1台のスレーブ8259のINTラインを1台のマスター8259のIRQラインに接続することで行います。
割り込み終了(EOI)操作は、特定EOI、非特定EOI、および自動EOIをサポートします。特定EOIは、ISR内で確認応答するIRQレベルを指定します。非特定EOIは、ISR内のIRQレベルをリセットします。自動EOIは、割り込みが確認された直後にISR内のIRQレベルをリセットします。
8259Aは、エッジ割り込みとレベル割り込みのトリガーモードをサポートしています。固定優先度モードと回転優先度モードもサポートしています。
8259は、8080/8085または8086/8088と連携するように構成できます。8086/8088では、割り込みが発生すると、割り込みコントローラがデータバス上に割り込み番号を出力します。8080/8085の割り込みサイクルでは、データバス上に3バイト(8080/8085命令セットのCALL命令に対応)が出力されます。
8259Aは、8259と比較して追加機能(特にバッファードモードとレベルトリガーモード)を提供し、8259との上位互換性があります。

マザーボード。]]
MS-DOSやWindowsと連携して8259をプログラミングすることは、後方互換性のために多くの混乱を招く問題を引き起こしており、その問題は1981年の初代IBM PCにまで遡る。
IBM PC互換機の場合、BIOSはマスター8259の割り込み要求IRQ0~IRQ7を割り込みINT 08~INT 0Fhにマッピングします。IBM PC/ATのスレーブ8259が存在する場合、割り込みINT 70~INT 77hにマッピングされます。これは、最初の32個の割り込みベクタ(INT 00~INT 1F)がプロセッサによって内部例外用に予約されているにもかかわらず行われました。このため、後のチップでは、番号の小さいベクタのハンドラは、次の3つの原因を区別する必要がありました。
このため、BIOSを使用しないほとんどのオペレーティングシステムは、予約済みベクタ範囲を完全に回避するように割り込みコントローラを構成します。保護モードでは、OSはINT命令の使用を特定のベクトルのみに制限できます(たとえば、Linuxはシステムコール用にINT 80hを公開しています)。許可されていないベクタを使用しようとすると、保護違反が発生します。
これにより、割り込みベクタハンドラにおける原因特定作業の一部は不要になりますが、不要な割り込みやIRQの共有によって問題が複雑化する可能性があります。幸いなことに、ほとんどの周辺機器は未処理のIRQに関して照会できるため、発生源が見つからない場合は、割り込みを不要なものとして扱うか、完全に無視することができます。
他のほとんどのオペレーティングシステムではデバイスドライバの要求仕様の変更が可能なため、Auto-EOIなどの他の8259動作モードを使用できます。これは、8259との通信時にI/Oアドレス空間の遅延にかなりの時間を費やす可能性がある最新のx86ハードウェアにとって特に重要です。また、これにより、8259を搭載したマルチプロセッサx86システムにおいて、クリティカルセクションなどの同期に関する多くの最適化が可能になります。
ISAバスはレベルトリガー割り込みをサポートしていないため、ISAデバイスに接続された割り込みにはレベルトリガーモードを使用できません。つまり、PC/XT、PC/AT、および互換システムでは、8259をエッジトリガーモードにプログラムする必要があります。MCAシステムでは、デバイスはレベルトリガー割り込みを使用し、割り込みコントローラは常にレベルトリガーモードで動作するようにハードワイヤリングされています。新しいEISA、PCI、およびそれ以降のシステムでは、エッジ/レベル制御レジスタ(ELCR)がIRQラインごとにモードを制御するため、ISAバスを備えたこれらのシステムでは、8259のモードは実質的に関係ありません。ELCRは、システム起動時にBIOSによってプログラムされ、正しく動作します。
ELCRは、x86 I/Oアドレス空間の0x4d0と0x4d1に配置されています。ELCRは8ビット幅で、各ビットは8259からのIRQに対応しています。ビットがセットされている場合、IRQはレベルトリガモードになり、そうでない場合はエッジトリガモードになります。
8259は、いくつかの条件に応じて偽の割り込みを生成します。
1つ目は、IRQラインが確認応答される前にデアサートされるケースです。これは、IRQライン上のノイズが原因で発生する可能性があります。エッジトリガモードでは、ノイズによってラインが100ナノ秒の間ロー状態に維持される必要があります。ノイズが減少すると、プルアップ抵抗によってIRQラインがハイ状態に戻り、誤った割り込みが発生します。レベルトリガモードでは、ノイズによってシステムのINTRラインの信号レベルが高くなることがあります。システムが確認応答要求を送信すると、8259は解決すべき処理がないため、応答としてIRQ7を送信します。この最初のケースでは、誤ったIRQ7が発生します。
8259 のマスク解除と IRQ 入力のデアサートが適切に同期されていない場合にも、同様のケースが発生する可能性があります。多くのシステムでは、IRQ 入力は I/O 書き込みによってデアサートされますが、プロセッサは書き込みが I/O デバイスに到達するまで待機しません。プロセッサが処理を続行し、IRQ 入力がデアサートされる前に 8259 の IRQ のマスクを解除すると、8259 は再び INTR をアサートします。プロセッサがこの INTR を認識し、8259 から IRQ を読み取るための確認応答を発行するまでに、IRQ 入力がデアサートされ、8259 は誤った IRQ7 を返します。
2つ目は、割り込み応答の立ち下がりエッジでスレーブ8259のIRQラインが非アクティブになっているときに、マスター8259のIRQ2がアクティブハイになっている場合です。この2つ目のケースでは、誤ったIRQ15が発生しますが、まれです。
PC/XT ISAシステムには8259コントローラが1つ搭載されていましたが、PC/AT以降のシステムにはマスターとスレーブの2つの8259コントローラが搭載されていました。IRQ0~IRQ7はマスター8259の割り込み線、IRQ8~IRQ15はスレーブ8259の割り込み線です。8259のピンのラベルはIR0~IR7です。IRQ0~IRQ15は、8259が接続されているISAバスのライン名です。