부트로더(Bootloader)는 전원을 켜면 앱보다 먼저 실행되는 작은 프로그램입니다. 앱에 문제가 없는지 확인한 뒤 앱을 실행시키고, 업데이트할 때는 디버거 없이 USB나 통신선으로 받은 새 펌웨어를 플래시에 써 줍니다. 아두이노를 USB 케이블만으로 업로드할 수 있는 것도 부트로더가 있어서예요.
먼저 알아둘 용어 (눌러서 펼치기)
| 용어 | 원래 이름 | 쉽게 말하면 |
|---|---|---|
| MCU | Micro Controller Unit | CPU·메모리·주변장치를 칩 하나에 넣은 작은 컴퓨터 |
| 펌웨어 | Firmware | MCU 안에 저장돼 제품을 움직이는 프로그램. 부트로더가 있다면 부트로더와 앱을 합친 것 |
| 플래시 | Flash Memory | 전원을 꺼도 내용이 남는 메모리. 새로 쓰려면 먼저 지워야 함 |
| RAM | Random Access Memory | 전원이 꺼지면 내용이 사라지는 작업용 메모리 |
| 디버거 | Debugger | PC와 MCU를 연결해 펌웨어를 넣고, 실행을 멈춰 가며 확인하는 장비 |
| 부트로더 | Bootloader | 전원을 켜면 가장 먼저 실행되어 앱을 실행할지, 업데이트할지 정하는 작은 프로그램 |
| 앱 | Application (애플리케이션) | 제품의 실제 기능을 하는 프로그램. 업데이트 때 바뀌는 부분 |
| 리셋 | Reset | MCU를 처음 상태로 되돌려 정해진 주소부터 다시 실행시키는 것 |
| 점프 | Jump | 실행 위치를 다른 주소로 옮기는 것. 책을 읽다 다른 쪽으로 넘어가는 것과 비슷함 |
| CRC | Cyclic Redundancy Check (순환 중복 검사) | 데이터 전체로 계산한 확인용 값. 한 비트만 달라져도 값이 바뀜 |
| 벽돌 | Brick | 실행도 업데이트도 안 되는 보드를 부르는 현업 표현 |
| 리프로그래밍 | Reprogramming (= 플래싱, Flashing) | 부트로더가 통신으로 받은 새 펌웨어를 플래시에 다시 쓰는 일 |
| USB | Universal Serial Bus | PC와 주변기기를 연결할 때 쓰는 통신 |
| UART | Universal Asynchronous Receiver/Transmitter | 선 몇 가닥으로 데이터를 주고받는 기본적인 시리얼 통신 |
| CAN | Controller Area Network | 자동차 제어기들이 두 가닥 선으로 데이터를 주고받는 통신 |
| OTA | Over-The-Air | 선을 연결하지 않고 무선으로 하는 업데이트 |
| ROM | Read-Only Memory | 칩을 만들 때 내용을 넣어 두어 바꿀 수 없는 메모리 |
디버거 없이 펌웨어를 바꿀 수 있을까?
회사에서 보드에 펌웨어를 넣을 때는 보통 디버거를 연결하고 다운로드합니다. 그런데 아두이노는 디버거 없이 USB 케이블만 꽂고 업로드 버튼을 누르면 프로그램이 들어갑니다.
출하된 제품도 비슷합니다. 케이스가 닫혀 있고, 디버거 단자는 안쪽에 있거나 아예 없습니다. 그래도 자동차 제어기는 정비소에서 진단 장비를 연결해 펌웨어를 바꾸고, OTA로 무선 업데이트를 하기도 해요. 디버거 없이 플래시를 지우고 다시 쓰는 일은 누가 하는 걸까요?
부트로더가 필요한 이유: 앱이 스스로를 고쳐 쓰면 위험하다
앱이 새 펌웨어를 받아서 자기 자리에 그대로 쓰면 될 것 같지만, 플래시는 이미 쓴 자리에 바로 덮어쓸 수 없습니다. 먼저 지우고 나서 써야 해요. 그런데 앱이 자기 자리를 지우면 지금 실행 중인 코드도 같이 지워집니다. 달리는 차에서 엔진을 떼어 내는 것과 같습니다. 또 많은 MCU는 플래시를 지우거나 쓰는 동안 같은 영역의 코드를 실행하지 못합니다.
쓰는 도중에 전원이 꺼지는 것도 문제입니다. 반만 써진 코드가 남으면 다음에 전원을 켜도 업데이트를 다시 받을 코드가 없습니다. 이런 상태를 현업에서는 "벽돌이 됐다"고 합니다.
그래서 플래시를 두 칸으로 나눕니다. 앞칸에는 거의 바꾸지 않는 부트로더를, 뒤칸에는 자주 바꾸는 앱을 둡니다. 차를 세워 두고 정비사가 엔진을 바꾸듯이, 업데이트는 부트로더가 맡아서 앱 칸만 지우고 씁니다. 부트로더 칸은 건드리지 않기 때문에 업데이트가 중간에 끊겨도 다시 시도할 수 있어요.
업데이트 코드를 RAM에서 실행하거나 플래시를 두 벌 두는 방법도 있습니다. 이 경우에도 업데이트가 끊겼을 때 복구를 맡을 코드는 따로 있어야 하고, 보통 부트로더가 이 역할을 합니다.
옆으로 밀면 그림 전체를 볼 수 있어요 ↔
전원을 켜면 무슨 일이 일어날까: 부트로더 동작 흐름
MCU는 리셋되면 정해진 주소부터 실행합니다. 이 주소는 MCU마다 다르고 데이터시트에 나와 있어요. 이 주소에 부트로더를 두면 전원을 켤 때마다 부트로더가 먼저 실행됩니다.
부트로더는 실행되면 두 가지를 확인합니다.
첫째, 업데이트 요청이 있는지 확인합니다. 요청 방법은 제품마다 다릅니다. 특정 버튼을 누른 채 전원을 켜는 방법, 앱이 업데이트 명령을 받으면 표시를 남기고 리셋하는 방법, 전원을 켠 직후 잠깐 통신을 기다리는 방법 등이 있어요. 아두이노는 마지막 방법을 씁니다. 업로드 직전에 보드를 리셋하고, 부트로더가 기다리는 동안 새 프로그램을 보냅니다. 요청이 있으면 부트로더는 앱을 실행하지 않고 업데이트를 진행합니다.
둘째, 앱이 정상인지 확인합니다. 앱을 플래시에 쓸 때 앱 전체로 계산한 CRC 값도 함께 써 둡니다. 부트로더는 부팅할 때마다 앱 칸의 CRC를 다시 계산해서 저장된 값과 비교합니다. 영수증 합계를 다시 계산해 맞춰 보는 것과 비슷한데, CRC는 덧셈이 아니라 정해진 나눗셈 규칙으로 계산해서 한 비트만 달라져도 값이 바뀝니다. 값이 같으면 앱으로 점프하고, 다르면 앱이 덜 써졌거나 깨진 것으로 보고 부트로더에 남아 새 펌웨어를 기다립니다.
아래 애니메이션에서 세 가지 경우를 볼 수 있습니다. 버튼으로 경우를 골라 볼 수도 있어요.
옆으로 밀면 그림 전체를 볼 수 있어요 ↔
평소 부팅: 업데이트 요청이 없고 CRC 값도 같으므로 부트로더는 앱으로 점프합니다.
평소에는 첫 번째 경우만 반복되므로 사용자는 부트로더가 있다는 것을 느끼지 못합니다. 부트로더가 실제로 일을 하는 건 업데이트할 때와 앱에 문제가 생겼을 때입니다.
부트로더의 용도 3가지
현장 업데이트: 제품 밖으로 나와 있는 USB나 통신선(UART, CAN 등)으로 새 펌웨어를 받아 앱 칸에 씁니다. 아두이노 업로드와 정비소의 제어기 업데이트가 여기에 해당합니다. OTA도 무선으로 받은 파일을 최종적으로 제어기 플래시에 써야 하는데, 이 단계를 부트로더가 맡는 경우가 많습니다. 현업에서는 이 작업을 리프로그래밍 또는 플래싱이라고 해요.
앱 검사: 반만 써진 앱을 실행하면 엉뚱한 주소를 실행하다 멈추거나, 출력 핀이 의도와 다르게 움직일 수 있습니다. 부트로더는 CRC 검사를 통과한 앱만 실행하기 때문에 이런 상황을 막을 수 있습니다.
복구: 업데이트 중에 전원이나 통신이 끊겨도 부트로더 칸은 지워지지 않습니다. 다음에 전원을 켜면 앱 검사에서 실패하므로 부트로더에 남고, 업데이트를 다시 하면 돼요. 부트로더가 있으면 업데이트에 실패해도 벽돌이 되지 않는 이유입니다.
부트로더의 두 종류: 칩에 들어 있는 것과 직접 만드는 것
부트로더는 누가 넣어 두었는지에 따라 두 가지로 나눌 수 있습니다.
| 구분 | 칩에 들어 있는 부트로더 | 직접 만드는 부트로더 |
|---|---|---|
| 누가 넣어 두나 | MCU 제조사가 칩을 만들 때 ROM(또는 바꿀 수 없게 막아 둔 영역)에 넣어 둠 | 개발자가 직접 만들어 플래시의 정해진 칸에 넣음 |
| 언제 실행되나 | 정해진 핀을 설정하고 리셋하는 등 특별한 조건에서만 | 전원을 켤 때마다 항상 먼저 |
| 통신 방식 | 제조사가 정한 방식 (주로 UART, USB) | 제품에 맞게 정함 (차량이라면 CAN 등) |
| 주로 쓰는 때 | 개발 중 디버거 없이 펌웨어를 넣을 때, 벽돌이 된 보드를 살릴 때 | 출하 후 현장 업데이트 |
칩에 들어 있는 부트로더는 따로 만들 필요는 없지만, 통신 방식이나 앱 검사 방법을 바꿀 수 없습니다. 그래서 현장 업데이트가 필요한 양산 제품은 부트로더를 직접 만들어 쓰는 경우가 많아요. 이 글에서 설명한 부트로더도 직접 만드는 쪽입니다.
직접 만드는 부트로더는 기능을 최소한으로 줄입니다. 출하 후에는 부트로더를 거의 바꾸지 않아서, 부트로더에 버그가 있으면 현장에서 고치기 어렵기 때문입니다. 업데이트 요청 확인, 앱 검사, 새 펌웨어 쓰기 정도만 넣고 나머지 기능은 앱에서 처리합니다.
부트로더 자주 묻는 질문
모든 제품에 부트로더가 꼭 필요한가요?
부트로더 자체도 업데이트할 수 있나요?
정리
'임베디드 실무' 카테고리의 다른 글
| MISRA-C 규칙, 왜 이렇게 까다로울까? 양산 전 코딩 규칙 입문 [초급] (1) | 2026.10.01 |
|---|---|
| 디버거는 어떻게 코드를 한 줄씩 따라갈까 [초급] (0) | 2026.09.29 |
| 폴링 vs 인터럽트, 버튼을 톡 치면 왜 가끔 안 먹을까? [초급] (0) | 2026.09.29 |
| [초급] 풀다운이 더 직관적인데, 스위치엔 왜 풀업 저항을 쓸까? (0) | 2026.09.27 |
| [초급] 차를 세워 뒀을 뿐인데 왜 배터리가 방전될까? 제어기 슬립(Sleep) 모드가 필요한 이유 (0) | 2026.09.26 |
