ACPI

**고급 구성 및 전원 인터페이스**(Advanced Configuration and Power Interface, **ACPI**)는 운영체제가 컴퓨터 하드웨어 구성 요소를 검색 및 구성하고, 전원 관리 (예: 사용하지 않는 하드웨어 구성 요소를 절전 상태로 전환), 자동 구성 (예: 플러그 앤 플레이 및 핫 스와핑), 상태 모니터링을 수행하는 데 사용할 수 있는 개방형 표준이다. 1996년 12월에 처음 출시되었다. ACPI는 고급 전원 관리 (APM), MultiProcessor Specification, 플러그 앤 플레이 바이오스 (PnP) 사양을 대체하는 것을 목표로 한다. ACPI는 전원 관리 및 구성 정책을 결정하기 위해 플랫폼별 펌웨어에 의존했던 이전의 바이오스 중심 시스템과는 달리 전원 관리를 운영체제의 제어하에 둔다. 이 사양은 **운영체제 주도 구성 및 전원 관리** (**OSPM**) 시스템의 핵심이다. ACPI는 장치 펌웨어 (예: 바이오스, 통일 확장 펌웨어 인터페이스), 컴퓨터 하드웨어 구성 요소 및 운영체제 간의 하드웨어 추상화 인터페이스를 정의한다.

내부적으로 ACPI는 시스템 펌웨어 (통일 확장 펌웨어 인터페이스 또는 바이오스)를 통해 제공되는 명령어 목록("메서드")을 사용하여 사용 가능한 구성 요소와 그 기능을 운영체제 커널에 알리고, 커널은 이를 파싱한다. 그런 다음 ACPI는 내장된 최소 가상 머신을 사용하여 ACPI 머신 언어로 작성된 원하는 작업(예: 하드웨어 구성 요소 초기화)을 실행한다.

인텔, 마이크로소프트 및 도시바가 원래 표준을 개발했으며, 나중에는 HP, 화웨이 및 피닉스도 참여했다. 2013년 10월, ACPI 표준의 원래 개발자였던 ACPI SIG(Special Interest Group)는 모든 자산을 UEFI 포럼으로 이전하기로 합의했으며, 향후 모든 개발은 이곳에서 진행될 예정이다. 인 표준 6.6은 에 출시되었다.

## 구조 <span class="anchor" id="AML"></span><span class="anchor" id="ASL"></span>
펌웨어 레벨 ACPI는 ACPI 테이블, ACPI 바이오스, ACPI 레지스터의 세 가지 주요 구성 요소로 이루어져 있다. ACPI 바이오스는 ACPI 테이블을 생성하고 ACPI 테이블을 메인 메모리로 로드한다. 펌웨어 ACPI 기능의 대부분은 ACPI 테이블에 저장된 튜링 완전 도메인 특정 저급 언어인 ACPI 머신 언어(AML)의 바이트코드로 제공된다. ACPI 테이블을 사용하려면 운영체제에 AML 바이트코드용 인터프리터가 있어야 한다. 참조 AML 인터프리터 구현은 ACPI 구성 요소 아키텍처(ACPICA)에서 제공한다. 바이오스 개발 시 AML 바이트코드는 ASL(ACPI 소스 언어) 코드에서 컴파일된다.

### ACPI 구성 요소 아키텍처 (ACPICA) <span class="anchor" id="ACPICA"></span>
주로 인텔의 엔지니어들이 작성한 **ACPI 구성 요소 아키텍처** (**ACPICA**)는 운영체제 관련 ACPI 코드의 오픈 소스 플랫폼 독립적 참조 구현을 제공한다. ACPICA 코드는 리눅스, 하이쿠, ArcaOS 및 FreeBSD에서 사용되며, 이들 운영체제는 자체 운영체제별 코드를 추가한다.

## 역사 <span class="anchor" id="1.0"></span><span class="anchor" id="1.0a"></span><span class="anchor" id="1.0b"></span><span class="anchor" id="2.0"></span><span class="anchor" id="2.0a"></span><span class="anchor" id="2.0b"></span><span class="anchor" id="2.0c"></span>
ACPI 사양의 첫 번째 개정판은 1996년 12월에 출시되었으며, 16, 24, 32비트 주소 공간을 지원했다. 2.0 개정판에서 64비트 주소 지원과 다중 프로세서 워크스테이션 및 서버 지원이 추가된 것은 2000년 8월이 되어서였다.

1999년, 당시 마이크로소프트 CEO 빌 게이츠는 이메일에서 리눅스가 ACPI 덕분에 아무런 작업 없이도 이득을 볼 것이라고 말하며, 이를 윈도우 전용으로 만들 것을 제안했다.

2004년 9월, 3.0 개정판이 출시되어 ACPI 사양에 SATA 인터페이스, PCI 익스프레스 버스, 256개 이상의 프로세서를 위한 다중 프로세서 지원, 주변광 센서 및 사용자 존재 감지 장치 지원이 추가되었으며, 이전 프로세서 중심 지원을 넘어선 열 모델을 확장했다.

2009년 6월에 출시된 ACPI 사양 4.0 개정판은 설계에 다양한 새로운 기능을 추가했다. 가장 주목할 만한 기능은 USB 3.0 지원, 논리 프로세서 유휴 지원 및 x2APIC 지원이다.

처음에는 ACPI가 X86 아키텍처에만 독점적이었지만, 2011년 12월에 출시된 ACPI 사양 5.0 개정판에서는 ARM 아키텍처 지원이 추가되었다. 5.1 개정판은 2014년 7월에 출시되었다. 2025년 5월에 출시된 최신 개정판 6.6은 RISC-V 지원을 추가했다.

## 운영체제
섬네일|Windows 9x의 "이제 컴퓨터를 꺼도 안전합니다" 화면. 대부분의 컴퓨터 주변기기는 오프라인 상태이며, 이 화면을 종료하는 유일한 방법은 컴퓨터를 끄거나 재설정하는 것이다.
섬네일|Windows 10 및 11의 "이제 시스템 전원을 꺼도 안전합니다" 화면.
마이크로소프트의 윈도우 98은 ACPI를 구현한 최초의 운영체제였지만, 그 구현이 다소 버그가 많거나 불완전했다. 하지만 이와 관련된 일부 문제는 1세대 ACPI 하드웨어로 인해 발생했다. 이후 버전의 마이크로소프트 윈도우, MacOS (x86 macOS만 해당), eComStation, ArcaOS, FreeBSD (FreeBSD 5.0부터), NetBSD (NetBSD 1.6부터), OpenBSD (OpenBSD 3.8부터), HP-UX, OpenVMS, 리눅스, GNU/Hurd 및 PC 버전의 솔라리스를 포함한 다른 운영체제는 ACPI에 대한 일부 지원을 제공한다. 윈도우 비스타와 같은 일부 최신 운영체제는 컴퓨터에 ACPI 호환 바이오스가 필요하며, 윈도우 8부터 S0ix/Modern Standby 상태가 구현되었다.

윈도우 운영체제는 acpi.sys를 사용하여 ACPI 이벤트에 접근한다.

리눅스 커널 2.4 시리즈는 ACPI에 대한 최소한의 지원만 있었고, 커널 버전 2.6.0부터는 더 나은 지원이 구현되었다(기본적으로 활성화됨). 오래된 ACPI 바이오스 구현은 버그가 많은 경향이 있어 최신 운영체제에서는 지원되지 않는다. 예를 들어, 윈도우 2000, 윈도우 XP, 윈도우 서버 2003은 바이오스 날짜가 1999년 1월 1일 이후인 경우에만 ACPI를 사용한다. 마찬가지로, 리눅스 커널 2.6은 바이오스 날짜가 2001년 1월 1일 이전인 경우 ACPI를 사용하지 않을 수 있다.

리눅스 기반 운영체제는 acpid를 통해 ACPI 이벤트를 처리할 수 있다.

## OSPM 책임
OSPM 호환 운영체제가 ACPI를 활성화하면 전원 관리 및 장치 구성의 모든 측면을 독점적으로 제어한다. OSPM 구현은 장치 드라이버에 ACPI 호환 환경을 노출해야 하며, 이는 특정 시스템, 장치 및 프로세서 상태를 노출한다.

### 전원 상태 <span class="anchor" id="S0"></span><span class="anchor" id="S1"></span><span class="anchor" id="S2"></span><span class="anchor" id="S3"></span><span class="anchor" id="S4"></span><span class="anchor" id="S5"></span><span class="anchor" id="POWER-STATES"></span>

#### 전역 상태 <span class="anchor" id="G0"></span><span class="anchor" id="G1"></span><span class="anchor" id="G2"></span><span class="anchor" id="G3"></span><span class="anchor" id="G4"></span><span class="anchor" id="GSTATES"></span>

ACPI 사양은 ACPI 호환 컴퓨터 시스템을 위한 다음과 같은 네 가지 전역 "Gx" 상태와 여섯 가지 절전 "Sx" 상태를 정의한다.

이 사양은 또한 레거시 상태를 정의한다: ACPI를 지원하지 않는 운영체제의 상태이다. 이 상태에서는 하드웨어 및 전원이 ACPI를 통해 관리되지 않아 ACPI가 사실상 비활성화된다.

#### 장치 상태

장치 상태 D0–D3는 장치에 따라 다르다:
* D0 또는 완전히 켜짐은 작동 상태이다.
** S0ix와 마찬가지로, 인텔은 SoC의 중간 레벨에 D0ix 상태를 가지고 있다.
* D1 및 D2는 장치에 따라 정의가 다른 중간 전원 상태이다.
* D3: D3 상태는 D3 Hot (보조 전원 공급)과 D3 Cold (전원 공급 없음)로 더 나뉜다:
** Hot: 장치는 더 높은 전원 상태로 전환하기 위한 전원 관리 요청을 주장할 수 있다.
** Cold 또는 Off는 장치가 전원 꺼짐 상태이며 버스에 응답하지 않는다.

### 프로세서 상태 <span class="anchor" id="CPU-states"></span><span class="anchor" id="CPU-STATES"></span><span class="anchor" id="POWER-STATES"></span>

CPU 전원 상태 C0–C3는 다음과 같이 정의된다:

* C0은 작동 상태이다.
* C1 (종종 Halt라고도 함)은 프로세서가 명령어를 실행하지 않지만, 거의 즉시 실행 상태로 돌아갈 수 있는 상태이다. 모든 ACPI 호환 프로세서는 이 전원 상태를 지원해야 한다. 펜티엄 4 및 AMD 애슬론과 같은 일부 프로세서는 더 낮은 전력 소비를 위해 향상된 C1 상태 (C1E 또는 향상된 정지 상태)를 지원하지만, 이는 일부 시스템에서 버그가 있는 것으로 나타났다.
* C2 (종종 Stop-Clock이라고도 함)는 프로세서가 소프트웨어에서 보이는 모든 상태를 유지하지만, 깨어나는데 더 오랜 시간이 걸릴 수 있는 상태이다. 이 프로세서 상태는 선택 사항이다.
* C3 (종종 Sleep이라고도 함)는 프로세서가 캐시 일관성을 유지할 필요는 없지만, 다른 상태를 유지하는 상태이다. 일부 프로세서에는 프로세서를 깨우는 데 걸리는 시간이 다른 C3 상태 (Deep Sleep, Deeper Sleep 등)의 변형이 있다. 이 프로세서 상태는 선택 사항이다.
* 일부 프로세서에 대해 제조업체가 추가 상태를 정의한다. 예를 들어, 인텔의 하스웰 플랫폼은 C10까지의 상태를 가지고 있으며, 코어 상태와 패키지 상태를 구분한다.

### 성능 상태 <span class="anchor" id="P-state"></span>

장치 또는 프로세서가 작동 중일 때 (각각 D0 및 C0), 여러 전력-성능 상태 중 하나에 있을 수 있다. 이러한 상태는 구현에 따라 다르다. P0은 항상 최고 성능 상태이며, P1부터 Pn까지는 순차적으로 낮은 성능 상태이다. 총 상태 수는 장치 또는 프로세서에 따라 다르지만 16개를 초과할 수 없다.

P-상태는 인텔 프로세서에서는 스피드스텝, AMD 프로세서에서는 파워나우! 또는 쿨 앤 콰이어트, VIA 프로세서에서는 PowerSaver로 알려져 있다.

* P0 최대 전력 및 주파수
* P1 P0보다 낮음, 전압 및 주파수 스케일링
* P2 P1보다 낮음, 전압 및 주파수 스케일링
* Pn P(n–1)보다 낮음, 전압 및 주파수 스케일링

## 인터페이스

### 하드웨어
ACPI 호환 시스템은 "고정 기능 하드웨어(FFH) 인터페이스" 또는 OEM에서 제공하는 플랫폼별 ACPI 머신 언어(AML)에 의존하는 플랫폼 독립적인 하드웨어 프로그래밍 모델을 통해 하드웨어와 상호 작용한다.

고정 기능 하드웨어 인터페이스는 성능 및 오류 복구를 위해 플랫폼 제조업체에서 제공하는 플랫폼별 기능이다. 표준 인텔 기반 PC는 인텔이 정의한 고정 기능 인터페이스를 가지고 있으며, 이는 부팅 시간이나 주요 시스템 오류 시 기본 기능을 제공하기 위해 ACPI 호환 시스템이 전체 드라이버 스택을 필요로 하는 것을 줄여주는 핵심 기능 세트를 제공한다.

ACPI 플랫폼 오류 인터페이스(APEI)는 칩셋, RAM 등의 하드웨어 오류를 운영체제에 보고하기 위한 사양이다.

### 펌웨어 <span class="anchor" id="DSDT"></span><span class="anchor" id="SSDT"></span><span class="anchor" id="SRAT"></span>
ACPI는 ACPI 호환 운영체제와 시스템 펌웨어(바이오스 또는 통일 확장 펌웨어 인터페이스) 간의 인터페이스를 제공하는 많은 테이블을 정의한다. 여기에는 RSDP, RSDT, XSDT, FADT, FACS, DSDT, SSDT, MADT, MCFG 등이 포함된다.

이 테이블은 플랫폼 독립적인 방식으로 시스템 하드웨어를 설명할 수 있으며, 고정 형식 데이터 구조 또는 AML로 제공된다. 주요 AML 테이블은 DSDT (차별화 시스템 설명 테이블)이다. AML은 OS 호환성 확장을 위해 테이블을 패치하는 목적으로 인텔의 iASL (오픈 소스, ACPICA의 일부)과 같은 도구로 디컴파일할 수 있다.

루트 시스템 설명 포인터(RSDP)는 플랫폼 종속적인 방식으로 위치하며 나머지 테이블을 설명한다.

Windows 플랫폼 이진 테이블(WPBT)이라고 불리는 사용자 지정 ACPI 테이블은 마이크로소프트가 공급업체가 Windows OS에 소프트웨어를 자동으로 추가할 수 있도록 허용하는 데 사용된다. 레노버와 같은 일부 공급업체는 이 기능을 사용하여 악성 소프트웨어를 설치한 것이 적발되었다. 삼성은 Windows 업데이트가 비활성화된 PC를 출시했다. 윈도우 7 이전 버전의 Windows는 이 기능을 지원하지 않지만, 다른 기술을 사용할 수 있다. 이 동작은 루트킷과 비교되기도 한다.

## 비판
2003년 11월, 리눅스 커널의 저자인 리누스 토르발스는 ACPI를 "모든 면에서 완전한 설계 재앙"이라고 묘사했다.

## 같이 보기
* 그린 컴퓨팅
* 전원 관리 키

## 각주

## 외부 링크
* ACPICA

분류:바이오스
분류:API
분류:컴퓨터 하드웨어 표준
분류:시스템 관리
분류:개방형 표준