임베디드 리눅스 부트 체인

July 30, 2026 · 방문자

지난번에는 USB를 통해 펌웨어를 플래시하는 방법으로 DFU에 대해 다뤘다. 그 글은 그 자체로 답할 가치가 있는 질문 하나를 건너뛰었다: 전원 버튼을 누르는 순간과 셸 프롬프트가 나타나는 순간 사이에 실제로 무슨 일이 벌어지는가? DFU는 이 경로에서 갈라져 나온 하나의 가지일 뿐이므로, 전체 과정을 한 번 짚어볼 가치가 있다.

단계들

Mermaid 플로우차트로 그리면, (그 안에서 DFU가 차지하는 위치를 포함한) 체인은 다음과 같다.

flowchart TD
    A[Power-on / Reset] --> B[Boot ROM<br/>immutable, on-chip]
    B --> C{Valid image on<br/>boot media?}
    C -->|No / forced| D[ROM recovery mode<br/>UART / USB]
    C -->|Yes| E[SPL<br/>first-stage bootloader]
    E --> F[U-Boot<br/>second-stage bootloader]
    F --> G{Enter DFU?}
    G -->|Yes| H[DFU mode<br/>waiting for firmware over USB]
    G -->|No| I[Load kernel + device tree]
    I --> J[Linux kernel]
    J --> K[Mount root filesystem]
    K --> L[init / systemd]

그리고 렌더링된 모습은 다음과 같다.

임베디드 리눅스 부트 체인 플로우차트: 전원이 켜지면 부트 롬으로 리셋되고, 부트 롬은 부트 미디어에서 유효한 이미지를 확인한다. 이미지를 찾지 못하면(또는 복구 모드가 강제되면) UART/USB 복구 모드로 진입한다. 그렇지 않으면 SPL을 로드하고, SPL은 U-Boot 본체를 로드한다. U-Boot는 USB를 통해 펌웨어를 기다리는 DFU 모드로 진입하거나, 커널과 디바이스 트리를 로드해 리눅스를 부팅하고 루트 파일시스템을 마운트한 뒤 init/systemd로 제어를 넘길 수 있다.

부트 롬

제조 시점에 실리콘에 새겨지며, 이후 그 무엇도 변경할 수 없다. 부트 롬의 유일한 임무는 부트 모드 핀이나 eFuse에 따라 소수의 부트 미디어(eMMC, SD, QSPI 플래시, 때로는 USB) 중 하나에서 부팅 가능한 무언가를 찾아 그리로 점프하는 것이다. 유효한 것을 찾지 못하면, 대부분의 SoC는 이 단계에서 최소한의 UART 또는 USB 복구 모드로 폴백한다 — 칩과 어떤 식으로든 통신할 수 있는 가장 첫 번째 지점이다.

SPL

Secondary Program Loader의 줄임말이다(U-Boot에서 쓰는 용어이며, 다른 벤더들은 FSBL 등으로 부른다). DRAM이 초기화되기도 전에, 온칩 SRAM의 적은 용량 안에서 실행되므로 크기가 매우 작아야 한다. 주된 임무도 바로 그것이다: DRAM을 초기화한 뒤, 그 안으로 다음 단계 — 완전한 U-Boot — 를 로드하는 것.

U-Boot 본체

사람들이 "부트로더"라고 말할 때 대부분 이것을 가리킨다. 드라이버, 셸, 환경 변수, 네트워크 지원, 명령어 인터프리터를 갖추고 있다. DFU가 실제로 살고 있는 곳도 여기다 — dfu 0 mmc 0(또는 이와 유사한 명령)을 실행하면 U-Boot는 정상적인 부팅을 계속하는 대신 DFU 모드로 진입하며, 이것이 바로 호스트 측에서 dfu-util이 통신하는 대상이다. 그렇지 않으면, U-Boot는 커널 이미지와 디바이스 트리 블롭을 메모리에 로드하고 커널로 점프한다.

커널과 유저스페이스

커널은 스스로 압축을 해제하고, 콘솔을 띄우고, 전달받은 디바이스 트리를 이용해 하드웨어를 프로브한 뒤, 루트 파일시스템을 마운트한다 — 흔히 부트로더가 부팅했던 것과 동일한 eMMC나 SD 카드이며, 개발 중에는 때때로 NFS이기도 하다. 루트 파일시스템이 마운트되면 커널은 PID 1에게 제어를 넘긴다 — Yocto로 빌드한 이미지에서는 보통 systemd다 — 그리고 바로 그 지점에서 "유저스페이스"가 실제로 시작된다.

이것이 DFU에 왜 중요한가

DFU는 그것이 어디에 위치하는지 알아야 비로소 의미가 통한다: DFU는 커널을 로드하는 것 대신 U-Boot가 선택할 수 있는 우회로이지, 그 위에 별도로 덧붙여진 것이 아니다. 이 때문에 DFU가 모든 장애 상황을 구해줄 수는 없다 — 부트 롬 자체가 유효한 SPL을 찾지 못하면 U-Boot에는 아예 도달하지 못하며, 그럴 때는 부트 롬이 지원하는 복구 모드에 의존할 수밖에 없다(이는 벤더마다 크게 달라서 별도의 글로 다룰 만한 좋은 주제다).

더 읽을거리

관련 글

댓글