Advanced Configuration and Power Interface

Advanced Configuration and Power Interface（アドバンスド・コンフィグレーション・アンド・パワー・インターフェイス、ACPI）は、1997年にインテル、東芝、マイクロソフトが共同で作り上げた、PC/AT互換機等の電源制御と構成要素に関する公開された統一規格である。ACPI2.0（2000年8月に公開）からはさらにコンパック（現ヒューレットパッカード）、フェニックステクノロジーズが主な開発団体として参加している。 ACPIは電源管理のための枠組であるだけではなく、プラットフォームの構成要素を列挙し管理する統一された枠組でもあり、プラットフォームの電源管理を行うAPMのみならず、マザーボード上のリソースを列挙するPnPBIOS,マルチプロセッサの列挙を行うMPTable等をも統一した形で置き換えるものである。これらはBIOS主導の管理方式だったが、ACPIはオペレーティングシステム主導の管理を実現し、システム全体の電源管理だけでなく緻密なデバイスの電源をも含めた管理に加え、温度管理やスタンバイ[要曖昧さ回避]（サスペンド）、冷却ファン制御など、さまざまな機能を提供する。また、マルチプロセッサや16ビットコードの呼び出しにくい64ビットのプロセッサ、CPUの速度制御も可能になり、最近ではノートパソコンだけでなくデスクトップやワークステーション、サーバに関しても使用される局面が多くなった。 必要の無いデバイスへの電源供給を停止したり、使用しないときは自動的にスタンバイ（サスペンド）したりすることにより消費電力を抑えられる。これによりノートパソコンではバッテリーの持続時間が飛躍的に長くなった。 実装の複雑さ、およびオペレーティングシステムとの競合で問題が出やすいため、最近ではAPMをサポートせずACPIのみのBIOSが増えてきている。 ACPIはACPI ハードウエアレジスタ・ACPI BIOS・ACPI テーブルおよびACPI Machine Language (AML) の構成要素を持つ。 ACPI BIOS ACPI テーブルを初期化し、OS起動後は必要とされる機会は少ないが（IA-32の場合はシステムマネジメントモードを通すことにより）必要に応じて動作する。APMとは違い、電源イベントは主にオペレーティングシステム側に見える割り込みとして伝わって来る。メモリマップ取得BIOSコールInt 15H AX=E820HはOSが後述のACPIテーブルを意識せずに書き潰さないようにするために、ACPIのテーブル等を含むメモリをOSに通知する必要がある。 ACPI テーブル メモリ (RAM) 上に置かれたデータ構造で、システムの初期化に必要なデータが拡張性の高い形で並べられている。 大きな構造は、下位1MBの16ビットモードからもアクセス可能ないわゆるBIOSエリア等の何処かに16バイト整列されたRSDP (Root System Description Pointer) と呼ばれる構造体がある。RSDPは、RSDT (Root System Description Table) もしくはXSDT (eXtended System Description Table) と呼ばれるメモリ構造を指す。RSDTは様々なテーブルへのポインタを含み、XSDTはその64ビットメモリ空間対応版である。それに含まれているテーブルで最も重要なものはFixed ACPI Control Pointer (FACP) またはFixed ACPI Description Table (FADT)と呼ばれるポインタで、ここにACPIハードウエアレジスタの位置や、FACS (Firmware ACPI Control Structure) と呼ばれるBIOSとの排他制御やサスペンドリジューム時にBIOSとのやりとりに使うメモリの位置、そしてDifferentiated System Description Table (DSDT) と呼ばれる後述のAML (ACPI Machine Language) で記述されたシステム上のデバイス等の情報の入ったメモリブロックの位置を指し示す。非常に柔軟なので基本的には以上に挙げたもので必要な情報はほぼ記述可能であるが、DSDTの解釈はオーバーヘッドが大きく、ブートの初期に必要なもの等に関してはRSDTもしくはXSDTの他のエントリを使って特別に記述されているものがある。RSDP以外のメモリブロックは、（PCの場合のBIOS呼出Int15H AX=E820Hのような）システムのメモリマップ取得で予約される領域に置かれ、英文字4文字のシグネチャを持つ。 XSDTに置かれることのある他のテーブルをシグネチャとともにACPI spec 4.0bから列挙する。 SSDT (SSDT : Secondary System Description Table) DSDTの補足として使われるAMLで記述されたデバイスなどの情報。 APIC (MADT : Multiple Apic Description Table) システムにあるAPICの情報を記述したテーブル。MPTablesと同等の情報を提供するが、より高機能でハイパースレッディング対応した機械の場合必ず存在する。 ECDT (ECDT : Embedded Controller Description Table) エンベデッドコントローラデバイスの（使用I/Oポート等の）情報を記述したテーブル。DSDT内でもデバイスとして定義されており、ACPI1.0の頃はこのテーブルは定義されていなかったが、他のACPIのデバイス記述がこれによってアクセス可能なリソースを使用するため初期化順の解決が困難であった。 TCPA (Trusted Computing Platform Alliance Capability Table) トラステッド・コンピューティング・グループによって定義されたメモリテーブルで、ブートシーケンスの妥当性を検証するためのデータへのポインタを含むテーブル。 MCFG (PCI Express memory mapped configuration space base address Description Table) PCI Expressのアクセスメモリ空間の場所、バス番号の範囲などを示すテーブル。 等のようなものがある。 AML プラットホームから独立した中間言語列でACPI Source Language (ASL) から生成され、これをオペレーティングシステムが解釈することで、高度な機能を実現する。木構造の名前空間やサブルーチン呼出や繰り返しなどの制御構造を持ち、デバイスはその木構造の名前空間の中にあるオブジェクトとして表現され、その識別の枠組に関しては、使用される識別用IDや、使用リソースの記述に使われるデータ構造等の点でPnPBIOSの特徴を受け継いでいる。 このように、高級言語により、OSのブートに使われる構成情報を記述するものにOpen Firmwareがあるが、Open Firmwareと違い、解釈を行うのはOSのコンテクストでありインタプリタをOSに内蔵する必要がある。 システムスリープ状態はS0・S0ix・S1・S2・S3・S4・S5の7状態が定義されており、深いスリープ状態ほど復帰への時間がかかるが、待機時の電力消費は少ない（なお、直接の関係は無いが、アイドル時のプロセッサのスリープ状態Cxやデバイスのスリープ状態Dxというものも別に定義されている）。 S0 通常の運用状態。 S0ix Modern Standby。 S1 スタンバイとよばれるメモリ、デバイス、レジスタコンテクストおよびキャッシュコンテクストをCPUが保持したまま割り込み等を止め、低消費電力状態に移行する状態である。タイマの復帰などを電源管理イベントとして扱い処理する程度で矛盾無く復帰可能である。 S2 デバイスなどのコンテクストが保存されているのはS1と同様であるが、レジスタコンテクストとキャッシュコンテクストが失われているためS3と同様の方式で復帰する必要がある（ほとんど実装されている事例を見ない）。 S3 Suspend to RAMまたはスリープと呼ばれる状態で、メモリは保持されているが、チップセットの情報やレジスタコンテクストが失われる。サスペンドに入る前にOSはレジスタコンテクストをメモリに書き出し、16ビットコードの復帰ベクタをFACSの然るべき場所に書いておく。復帰はリセット状態から復帰し、BIOSがサスペンド状態であったことを検知して初期化を行った後復帰ベクタへ移行する。その後復帰ベクタからプロテクトモードへの復帰などを行って最終的にレジスタを書き戻して運用状態に復帰する。 S4 Suspend to Diskまたはハイバネーションと呼ばれる状態で、メモリ内容も失われる。メモリをディスクに書き出し、電源断状態にするのと同じである。初期は書き出し復帰はBIOSが行う事もあり、その場合の処理はS1やS3等と同等だったが、OSが行う場合は復帰時はブートローダやOSがハイバネーション内容が存在することを検出してメモリ内容を書き戻すことになる。 S5 完全なる電源断である。商用電源あるいは無停電電源装置から電力を全く消費しない状態。 いわゆるAT互換機アーキテクチャの他にAMD64やIA-64を使用したシステムで使用されている。特にIA-64上のOSではACPIサポートは必須の要件となっている。その上で動くOSではWindowsではWindows 98から、Linuxでは（開発バージョンの）2.3.19からFreeBSDでは5-CURRENTからACPIが利用できるようになったが、管理対象となるデバイス全てがACPIをサポートしていないと不具合が出ることがある。ACPI 3.0の規格書の\_OSIオブジェクトの記述から読み取れる通りこの他にIA-64上のHP-UX、OpenVMSでもサポートされている。 LinuxやFreeBSDやNetBSDではインテルによって開発及び保守されているACPI Component Architecture(ACPI-CA) と呼ばれるカーネル内コンテキストで動作するライブラリを使用して実装されている。 1997年に初めて仕様が公開された。ACPI 2.0は2000年にリリースされ、ACPI 3.0は2004年にリリースされ、ACPI 4.0は2009年にリリースされ、ACPI 5.0は2011年にリリースされた。2013年10月、ACPIはUnified EFI Forumの下に置かれ、新しいACPI仕様はUEFI Forumによって開発される。