펌웨어
펌웨어(Firmware)는 전자 장치의 비휘발성 메모리에 저장되어 하드웨어를 초기화하거나 제어하고, 장치가 정해진 기능을 수행할 수 있도록 만드는 소프트웨어이다. 일반적인 응용 소프트웨어보다 하드웨어에 가까운 계층에서 실행되며, 시스템의 전원이 켜진 직후부터 장치 제어와 운영체제 부팅에...
| 분류 | 시스템 소프트웨어, 임베디드 소프트웨어 |
|---|---|
| 실행 환경 | 마이크로컨트롤러, 마이크로프로세서, 주변 장치 제어기 |
| 주요 저장 매체 | ROM, EEPROM, 플래시 메모리 |
| 주요 역할 | 하드웨어 초기화, 장치 제어, 부팅, 하드웨어 추상화 |
| 관련 규격 | UEFI, ACPI, Device Tree |
| 개발 언어 | C (프로그래밍 언어), C++, Rust, 어셈블리어 |
펌웨어(Firmware)는 전자 장치의 비휘발성 메모리에 저장되어 하드웨어를 초기화하거나 제어하고, 장치가 정해진 기능을 수행할 수 있도록 만드는 소프트웨어이다. 일반적인 응용 소프트웨어보다 하드웨어에 가까운 계층에서 실행되며, 시스템의 전원이 켜진 직후부터 장치 제어와 운영체제 부팅에 이르는 기반 동작을 담당한다.
펌웨어는 단순한 제어 코드 하나만을 뜻하지 않는다. 마이크로컨트롤러에서 센서와 모터를 제어하는 프로그램, 컴퓨터의 UEFI, 중앙 처리 장치의 마이크로코드, 저장 장치와 네트워크 장치 내부의 제어 소프트웨어, 운영체제가 장치에 적재하는 펌웨어 이미지까지 폭넓게 포함한다. Linux에서도 CPU 마이크로코드, 장치 내부 마이크로컨트롤러용 코드와 보정 데이터 등을 펌웨어 인터페이스를 통해 불러올 수 있다.[1]
초기의 펌웨어는 제조 과정에서 ROM에 기록되어 변경하기 어려운 경우가 많았지만, 현대의 펌웨어는 플래시 메모리와 안전한 갱신 절차를 사용하여 기능 개선, 하드웨어 호환성 확장과 보안 취약점 수정을 지원한다. 이에 따라 펌웨어는 하드웨어에 고정된 코드라기보다 하드웨어 수명 주기 전체에 걸쳐 관리되는 핵심 시스템 소프트웨어로 발전하였다.
역사
용어의 형성
ROM 기반 제어 프로그램
마이크로프로세서와 임베디드 시스템의 확산
BIOS와 개인용 컴퓨터
플래시 메모리와 현장 갱신
UEFI와 현대 플랫폼 펌웨어
연결형 장치와 원격 펌웨어 관리
구성과 실행 모델
비휘발성 메모리
프로세서와 실행 환경
초기화 코드
하드웨어 제어 루프
인터럽트와 예외 처리
부트 과정
런타임 서비스
설정과 영구 데이터
펌웨어의 종류
임베디드 펌웨어
플랫폼 펌웨어
장치 펌웨어
부트 펌웨어
마이크로코드
관리 제어기 펌웨어
운영체제가 적재하는 펌웨어
하드웨어와의 관계
레지스터와 메모리 맵 입출력
버스와 주변 장치
센서와 액추에이터
타이머와 직접 메모리 접근
전력과 클럭 관리
하드웨어 추상화 계층
부팅과 플랫폼 초기화
개발과 구현
요구 사항과 하드웨어 사양
크로스 컴파일
링커 스크립트와 메모리 배치
시작 코드
장치 드라이버
실시간 처리
상태 기계와 이벤트 루프
실시간 운영체제 사용
빌드와 펌웨어 이미지 생성
프로그래밍 언어
어셈블리어
C
C++
Rust
스크립트 언어와 설정 언어
저장 형식과 배포 이미지
원시 바이너리
Intel HEX
Motorola S-record
ELF
캡슐과 공급업체별 형식
설정 및 보정 데이터
펌웨어 갱신
제조 단계 프로그래밍
서비스 도구를 통한 갱신
운영체제 기반 갱신
무선 펌웨어 갱신
UEFI 캡슐 갱신
전체 이미지와 델타 갱신
A/B 파티션과 이중 이미지
롤백과 복구
UEFI의 Firmware Management Protocol은 장치가 현재 펌웨어 이미지의 버전과 속성을 보고하고 새로운 이미지를 장치에 기록할 수 있는 공통 관리 인터페이스를 제공한다.[3]
보안
신뢰 부팅
Secure Boot
코드 서명
펌웨어 검증
암호화된 갱신
디버그 인터페이스 보호
롤백 방지
공급망 보안
취약점과 지속성
보호와 탐지 및 복구
플랫폼 펌웨어는 운영체제보다 먼저 실행되고 시스템의 핵심 하드웨어를 제어하므로, 손상될 경우 운영체제 재설치만으로 복구되지 않을 수 있다. NIST SP 800-193은 플랫폼 펌웨어 복원력을 보호, 비인가 변경 탐지와 안전한 복구의 세 가지 핵심 요소로 설명한다.[4]
디버깅과 시험
하드웨어 디버거
JTAG와 SWD
직렬 콘솔
로깅과 추적
에뮬레이터와 시뮬레이터
Hardware-in-the-Loop 시험
단위 시험과 통합 시험
오류 주입
장시간 안정성 시험
운영체제와의 관계
장치 드라이버와 펌웨어
펌웨어 파일 적재
하드웨어 기술 정보 전달
ACPI
Device Tree
시스템 관리 인터페이스
펌웨어와 커널의 책임 경계
운영체제의 장치 드라이버는 필요한 펌웨어 이미지를 파일 시스템이나 내장 이미지에서 찾아 장치 내부의 프로세서에 적재할 수 있다. Linux의 펌웨어 API는 내장 펌웨어, 메모리 캐시와 파일 시스템 조회 등을 순서에 따라 사용한다.[5]