사전 펌웨어
개념

펌웨어

gabury1고친 사람 github-actions[bot]

펌웨어는 하드웨어를 직접 움직입니다. 장치와 함께 팔려 나오는 소프트웨어입니다. 컴퓨터에서는 운영체제보다 먼저 기계를 깨웁니다. 운영체제가 없는 작은 기기에서는 펌웨어 하나가 그 기기의 일을 전부 맡습니다.

쉽고 빠른 이해

펌웨어는 하드웨어를 직접 움직이는 소프트웨어입니다. 서버에 전원을 넣으면 운영체제가 뜨기 전에 제조사 로고와 설정 화면이 먼저 보입니다. 그 화면을 띄우는 프로그램이 메인보드의 펌웨어입니다.

펌웨어가 없으면 기계는 켜져도 아무것도 못 합니다. 전원을 넣은 직후 메모리는 비어 있습니다. 운영체제는 디스크에 있습니다. 그것을 읽어 올 코드가 칩에 먼저 있어야 합니다.

어떻게 도나:

  1. 전원이 들어오면 장치 안의 칩에 든 펌웨어가 가장 먼저 실행됩니다
  2. 펌웨어가 메모리와 장치를 쓸 수 있게 깨웁니다
  3. 컴퓨터라면 운영체제를 올릴 프로그램에 일을 넘깁니다. 작은 기기라면 펌웨어가 계속 돌며 기기의 일을 합니다

대가는 고치기가 까다롭다는 것입니다. 새 버전으로 바꾸는 도중에 전원이 끊기면 장치가 아예 안 켜질 수 있습니다. 그래서 펌웨어에는 켜는 데 꼭 필요한 코드와 하드웨어를 직접 만지는 코드만 둡니다. 자주 바뀌는 기능은 운영체제 위의 프로그램으로 올립니다.

상세

펌웨어(firmware)의 firm 은 「단단한」이라는 뜻입니다. 회로로 굳어 있는 하드웨어(hard)와 언제든 갈아 끼우는 소프트웨어(soft) 사이에 있다는 뜻으로 붙은 이름입니다.

펌웨어는 하드웨어에 딸려 나오는 소프트웨어입니다. 그 하드웨어를 직접 움직입니다. 운영체제와 응용 프로그램은 그 위에 나중에 얹힙니다.

펌웨어는 장치 안의 칩에 저장되어 있습니다. 전원이 들어오면 그 장치에서 가장 먼저 실행되는 코드가 펌웨어입니다. 서버의 메인보드와 디스크, 공유기, 세탁기에는 대개 펌웨어가 들어 있습니다. 스스로 판단하는 전자 장치라면 거의 다 그렇습니다.

하드웨어와 소프트웨어 사이

기능을 회로로 만들 때와 코드로 만들 때를 비교하면 펌웨어가 왜 둘 사이에 있는지 보입니다.

기계에 기능을 넣는 첫째 방법은 회로로 만드는 것입니다. 회로는 빠릅니다. 대신 공장을 나온 뒤에는 바꿀 수 없습니다.

둘째 방법은 코드로 짜서 CPU(Central Processing Unit, 중앙 처리 장치)에 돌리는 것입니다. CPU 는 명령어를 읽어 차례로 실행하는 칩입니다. 코드는 나중에 고칠 수 있습니다. 버그가 나오면 새 버전을 보내 바꾸면 됩니다. 같은 칩에 다른 코드를 실어 다른 제품을 만들 수도 있습니다.

펌웨어는 이 둘째 방법입니다. 그래도 운영체제 위의 프로그램처럼 자주 바꾸지는 않습니다. 기계가 켜지는 데 꼭 필요한 코드라서 잘못 바꾸면 기계가 안 켜집니다.

둘째 방법을 다시 펌웨어와 운영체제 위의 프로그램으로 나누면 방법은 셋이 됩니다. 아래 표는 세 방법을 담기는 곳과 바꾸는 법으로 나란히 놓습니다.

회로 펌웨어 운영체제 위의 프로그램
담기는 곳 칩의 배선 장치 안의 저장 칩 디스크
바꾸는 법 못 바꾼다 장치에 새 버전을 써 넣는다 파일을 새로 깐다
잘못 바꾸면 해당 없음 장치가 안 켜질 수 있다 그 프로그램만 안 돈다

표의 마지막 줄이 무엇을 펌웨어에 둘지를 가릅니다. 자주 바뀌는 기능은 운영체제 위로 올리는 편입니다. 켜는 데 꼭 필요한 코드와 하드웨어를 직접 만지는 코드가 펌웨어에 남습니다.

펌웨어가 담기는 칩

펌웨어는 켜자마자 돌아야 합니다. 그래서 전원이 꺼져도 지워지지 않는 칩에 들어 있어야 합니다. 컴퓨터의 주 메모리는 전원이 꺼지면 내용이 사라집니다. 그래서 이 일을 못 합니다.

전원 없이도 내용을 지키는 저장 장치를 비휘발성 메모리라고 부릅니다. 펌웨어가 담기는 칩은 전부 이 종류입니다.

예전 펌웨어는 ROM(Read-Only Memory, 읽기 전용 메모리)에 담겼습니다. ROM 은 공장에서 한 번 쓰면 다시 쓸 수 없습니다. 펌웨어에 버그가 있으면 칩을 갈아 끼워야 했습니다.

요즘 펌웨어는 대개 플래시 메모리에 담깁니다. 플래시 메모리는 전기로 지우고 다시 쓸 수 있는 비휘발성 메모리입니다. 덕분에 장치를 뜯지 않고 펌웨어를 새 버전으로 바꿀 수 있게 됐습니다. 펌웨어를 칩에 써 넣는 일을 플래싱이라고 부르는 것도 여기서 왔습니다.

컴퓨터를 깨우는 펌웨어

이 소절은 서버나 개인용 컴퓨터를 켤 때 메인보드의 펌웨어가 하는 일을 봅니다.

전원을 넣은 직후 주 메모리는 비어 있습니다. 운영체제는 디스크에 들어 있습니다. 아직 아무도 그것을 읽어 오지 않았습니다.

CPU 는 켜지면 미리 정해진 주소 하나에서 명령어를 읽기 시작합니다. 그 주소에 메인보드 칩의 펌웨어가 놓여 있습니다. 서버를 켤 때 운영체제보다 먼저 뜨는 제조사 로고와 설정 화면이 이 펌웨어의 화면입니다.

펌웨어는 먼저 기계를 점검하고 깨웁니다. 메모리가 제대로 붙어 있는지 확인합니다. 디스크와 키보드 같은 장치도 쓸 수 있게 설정합니다.

그다음 펌웨어는 디스크에서 부트로더를 찾아 메모리에 올립니다. 그리고 부트로더에 실행을 넘깁니다. 부트로더는 운영체제를 메모리에 올리는 작은 프로그램입니다. 전원을 넣고 운영체제가 뜨기까지의 이 과정 전체를 부팅이라고 부릅니다.

개인용 컴퓨터와 서버의 메인보드 펌웨어에는 규격이 있습니다. 예전 규격은 BIOS(Basic Input/Output System, 기본 입출력 시스템)입니다. 지금 규격은 UEFI(Unified Extensible Firmware Interface, 통합 확장 펌웨어 인터페이스)입니다. 요즘 서버는 대개 UEFI 로 켭니다.

운영체제가 뜬 뒤에도 남는 펌웨어

펌웨어의 일이 부팅에서 끝나지는 않습니다. 운영체제가 뜬 뒤에도 펌웨어 일부가 남아 운영체제의 부탁을 받는 기계가 많습니다. 전원을 끄거나 절전 상태로 들어가는 일이 그런 부탁입니다.

남은 펌웨어는 운영체제보다 권한이 높기도 합니다. CPU 는 코드마다 할 수 있는 일의 범위를 나눠 둡니다. 이 범위를 특권 모드라고 부릅니다. 권한이 높다는 말은 이 범위가 넓다는 뜻입니다.

응용 프로그램의 범위가 가장 좁습니다. 운영체제의 핵심부인 커널이 그보다 넓습니다. 일부 CPU 에는 커널보다 더 넓은 범위가 하나 더 있습니다. 펌웨어는 그 범위에서 실행됩니다.

부품 안에서 도는 펌웨어

펌웨어는 메인보드에만 있지 않습니다. 서버 한 대 안에도 펌웨어가 여럿 들어 있습니다. 부품별로 하나씩 짚은 뒤 그림 하나로 모읍니다.

SSD(Solid State Drive, 반도체 저장 장치)나 네트워크 카드 같은 부품에는 저마다 작은 CPU 가 있습니다. 그 CPU 에서 부품의 펌웨어가 실행됩니다. 운영체제는 부품에 「이 데이터를 써라」 같은 명령만 보냅니다. 명령을 받아 처리하는 것은 부품 안의 펌웨어입니다.

운영체제 쪽에서 부품에 명령을 보내는 코드가 디바이스 드라이버입니다. 드라이버는 운영체제에 깔리는 소프트웨어입니다. 펌웨어는 부품 안에 들어 있습니다. 둘은 서로 반대쪽에 서서 명령과 결과를 주고받습니다.

SSD 펌웨어는 데이터를 저장 칩의 어느 칸에 쓸지 정합니다. 운영체제는 「몇 번 블록에 써라」라고 번호만 보냅니다. 그 번호를 칩의 어느 칸에 둘지는 펌웨어가 고릅니다.

서버에는 원격 관리용 칩이 하나 더 붙어 있기도 합니다. 이 칩을 BMC(Baseboard Management Controller, 베이스보드 관리 컨트롤러)라고 부릅니다. 서버의 운영체제가 꺼져 있어도 BMC 는 따로 동작합니다.

BMC 는 네트워크 너머에서 서버 전원을 켜고 끄게 해 줍니다. 이 칩도 자체 펌웨어로 동작합니다.

아래 그림은 지금까지 나온 펌웨어가 서버 한 대 안에 어떻게 흩어져 있는지 보입니다. 운영체제는 하나지만 펌웨어는 부품마다 따로 있습니다.

flowchart TD
    subgraph 서버["서버 한 대"]
        OS["운영체제 · 디바이스 드라이버"]
        subgraph 보드["메인보드"]
            PW["전원"]
            BF["메인보드 펌웨어 · UEFI"]
        end
        subgraph 저장["SSD"]
            SF["SSD 펌웨어"]
        end
        subgraph 망["네트워크 카드"]
            NF["네트워크 카드 펌웨어"]
        end
        subgraph 관리["BMC"]
            MF["BMC 펌웨어"]
        end
    end
    BF -->|"켤 때 부트로더를 거쳐 올린다"| OS
    OS -->|"명령을 보낸다"| SF
    OS -->|"명령을 보낸다"| NF
    MF -->|"네트워크 너머에서 켜고 끈다"| PW

기기 하나를 통째로 맡는 펌웨어

이 소절은 운영체제 없이 펌웨어만 도는 작은 기기를 봅니다. 짧은 코드 하나로 그런 펌웨어의 모양을 보입니다.

온도 센서나 리모컨, 세탁기 같은 작은 기기의 두뇌는 대개 마이크로컨트롤러입니다. 마이크로컨트롤러는 CPU 와 메모리, 저장 칩, 입출력 단자를 칩 하나에 모은 작은 컴퓨터입니다.

한 가지 일을 하려고 기계 안에 들어가는 이런 컴퓨터를 임베디드 시스템이라고 부릅니다. 서버처럼 무엇이든 돌리는 컴퓨터와 달리 할 일이 처음부터 정해져 있습니다.

이런 기기에는 운영체제가 없는 경우가 많습니다. 펌웨어 하나가 켜질 때부터 꺼질 때까지 실행됩니다. 센서를 읽는 일도, 값을 계산하는 일도, 모터를 돌리는 일도 전부 펌웨어가 합니다.

이런 펌웨어는 대개 한 번 준비를 마친 뒤 끝나지 않는 반복문을 실행합니다. 아래는 온도를 재서 서버로 보내는 기기의 펌웨어를 C 언어로 줄여 쓴 모양입니다. 함수 이름은 설명을 위해 지은 것입니다.

C
int main(void) {
    setup_pins();       // 핀과 타이머 설정
    while (1) {         // 꺼질 때까지 돈다
        int t = read_temp();
        send_to_server(t);
        sleep_ms(1000); // 1초 쉰다
    }
}

코드의 main 은 한 번 시작되면 전원이 꺼질 때까지 돌아오지 않습니다. 돌아갈 운영체제가 없습니다. 요청을 기다리며 끝없이 도는 서버 프로그램과 닮은 모양입니다.

이런 기기가 보낸 측정값을 서버가 모아 보는 일을 텔레메트리라고 부릅니다. 백엔드 개발자가 펌웨어를 가장 자주 만나는 곳이 여기입니다. 기기에서 오는 데이터의 형식과 보내는 주기를 펌웨어가 정하기 때문입니다.

조금 큰 기기는 펌웨어 안에 운영체제까지 담습니다. 공유기나 네트워크 카메라가 그렇습니다. 이때는 작은 운영체제와 프로그램을 한 덩어리로 묶은 이미지 전체를 펌웨어라고 부릅니다.

정해진 시간 안에 반드시 반응해야 하는 기기도 있습니다. 이런 기기는 응답 시간을 지키도록 만든 실시간 운영체제를 펌웨어에 담습니다.

펌웨어 업데이트

펌웨어에도 버그가 납니다. 보안 취약점도 생깁니다. 그러면 새 버전으로 바꿔야 합니다. 그 일이 왜 까다로운지와 위험을 줄이는 방법을 차례로 봅니다.

펌웨어를 새 버전으로 바꾸는 일을 펌웨어 업데이트라고 부릅니다. 기기에 선을 꽂아 바꾸기도 합니다. 네트워크로 새 버전을 받아 바꾸기도 합니다. 공중으로 받는다는 뜻의 OTA(Over-The-Air)를 붙여 이 방식을 OTA 업데이트라고 부릅니다.

가장 큰 위험은 쓰는 도중에 멈추는 것입니다. 전원이 끊기면 저장 칩에 새 버전이 반쯤만 쓰입니다. 다음에 켤 때 깨진 펌웨어가 돌면 기기가 아무 반응도 하지 않습니다. 이렇게 된 기기를 「벽돌이 됐다」고 말합니다.

그래서 펌웨어 업데이트에는 대개 되살릴 길을 둡니다. 흔한 방법은 둘입니다.

하나는 저장 칩에 펌웨어를 두 개 두는 것입니다. 한쪽에 새 버전을 쓰는 동안 다른 쪽은 손대지 않습니다. 새 버전이 깨졌으면 이전 버전으로 켭니다.

다른 하나는 좀처럼 바꾸지 않는 작은 부트로더를 따로 두는 것입니다. 본 펌웨어가 깨져도 부트로더는 살아 있습니다. 부트로더가 새 버전을 다시 받아 기기를 되살립니다.

새 버전을 받을 때는 그것을 진짜 제조사가 만들었는지도 확인해야 합니다. 공격자가 만든 펌웨어가 깔리면 운영체제를 다시 깔아도 공격 코드가 남습니다. 펌웨어는 디스크가 아니라 장치 안의 칩에 있기 때문입니다.

확인에는 전자 서명을 씁니다. 제조사가 자기만 가진 비밀 키로 서명을 만들어 펌웨어에 붙입니다. 기기는 공개된 짝 키로 서명을 확인한 뒤에만 새 버전을 씁니다.

서명 확인을 켤 때마다 할 수도 있습니다. 펌웨어가 부트로더의 서명을 확인합니다. 부트로더는 다시 커널의 서명을 확인합니다. 이렇게 켜는 방식을 보안 부팅이라고 부릅니다.

가상 머신의 펌웨어

가상 머신은 한 컴퓨터 위에 소프트웨어로 흉내 낸 컴퓨터입니다. 그 흉내를 맡는 프로그램을 하이퍼바이저라고 부릅니다.

가상 머신도 켤 때 펌웨어부터 실행됩니다. 이 펌웨어는 칩에 든 것이 아니라 하이퍼바이저가 소프트웨어로 띄워 준 것입니다. 그 뒤로는 진짜 컴퓨터처럼 부트로더와 운영체제가 차례로 뜹니다.

펌웨어가 장치를 점검하는 데는 시간이 걸립니다. 그래서 빨리 켜야 하는 가상 머신은 펌웨어 단계를 건너뛰기도 합니다. 하이퍼바이저가 커널을 곧장 메모리에 올리고 실행을 넘기는 방식입니다.

관련 항목

펌웨어가 속하는 상위 분류

하드웨어 · 소프트웨어 · 컴퓨터 구조

펌웨어가 담기는 저장 칩

비휘발성 메모리 · ROM · 플래시 메모리 · EEPROM

컴퓨터를 켤 때 펌웨어 앞뒤에 서는 단계

리셋 벡터 · 부팅 · 부트로더 · 커널 · 운영체제

메인보드 펌웨어의 규격과 구현

BIOS · UEFI · ACPI · coreboot · OpenSBI

펌웨어가 실행되는 권한 계층을 나누는 구조

특권 모드 · 커널 모드 · 사용자 공간 · RISC-V

자체 펌웨어로 도는 부품

SSD · 네트워크 카드 · BMC · IPMI · 플래시 변환 계층 · 쓰기 증폭 · 가비지 컬렉션

펌웨어와 명령을 주고받는 운영체제 쪽 수단

디바이스 드라이버 · 인터럽트 · 메모리 맵 입출력 · 하드웨어 추상화 계층

펌웨어 하나가 통째로 맡는 기기

임베디드 · 마이크로컨트롤러 · SoC · 사물 인터넷 · 센서

펌웨어 안에 담기는 운영체제의 선택지

실시간 운영체제 · Zephyr · FreeRTOS · 임베디드 리눅스 · 베어메탈

펌웨어를 새 버전으로 바꾸는 수단

펌웨어 업데이트 · OTA 업데이트 · 플래싱 · 체크섬 · 롤백

펌웨어를 지키는 검증 수단

보안 부팅 · 신뢰 사슬 · 전자 서명 · 공개 키 · TPM

펌웨어를 빌드하는 방식

크로스 컴파일 · 정적 링크 · 링커 스크립트 · 진입점

펌웨어를 흉내 내거나 건너뛰는 가상화 도구

가상 머신 · 하이퍼바이저 · QEMU · Firecracker · 마이크로VM

펌웨어가 보낸 값을 받는 서버 쪽 수단

텔레메트리 · 원격 감시 · MQTT · 시계열 데이터베이스

다른 이름: firmware · 펌웨어 이미지