통일 확장 펌웨어 인터페이스

UEFI 로고
소프트웨어 스택에서의 확장 펌웨어 인터페이스의 위치
'''통일 확장 펌웨어 인터페이스''' 또는 '''통합 확장 펌웨어 인터페이스'''()는 운영 체제와 플랫폼 펌웨어 사이의 소프트웨어 인터페이스를 정의하는 규격이다. IBM PC 호환기종에서 사용되는 바이오스 인터페이스를 대체할 목적으로 개발되었다. 인텔이 개발한 '''EFI'''(Extensible Firmware Interface) 규격에서 출발하였다. EFI의 관행과 데이터 포맷 중 일부는 마이크로소프트 윈도우의 것과 동일하게 사용된다. 2005년, UEFI는 EFI 1.10 (EFI의 최신판)의 사용을 권장치 않기로 했다. 통일 EFI 포럼은 UEFI 사양을 관리하는 산업체이다.
원래 EFI가 개발된 동기는 1990년대 중반에 인텔과 HP가 초대 아이테니엄기의 개발 초기까지 거슬러 올라간다. 개인용 컴퓨터의 바이오스 제한(16비트 보호 모드, 1 메가바이트의 주소 공간, PC/AT 하드웨어에의 의존) 때문에 아이테니엄 대상으로 한 거대한 서버 플랫폼에는 채용할 수 없는 것이 판명되었다. 여기서 교훈을 얻은 첫 성과를 '''인텔 부트 이니셔티브'''(Intel Boot Initiative)로 부르는데 나중에 EFI와 이름을 바꾸는 것이었다.
EFI 규격은 2000년 12월 12일에 인텔이 공개했다.(첫 버전은 1.01이지만, 법적인 문제 등으로 바로 취소되었다). EFI 규격 1.10은 2002년 12월 1일에 인텔이 공개했다. 여기에는 버전 1.02부터 몇 가지 상세한 기능 강화와 EFI 드라이버 모델이 기재되어 있다.
2005년, 인텔은 이 규격을 UEFI 포럼에 공개했다. 이 포럼은 규격의 개발과 보급에 책임을 지며 실시한다. EFI는 이것을 반영하여 유나이티드 EFI(UEFI)와 이름을 바꾸어서, 많은 문서가 양쪽 모두의 용어를 함께 사용하게 되었다.
UEFI 포럼은 2007년 1월 7일에 UEFI 규격 버전 2.1을 공개했는데, 이것은 2007년 3월 현재의 최신 규격이 되어왔다. 이 규격에는 개선된 암호화, 네트워크 인증, 사용자 인터페이스의 아키텍처가 추가되어 있다.
=== 서비스 ===
EFI는 두 종류의 서비스가 있다: 부트 서비스, 런타임 서비스. 부트 서비스는 펌웨어가 플랫폼을 소유하는 동안에만 이용이 가능하며(예: ExitBootServices 호출 이전) 다양한 장치, 버스, 블록, 파일 서비스 상의 텍스트와 그래픽 콘솔을 포함하고 있다. 런타임 서비스들은 운영 체제가 실행 중인 동안에 접근 가능하며, 날짜, 시간, NVRAM 접근과 같은 서비스들을 포함한다.
또, 그래픽 출력 프로토콜(GOP)은 제한된 런타임 서비스 지원을 제공한다. 운영 체제는 런타임 모드 중에 GOP가 제공하는 프레임버퍼에 직접 쓸 권한이 있다. 그러나 OS 그래픽스 드라이버가 로드될 때까지 런타임 서비스 모드로 전환한 뒤에는 비디오 모드를 변경하는 기능은 손실된다.
; 변수 서비스
: UEFI 변수들은 데이터, 특히 플랫폼 펌웨어와 운영 체제 사이에 공유되는 비휘발성 데이터를 저장하는 방법을 제공한다. 변수 이름공간들은 GUID로 식별하며, 변수들은 키/값 쌍을 이룬다. 이를테면, 변수들은 운영 체제 충돌 이후 다시 시작 시 NVRAM에 충돌 메시지를 보관하는데 사용할 수 있다.
; 시간 서비스
: UEFI는 장치 독립 시간 서비스들을 제공한다. 시간 서비스들은 타임존과 일광 절약 필드를 지원하므로, 하드웨어 실시간 시계가 로컬 시간이나 UTC로 설정할 수 있게 한다. PC-AT 실시간 클럭을 사용하는 머신에서 시계는 BIOS 기반 윈도우와의 호환성을 위해 로컬 시간으로 설정해야 한다.
=== 응용 프로그램 ===
EFI 부트 매니저와 EFI 드라이버 간의 상호 작용.
운영 체제를 로드하는 것과는 독립적으로, UEFI는 단독 UEFI 응용 프로그램들을 실행하는 기능이 있으며, 이러한 응용 프로그램들은 시스템 제조업체와는 독립적으로 개발, 설치할 수 있다. UEFI 응용 프로그램들은 ESP의 파일들로 상주하며, 펌웨어의 부트 매니저나 다른 UEFI 응용 프로그램들에 의해 직접 시작할 수 있다. 한 계열의 UEFI 응용 프로그램들은 운영 체제 로더들인데, 이를테면 rEFInd, gummiboot, 윈도우 부트 매니저가 있다. 이들은 특정한 운영 체제를 시작하며 선택적으로 사용자 인터페이스를 제공함으로써 실행할 다른 UEFI 응용 프로그램을 선택할 수 있게 한다. UEFI 셸과 같은 유틸리티들 또한 UEFI 응용 프로그램들이다.
=== 프로토콜 ===
EFI는 프로토콜을 2개의 바이너리 모듈 간의 통신에 사용되는 소프트웨어 인터페이스 집합으로 정의한다. 모든 EFI 드라이버들은 프로토콜을 통해 서비스들을 다른 대상들에 제공해야 한다.
=== 장치 드라이버 ===
표준 아키텍처에 특화된 장치 드라이버뿐 아니라, EFI 사양은 EFI 바이트 코드, 즉 EBC라는 프로세서 독립 장치 드라이버 환경을 제공한다. 시스템 펌웨어는 환경에 상주하거나 로드되는 EBC 이미지를 인터프리터가 전달하기 위해 UEFI 사양에 의거하여 필수적이다. 그러므로 EBC는 파워PC 기반 애플 매킨토시와 썬 마이크로시스템즈 SPARC 컴퓨터 등에 쓰이는 하드웨어 독립 펌웨어인 오픈 펌웨어와 비슷하다고 볼 수 있다.
일부 아키텍처 특화(EBC가 아닌) EFI 장치 드라이버 유형들은 운영 체제에서 사용할 수 있도록 인터페이스를 갖추고 있다. 이로써 기본적인 그래픽스 및 네트워크 기능을 위해 운영 체제에 특화된 드라이버가 로드될 때까지 운영 체제가 EFI에 의존할 수 있게 한다.
=== 그래픽스 기능 ===
EFI 사양은 장치 독립 그래픽스를 지원하는 한 방법으로 UGA (유니버설 그래픽 어댑터) 프로토콜을 정의하였다. UEFI는 UGA를 포함하지 않았으며 이것이 GOP(그래픽스 출력 프로토콜)로 대체되었는데, 여기에는 VGA 하드웨어 의존을 제거하려는 명확한 목표가 포함되어 있다. 이 둘은 비슷하다.
UEFI 2.1은 사용자 입력, 지역화 문자열, 글꼴, 폼 (HTML)을 관리하기 위해 휴먼 인터페이스 인프라스트럭처(HII)를 정의하였다. 이로써 OEM이나 IBV(독립 바이오스 업체)가 부팅 전 구성을 위한 그래픽 인터페이스를 설계할 수 있게 한다. UEFI 그 자체는 사용자 인터페이스를 정의하지 않는다.
초기의 대부분의 UEFI 펌웨어 구현체들은 콘솔 기반이었으나, 2007년 초 즈음 일부 구현체들이 그래픽 사용자 인터페이스를 제공하기 시작했다.
=== EFI 시스템 파티션 ===
종종 ESP로 줄여서 이르는 EFI 시스템 파티션은 UEFI 사양을 따르는 컴퓨터에 사용되는 데이터 스토리지 디바이스 파티션이다. 컴퓨터의 전원이 켜질 때 UEFI 펌웨어에 의해 접근되는 이 파티션은 UEFI 응용 프로그램들 및 이러한 프로그램들의 실행에 필요한 파일들(운영 체제 커널 포함)을 저장한다.
지원되는 파티션 테이블 스킴에는 MBR 및 GPT 뿐 아니라 광 디스크 상의 엘 토리토 볼륨을 포함한다.
ESP에 사용할 경우, UEFI는 FAT 파일 시스템에 특화된 버전을 정의하며, 이는 UEFI 사양의 일부로서, 오리지널 FAT 사양과는 별개로 유지보수되는데, 여기에는 ESP 상의 FAT32 파일 시스템류들과 이동식 미디어의 FAT16, FAT12 파일 시스템을 아우른다. ESP 또한 하위 바이오스 호환의 일부로서 부트 섹터를 위한 공간을 제공한다.
=== 부팅 ===
==== UEFI 부팅 ====
BIOS와 달리, UEFI는 부트 섹터에 의존하지 않으며, 대신 UEFI의 사양의 일부로서 부트 매니저를 정의한다.
==== CSM 부팅 ====
하위 호환성을 보장하기 위해, PC 등급의 컴퓨터에서 대부분의 UEFI 펌웨어 구현들은 레거시 바이오스 모드에서의 MBR 파티션 디스크 부팅도 지원하며, 이는 레거시 바이오스 호환을 제공하는 호환성 지원 모듈(Compatibility Support Module , CSM)을 통해 처리된다.
==== 네트워크 부팅 ====
UEFI 사양은 사전 부팅 실행 환경(PXE)을 통해 네트워크를 경유한 부팅 지원을 포함한다.
==== 시큐어 부트 ====
UEFI 2.3.1 Errata C 사양 이상에서는 시큐어 부트(secure boot)라는 프로토콜을 정의하며, 적재 가능한 디지털 서명으로 서명되지 않은 드라이버나 장치 로더의 로드를 막음으로써 부팅 프로세스에 보안을 제공할 수 있다.
* 코어부트의 개발자 Ronald G. Minnich는 EFI에 대하여 칩셋 프로그래밍과 내부 구조에 관한 일련의 지적 재산권의 은닉을 위한 시도이며, 오픈소스인  TianoCore를 통해 임의의 EFI를 구축하는 것이 가능하다고는 하나 이 또한 칩셋 제조사에서 공개하지 않거나 비자유 소프트웨어 라이선스에 따라 공개한 특정 부분에 의존할 수밖에 없게 되어 있다고 비판한 바 있다.
* EFI는 대부분의 시스템에서 바이오스용 장치 드라이버와 운영체제용 장치 드라이버를 따로 필요로 하는 문제를 해결하는 역할은 하지 못한다.
* EFI는 기존의 바이오스보다 더 유연한 원격 네트워크 부팅을 지원한다. 이는 보안 면에서는 취약점으로 작용할 수도 있다.
* UEFI 포럼
* 오픈 펌웨어
* 바이오스, 오픈바이오스
* ACPI
* 시스템 관리 바이오스
* x86-64
* 코어부트(구 LinuxBIOS)
* 시스템 관리 모드
*  UEFI 홈페이지
*  인텔 EFI 페이지
*  인텔 프레임워크 페이지
*  EFI에 대한 마이크로소프트의 공식 입장
*  인텔 스폰서 오픈 소스 EFI 펌웨어 발의
*  EFI 리눅스 로더 프로젝트 (ELILO)
*  EFI 리눅스 그누 도구모음 (gnu-efi)
*  EFI Architecture Dr. Dobbs 포털 본문
분류:바이오스