APIC(Advanced Programmable Interrupt Controller )は、インテルが開発したプログラマブル割り込みコントローラのファミリーです。その名の通り、APICはインテルの8259プログラマブル割り込みコントローラ(PIC)よりも高度な機能を備えており、特にマルチプロセッサシステムの構築を可能にします。これは、マルチプロセッサコンピュータシステムにおける割り込みルーティングの効率性問題を解決するために設計された、いくつかのアーキテクチャ設計の一つです。
APICは分割アーキテクチャ設計で、通常はプロセッサ自体に統合されたローカルコンポーネント(LAPIC)と、システムバス上のオプションのI/O APICで構成されています。最初のAPICは82489DXで、ローカルAPICとI/O APICの両方の機能を備えたディスクリートチップでした。82489DXにより、Intel 486および初期のPentiumプロセッサで対称型マルチプロセッサ(SMP)システムを構築することが可能になりました。たとえば、リファレンスの2ウェイ486 SMPシステムでは、3つの82489DXチップが使用され、2つはローカルAPICとして、1つはI/O APICとして使用されました。P54Cプロセッサ以降、ローカルAPIC機能はIntelプロセッサのシリコンに統合されました。最初の専用I/O APICはIntel 82093AAで、 PIIX3ベースのシステム向けに設計されました。
Intel APICシステムには、ローカルAPIC(LAPIC)とI/O APICの2つのコンポーネントがあります。システム内の各CPUには1つのLAPICが搭載されています。最初の実装(82489DX)では、LAPICはディスクリート回路でしたが、後のIntelプロセッサのシリコンに組み込まれました。システム内の各周辺バスには、通常1つのI/O APICが搭載されています。初期のシステム設計では、LAPICとI/O APICは専用のAPICバスで接続されていました。新しいシステムでは、すべてのAPICコンポーネント間の通信にシステムバスが使用されています。
ディスクリートチップであれCPUに統合されたものであれ、各APICには、その特定のAPIC実装に対応する4ビットのバージョン番号を含むバージョンレジスタがあります。例えば、82489DXのAPICバージョン番号は0ですが、バージョン1はPentium 90および100プロセッサに統合された第1世代のローカルAPICに割り当てられました。[ 1 ]: 3-5
8259 PICを搭載したシステムでは、8259はシステムのブートストラッププロセッサ(BSP)内のLAPIC、システムのI/O APICのいずれか、またはその両方に接続される可能性があります。ただし、論理的には、8259は一度に1つのみ接続されます。
Intel APIC の第 1 世代チップである 82489DX は、Intel 80486および初期の Pentium プロセッサで使用することを想定していましたが、実際には外部ローカル APIC と I/O APIC が 1 つの回路に統合されています。Intel MP 1.4 仕様では、ほとんどの Pentium プロセッサに搭載されている「統合 APIC」とは対照的に、「ディスクリート APIC」と呼んでいます。[ 1 ] : 1-4 82489DX には 16 本の割り込みラインがありました。[ 2 ]また、ISA 割り込みの一部が失われる可能性があるという癖もありました。[ 3 ]
マルチプロセッサ486システムでは、各CPUは独自の82489DXとペアリングする必要がありました。さらに、補助的な82489DXをI/O APICとして使用する必要がありました。82489DXは8259A(XT-PIC)をエミュレートできなかったため、後方互換性のためにこれらも物理的なチップとして含める必要がありました。[ 1 ]: 5-3 82489DXは132ピンPQFPとしてパッケージ化されました。[ 2 ] 1,000個単位で26米ドルで入手可能でした。[ 4 ]
ローカルAPIC(LAPIC)は、SMPシステム内の特定のプロセッサに対するすべての外部割り込みを管理します。さらに、 LAPIC間でプロセッサ間割り込み(IPI)を受信および生成することもできます。1つのLAPICは、I/O APICから最大224個の使用可能な割り込みベクタをサポートできます。ベクタ番号0~255のうち、0~31はx86プロセッサによる例外処理用に予約されています。
P5マイクロアーキテクチャ(P54C)以降のすべてのIntelプロセッサには、ローカルAPICが内蔵されています。[ 5 ] [ 6 ]ただし、P5プロセッサでローカルAPICが無効になっている場合、ソフトウェアで再度有効にすることはできません。この制限は、P6以降のプロセッサではなくなりました。[ 6 ]
Pentium 4 HTとPentium Dの導入により、各CPUコアと各CPUスレッドにLAPICが統合されました。
PCI 2.2以降の仕様におけるメッセージシグナル割り込み(MSI)機能は、ローカルAPICが有効になっていないと使用できません。[ 7 ] MSIを使用すると、I/O APICは不要になります。さらに、MSIモードでは最大224個の割り込みがサポートされ、IRQ共有は許可されていません。[ 8 ] : 10–11
ローカルAPICのもう1つの利点は、インターバルモードとワンオフモードの両方で使用できる高分解能(1マイクロ秒以上)タイマーも提供することです。 [ 6 ]
APIC タイマーは当初、普及に苦労しました。2002 年の Microsoft の文書 (代わりに高精度イベント タイマーの採用を推奨していた) では、LAPIC タイマーの「解像度が低い」ことと、「クロックのシリコンが時々非常にバグが多い」ことを批判していました。 [ 9 ]それにもかかわらず、APIC タイマーは、たとえばプロファイリングが有効になっている Windows 7 や、あらゆる状況で Windows 8 で使用されています。( Windows 8がこのタイマーの独占権を主張する前は、 CPU-Zなどの一部のプログラムでも使用されていました。) Microsoft Windows では、APIC タイマーは共有可能なリソースではありません。[ 10 ]
APIC タイマーによって提供される非周期割り込みは、Linux カーネルのティックレス カーネル 機能で使用されます。このオプションですがデフォルトの機能は、2.6.18 で新しく追加されました。APIC タイマーを備えたコンピュータで有効にすると、カーネルは時刻管理に8253プログラマブル インターバル タイマーを使用しません。[ 11 ] VMwareのドキュメントには、「ソフトウェアにはその周波数を確実に判断する方法がありません。一般的に、ローカル APIC タイマーの周波数を判断する唯一の方法は、PIT または CMOS タイマーを使用して測定することですが、これは近似値しか得られません。」と記載されています。[ 12 ]
I/O APICにはリダイレクトテーブルが含まれており、これは周辺バスから受信した割り込みを1つ以上のローカルAPICにルーティングするために使用されます。初期のI/O APIC(82489DX、SIO.A、PCEB/ESCなど)は16本の割り込みラインしかサポートしていませんでしたが、後の82093AA(PIIX3/PIIX4用の別チップ)は24本の割り込みラインをサポートしていました。[ 8 ]: 10-11これは64ピンPQFPとしてパッケージ化されていました。[ 13 ] 82093AAは通常PIIX3 / PIIX4に接続され、統合されたレガシー8259 PICを使用しました。[ 13 ] ICH1はI/O APICを統合しました。最新のチップセットの統合I/O APICは24本以上の割り込みラインを提供する場合があります。[ 14 ]
Linuxを使用した2009年のIntelベンチマークによると、I/O APICは8259エミュレーション(XT-PIC)と比較して割り込みレイテンシをほぼ3分の1に削減し、MSIを使用するとレイテンシはさらに削減され、XT-PICベースラインと比較してほぼ7分の1になった。[ 8 ]: 19
xAPICはPentium 4で導入されましたが、x2APICはIntelのプログラマブル割り込みコントローラの最新世代であり、2008年11月にNehalemマイクロアーキテクチャで導入されました。 [ 15 ] x2APICの主な改良点は、サポートされるCPUの数とインターフェースのパフォーマンスです。
x2APICはCPUのアドレス指定に32ビットを使用するようになり、物理宛先モードでは最大2³² - 1個のCPUをアドレス指定できるようになりました。論理宛先モードは動作が異なり、クラスタが導入されました。このモードを使用すると、最大2²⁰ - 16個のプロセッサをアドレス指定できます。
改良されたインターフェースにより、プロセッサ間割り込み(IPI)を送信するために必要な APIC レジスタへのアクセス回数が削減されます。この利点により、KVM は物理的に x2APIC をサポートしていない古いプロセッサでも x2APIC をエミュレートすることができ、このサポートはConroe以降のQEMUから、さらには AMD Opteron G シリーズ プロセッサ (どちらもネイティブでは x2APIC をサポートしていません) まで公開されています。[ 16 ] [ 17 ]
APICv は、ゲストの割り込みオーバーヘッドを削減することを目的としたハードウェア仮想化サポートの Intel のブランド名です。APICvは、 Ivy Bridge-EPプロセッサ シリーズで導入され、Xeon E5-26xx v2 (2013 年後半に発売) および Xeon E5-46xx v2 (2014 年初頭に発売) として販売されています。[ 18 ] [ 19 ] AMD はAVICと呼ばれる同様のテクノロジーを発表しました。 [ 20 ] [ 21 ]これは、15h ファミリー モデル 6Xh (Carrizo) プロセッサ以降で利用可能です。 [ 22 ]
APICシステムの実装には、特に8254の接続方法に関して、いくつかの既知のバグが存在します。欠陥のあるBIOSでは、割り込みルーティングが正しく設定されなかったり、ACPIテーブルやIntelマルチプロセッサ仕様(MPS)テーブルが正しく提供されなかったりする可能性があります。
APICは、オペレーティングシステムが適切にサポートしていない場合、システム障害の原因となることもあります。古いオペレーティングシステムでは、I/O APICとローカルAPICを無効にする必要があった場合がよくありました。対称型マルチプロセッサおよびマルチコアシステムの普及により、現在ではこのような操作は不可能ですが、ファームウェアやオペレーティングシステムのバグは今では稀になっています。
AMDとCyrixはかつて、最大32個のプロセッサをサポートする、目的がやや似ているOpenPICアーキテクチャを提案しました。 [ 23 ]少なくとも1995年頃にはIBMとCompaqから宣言的なサポートを受けていました。 [ 24 ]しかし、OpenPICを搭載したx86マザーボードは発売されませんでした。[ 25 ] x86市場でOpenPICが失敗した後、AMDはAMD Athlon以降のプロセッサ向けにIntelのAPICのライセンスを取得しました。
しかし、IBMはOpenPICレジスタ仕様に基づいてマルチプロセッサ割り込みコントローラ(MPIC)を開発しました。 [ 26 ] MPICは、IBMのRS/6000システム[ 27 ]を含むPowerPCベースの設計で使用され、AppleのPower Mac G5s [ 28 ] [ 29 ]でも使用されました。