임베디드 스터디 - 부트로더
임베디드 스터디 - 부트로더
로더(Loader) 종류
- 로더는 실행 파일을 메모리에 적재하는 소프트웨어로, 방식에 따라 4가지로 분류된다.
1
소스코드 → 컴파일러 → 오브젝트 파일(.o) → 링커 → 실행 파일(.elf) → 로더 → 메모리(RAM)
| 로더 | 동작 방식 | 특징 |
|---|---|---|
| Compile-and-Go Loader | 컴파일 즉시 메모리에 적재 | 별도 로더 불필요, 유연성 없음 |
| Absolute Loader | 고정 절대 주소에 그대로 적재 | 구조 단순, 주소 충돌 위험 |
| Direct Linking Loader | 링킹·재배치·적재를 한 번에 수행 | 일반적인 로더 — 가장 표준적 |
| Dynamic Loading Loader | 필요한 시점에 메모리에 적재 | 메모리 효율 높음, 실행 중 로드 |
OS 기반 펌웨어
- OS(Linux 등) 기반의 펌웨어는 다음 과정을 거쳐 소프트웨어가 구동된다.
1
2
3
4
5
6
7
8
9
전원 인가
↓
① 1st Stage — SoC 내부 BootROM(MROM)에서 실행
역할: 클럭/기본 초기화, Flash에서 2nd Stage를 SRAM으로 복사
↓
② 2nd Stage — SRAM 또는 DRAM에서 실행
역할: 하드웨어 전체 초기화, OS 커널을 RAM으로 로드
↓
③ OS 커널 실행
Flash 메모리의 한계
- Flash에서 직접 코드를 실행하는 방식을 XIP(eXecute In Place)라고 한다.
- 임베디드 장치의 모든 코드는 Flash에 저장되어 있지만, Flash 메모리에서 직접 소프트웨어를 실행하기엔 한계가 있다.
- 속도 문제 : Flash 접근 속도는 CPU의 동작 속도보다 훨씬 느리다. 또, NOR은 XIP가 가능하지만 NAND는 XIP가 지원이 안된다.
- 쓰기/실행 불가 : OS 실행 중에는 스택, 힙, 전역 변수를 사용해야하는데, Flash는 실행 중에 데이터 변경이 어렵다.
- 용량 문제 : OS의 커널 전체를 Flash 메모리에 펼쳐놓기엔 용량이 너무 작다.
1st Stage 부트로더
- 칩 제조사의 MROM에서 실행된다.
- 기초적인 하드웨어 초기화, 2nd Stage 부트로더의 RAM 메모리 복사를 담당한다.
- 절대적으로 변조가 일어나면 안되기에, 칩 제조 시 MROM에 미리 구워져서 BootROM 코드가 삽입된다.
2nd Stage 부트로더
- 1st Stage에서 복사된 코드가 RAM에서 실행된다.
- U-Boot, GRUB, Barebox 같은 부트로더가 실행된다.
| 부트로더 | 주 사용 환경 | 특징 |
|---|---|---|
| LILO | 구형 리눅스 PC | Linux Loader, 초기 리눅스 표준 |
| GRUB | PC Linux / x86 서버 | 멀티부트, BIOS/UEFI 모두 지원 |
| BOOTLDR | 구형 임베디드 (iPAQ 등) | ARM 기반 초기 임베디드용 |
| U-Boot | 임베디드 Linux (ARM, RISC-V 등) | 가장 범용적, 방대한 하드웨어 지원 |
| BLOB | ARM 기반 임베디드 | Boot Loader OBject |
| Barebox | 임베디드 Linux | Linux 커널 스타일, DT 친화적 |
- 2nd Stage는 다음 세가지 역할을 수행한다.
- 하드웨어 초기화 : DRAM, 클럭, 주변장치 세팅 후 OS 로드
- OTA/업데이트 : JTAG 없이 네트워크·시리얼로 펌웨어 교체
- 부트 제어 : 멀티 이미지 관리, 롤백, 복구 모드
부트로더 기능 범위
기능 부트로더 담당 여부 하드웨어 초기화 ✅ Flash 초기화 ✅ 네트워크 디바이스 초기화 ✅ OS 커널 RAM 로드 ✅
베어 메탈 vs 부트로더 기반 시스템
- 베어 메탈 기반 소프트웨어는 다음 실행 과정을 거친다.
- 스타트업 코드에서 모든 하드웨어 초기화를 거치고
main()함수를 실행한다. ``` 리셋 벡터 ↓ 스타트업 코드 (= 사실상 부트로더 역할) - SP 초기화
- .bss 초기화
- .data Flash→RAM 복사
- main() 진입 ```
- 스타트업 코드에서 모든 하드웨어 초기화를 거치고
- 부트로더 기반 소프트웨어는 다음 실행 과정을 거친다.
- 이 때, 부트로더는 단순히 OS만을 위한 소프트웨어는 아니다. CPU의
Reset Vector실행 후 점프하는 주소가 사용자 펌웨어일 수도, OS 커널일 수도 있다. - 정확하게는, 실행할 바이너리 이미지를 RAM에 로드하는 역할을 수행한다고 보는게 맞다.
- 이 때, 부트로더는 단순히 OS만을 위한 소프트웨어는 아니다. CPU의
1
2
3
4
5
6
7
8
9
BootROM (1st Stage)
↓
U-Boot (2nd Stage)
- 하드웨어 초기화
- 커널 이미지 RAM으로 로드
↓
Linux 커널 스타트업 코드
- .bss 초기화, 페이지 테이블 설정
- start_kernel() 진입
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.