임베디드 리눅스 부트 체인
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]
그리고 렌더링된 모습은 다음과 같다.
부트 롬
제조 시점에 실리콘에 새겨지며, 이후 그 무엇도 변경할 수 없다. 부트 롬의 유일한 임무는 부트 모드 핀이나 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에는 아예 도달하지 못하며, 그럴 때는 부트 롬이 지원하는 복구 모드에 의존할 수밖에 없다(이는 벤더마다 크게 달라서 별도의 글로 다룰 만한 좋은 주제다).
더 읽을거리
- U-Boot: Generic SPL framework — SPL이 어떻게 빌드되고 무엇을 담당하는지.
- Trusted Firmware-A: Firmware Design — 보안 부트 체인을 갖춘 많은 최신 Arm SoC에서 사용되는, U-Boot 아래에 위치하는 더 정교한 다단계 부트 흐름(BL1/BL2/BL31/BL32/BL33).
관련 글
- 디바이스 트리란 무엇인가 — 하드웨어를 커널에 알려주는 방식
- DFU란 무엇인가 — 다른 길이 없을 때 USB로 펌웨어 굽기
댓글