펌웨어

펌웨어(Firmware)는 전자 장치의 비휘발성 메모리에 저장되어 하드웨어를 초기화하거나 제어하고, 장치가 정해진 기능을 수행할 수 있도록 만드는 소프트웨어이다. 일반적인 응용 소프트웨어보다 하드웨어에 가까운 계층에서 실행되며, 시스템의 전원이 켜진 직후부터 장치 제어와 운영체제 부팅에...

분류시스템 소프트웨어, 임베디드 소프트웨어
실행 환경마이크로컨트롤러, 마이크로프로세서, 주변 장치 제어기
주요 저장 매체ROM, EEPROM, 플래시 메모리
주요 역할하드웨어 초기화, 장치 제어, 부팅, 하드웨어 추상화
관련 규격UEFI, ACPI, Device Tree
개발 언어C (프로그래밍 언어), C++, Rust, 어셈블리어

펌웨어(Firmware)는 전자 장치의 비휘발성 메모리에 저장되어 하드웨어를 초기화하거나 제어하고, 장치가 정해진 기능을 수행할 수 있도록 만드는 소프트웨어이다. 일반적인 응용 소프트웨어보다 하드웨어에 가까운 계층에서 실행되며, 시스템의 전원이 켜진 직후부터 장치 제어와 운영체제 부팅에 이르는 기반 동작을 담당한다.

펌웨어는 단순한 제어 코드 하나만을 뜻하지 않는다. 마이크로컨트롤러에서 센서와 모터를 제어하는 프로그램, 컴퓨터의 UEFI, 중앙 처리 장치의 마이크로코드, 저장 장치와 네트워크 장치 내부의 제어 소프트웨어, 운영체제가 장치에 적재하는 펌웨어 이미지까지 폭넓게 포함한다. Linux에서도 CPU 마이크로코드, 장치 내부 마이크로컨트롤러용 코드와 보정 데이터 등을 펌웨어 인터페이스를 통해 불러올 수 있다.[1]

초기의 펌웨어는 제조 과정에서 ROM에 기록되어 변경하기 어려운 경우가 많았지만, 현대의 펌웨어는 플래시 메모리와 안전한 갱신 절차를 사용하여 기능 개선, 하드웨어 호환성 확장과 보안 취약점 수정을 지원한다. 이에 따라 펌웨어는 하드웨어에 고정된 코드라기보다 하드웨어 수명 주기 전체에 걸쳐 관리되는 핵심 시스템 소프트웨어로 발전하였다.

역사

용어의 형성

ROM 기반 제어 프로그램

마이크로프로세서와 임베디드 시스템의 확산

BIOS와 개인용 컴퓨터

플래시 메모리와 현장 갱신

UEFI와 현대 플랫폼 펌웨어

연결형 장치와 원격 펌웨어 관리

구성과 실행 모델

비휘발성 메모리

프로세서와 실행 환경

초기화 코드

하드웨어 제어 루프

인터럽트와 예외 처리

부트 과정

런타임 서비스

설정과 영구 데이터

펌웨어의 종류

임베디드 펌웨어

플랫폼 펌웨어

장치 펌웨어

부트 펌웨어

마이크로코드

관리 제어기 펌웨어

운영체제가 적재하는 펌웨어

하드웨어와의 관계

레지스터와 메모리 맵 입출력

버스와 주변 장치

센서와 액추에이터

타이머와 직접 메모리 접근

전력과 클럭 관리

하드웨어 추상화 계층

부팅과 플랫폼 초기화

전원 인가와 리셋

신뢰점과 초기 실행 코드

메모리와 장치 초기화

하드웨어 검사

부트 장치 선택

부트로더 실행

운영체제로 제어 이전

UEFI

UEFI는 운영체제와 플랫폼 펌웨어 사이의 표준화된 인터페이스를 정의한다. 플랫폼 정보가 들어 있는 데이터 테이블과 부트 서비스 및 런타임 서비스 호출을 제공하여 운영체제 로더 실행과 부팅 전 응용 프로그램의 실행 환경을 구성한다.[2]

개발과 구현

요구 사항과 하드웨어 사양

크로스 컴파일

링커 스크립트와 메모리 배치

시작 코드

장치 드라이버

실시간 처리

상태 기계와 이벤트 루프

실시간 운영체제 사용

빌드와 펌웨어 이미지 생성

프로그래밍 언어

어셈블리어

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]

활용 분야

개인용 컴퓨터와 서버

가전제품

자동차

산업 자동화

통신 장비

저장 장치

네트워크 장치

의료 기기

항공우주와 국방

사물인터넷

로봇과 드론

게임기와 주변 장치

다른 소프트웨어와의 관계

운영체제

부트로더

장치 드라이버

임베디드 소프트웨어

실시간 운영체제

마이크로코드

응용 소프트웨어

장점과 한계

관련 문서

  1. Linux Kernel documentation: Introduction to the Firmware API
  2. UEFI Forum: Specifications and Tools
  3. UEFI Specification 2.10: Firmware Update and Reporting
  4. NIST SP 800-193: Platform Firmware Resiliency Guidelines
  5. Linux Kernel documentation: Firmware lookup order