アピック【APIC】
APIC
読み方:エーピーアイシー
APICとは、PIC(Programmable Interrupt Controller)をより高度化させ、複雑な構造と大規模な出力を備えた割り込みコントローラのことである。SMP(Symmetric Multi-Processor)システムで用いられる。Intelのx86アーキテクチャのマイクロプロセッサに搭載されている割り込みコントローラとして知られている。
APIC
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2026/03/22 00:13 UTC 版)
APIC(えいぴっく)はAdvanced Programmable Interrupt Controllerの略で、インテルにより開発された、x86アーキテクチャにおける割り込みコントローラのことである。
それまでのLegacyの割り込みコントローラとして知られるPIC (Programmable Interrupt Controller) 、具体的には8259に対し、マルチプロセッサ対応、プライオリティ制御などの機能が付加されている。APICはインテルアーキテクチャの進歩と共に高機能化しており、いくつかのバージョンが存在する。
概要
APICにはプロセッサコアに内蔵されるLocal APICと、I/Oからの割り込みを管理するIOAPICの2種類が存在する[1]。Local APICとIOAPICは独自のプロトコルで通信を行い、割り込みの通知を行う。Pentium Pro世代では、APIC Busと呼ばれる割り込み専用のバスが使用されていたが、NetBurst世代以降、APIC Busは廃止され、FSBを介して割り込みの通知が行われる。
Local APIC
コア内部に実装され、外部からの割り込みの全てを管理する。I/Oからの割り込み以外にもIPI (Inter-Processor Interrupt) と呼ばれる、マルチプロセッサによる割り込みを使用したCPU間通信にも使用される。
IOAPIC
IOAPICはI/Oデバイスから受け取った割り込みを、CPUへ通知するためのリダイレクション・テーブルを持つ。
全てのI/O割り込みは一旦IOAPICで受信される。IOAPICは、オペレーティングシステム (OS) やBIOSによって適切に設定されたリダイレクション・テーブルを参照し、それに従いCPUに割り込みの通知を行う。 リダイレクション・テーブルには、エッジ/レベル・トリガーの種別、割り込みベクタ(優先度)、割り込み先CPUなどの設定が可能である。
変遷
- 8259 PIC(レガシー割り込みコントローラ)
- APICの前身は、1970年代にインテルが開発した8259 PIC(Programmable Interrupt Controller)である。8259はシングルプロセッサ環境を前提に設計されており、2つの8259をカスケードすることで最大15本の割り込み線(IRQ)をサポートする。マルチプロセッサへの対応や柔軟な割り込み制御の面で限界があり、より高機能なコントローラの必要性が生じた。
- 82489DX(外付けAPIC)
- 486世代のマルチプロセッサシステムでは、APICの機能を外付けチップ「82489DX」として実装していた。Local APICとI/O APICの両方の役割として設定可能な汎用チップであり、マザーボード上に別途搭載する必要があった。
- APIC(P5 / Pentium世代)
- Pentium世代からLocal APICがプロセッサコアに内蔵されるようになった。これにより外付けチップが不要となり、IOAPICとの通信には専用のAPIC Busが使用された。
- xAPIC(P6 / NetBurst世代)
- Pentium Pro(P6)世代でAPICの仕様が拡張され、xAPICとして整備された。当初はAPIC Busを継続使用していたが、NetBurst世代以降はAPIC Busが廃止され、フロントサイドバス(FSB)を経由した割り込み通知に移行した。またNetBurst後期には、各CPUが自身の割り込み処理優先度をFSB経由でチップセットに通知する機能が追加され、マルチプロセッサ環境での割り込み分散制御が可能となった。
- x2APIC(Nehalem世代以降)
- Nehalem世代で導入されたx2APICは、従来のメモリマップドI/Oではなく、MSR(Model Specific Register)経由でLocal APICを操作する方式に変更された。これによりアクセスの高速化が図られたほか、APIC IDのビット幅が8ビットから32ビットに拡張され、理論上は数百以上のプロセッサを持つ大規模システムにも対応可能となった。またDirected EOI機能により、EOI通知をより精密に制御できるようになっている。
特徴
以下に、PCIをI/Oデバイスに持つ一般的なIA-32アーキテクチャにおける、実装、割り込み時の振る舞いを例として解説する。
実装
PCIバスにおいては、1本のバスにはINT_A,B,C,Dの、最大4本のI/O割り込み線が存在し、それら割り込み線はIOAPICに接続される。IOAPICには、それぞれの割り込み線に対するリダイレクション・テーブルが割り当てられており、割り込み種別、割り込みベクタなど、CPUのLocal APICと通信を行うための設定がなされる。
I/Oデバイスの数が多い場合、4本の割り込み線では足りずに、1本の割り込み線を複数のI/Oデバイスで共有する場合がある。これらの管理もIOAPICが負っている。なお、IOAPICはシステムで複数存在していてもかまわない。
PCI 2.2以降の仕様で導入されたMSI(Message Signaled Interrupts) をサポートするデバイスは割り込み線もIOAPICも使用せず、CPUのLocal APICアドレス空間に直接メッセージを書き込む形で割り込みを通知する
動作
IOAPICがPCIの割り込み信号の変化を検知すると、リダイレクション・テーブルに従い、CPUに対し割り込みメッセージを発行する。CPUのLocal APICがこれを受信すると、自CPUの割り込み処理の状態、優先度などをチェックし、割り込みハンドラをコールする。 割り込みハンドラは、割り込みを発生させたI/Oデバイスをチェックし、割り込み信号通知を停止させ、それぞれの処理に入る。
一連の割り込み処理が完了すると、CPUはLocal APICのEOIレジスタにEOI (End of Interrupt)を書き込み、レベルトリガーの場合はLocal APICがさらにIOAPICへ通知する
なおこの時、PCIデバイスより依然として当該割り込み信号による通知が行われている場合、即座に再度CPUに対して割り込みを発行する。 これらの一連の動作により、割り込みのロスト防止、割り込み線の共有制御などが行われる。
プライオリティ制御
高い優先度の割り込み処理を実行しているCPUに対し、低い優先度の割り込みを通知しても、その処理は一旦待たされる。であれば、割り込み処理を行っていない、または低い優先度の割り込み処理を行っているCPUに割り込みを通知すべきである。
NetBurst世代後期のLocal APICには、割り込み処理に出入りするたびに、その割り込み優先度を、FSBを介して定期的にチップセットに通知する機能が実装されており、OSがこの機能を利用して、マルチプロセッサ・システムでの適切な割り込み分散が可能となっている。ただし、本機能に対応したIOAPICおよび、ノースブリッジが必要とされる。
注
- ^ 486ベースのマシンではどちらも外付けの82489DXに内蔵されていた(PCのスケーラビリティを決定付けた超重要コンポーネント、地味にスゴイ「APIC」の登場)。
- a PICのページへのリンク