포스트

임베디드 스터디 - 부트로더

임베디드 스터디 - 부트로더

로더(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 메모리에서 직접 소프트웨어를 실행하기엔 한계가 있다.
    1. 속도 문제 : Flash 접근 속도는 CPU의 동작 속도보다 훨씬 느리다. 또, NOR은 XIP가 가능하지만 NAND는 XIP가 지원이 안된다.
    2. 쓰기/실행 불가 : OS 실행 중에는 스택, 힙, 전역 변수를 사용해야하는데, Flash는 실행 중에 데이터 변경이 어렵다.
    3. 용량 문제 : OS의 커널 전체를 Flash 메모리에 펼쳐놓기엔 용량이 너무 작다.

1st Stage 부트로더

  • 칩 제조사의 MROM에서 실행된다.
  • 기초적인 하드웨어 초기화, 2nd Stage 부트로더의 RAM 메모리 복사를 담당한다.
  • 절대적으로 변조가 일어나면 안되기에, 칩 제조 시 MROM에 미리 구워져서 BootROM 코드가 삽입된다.

2nd Stage 부트로더

  • 1st Stage에서 복사된 코드가 RAM에서 실행된다.
  • U-Boot, GRUB, Barebox 같은 부트로더가 실행된다.
부트로더주 사용 환경특징
LILO구형 리눅스 PCLinux Loader, 초기 리눅스 표준
GRUBPC Linux / x86 서버멀티부트, BIOS/UEFI 모두 지원
BOOTLDR구형 임베디드 (iPAQ 등)ARM 기반 초기 임베디드용
U-Boot임베디드 Linux (ARM, RISC-V 등)가장 범용적, 방대한 하드웨어 지원
BLOBARM 기반 임베디드Boot Loader OBject
Barebox임베디드 LinuxLinux 커널 스타일, DT 친화적
  • 2nd Stage는 다음 세가지 역할을 수행한다.
    1. 하드웨어 초기화 : DRAM, 클럭, 주변장치 세팅 후 OS 로드
    2. OTA/업데이트 : JTAG 없이 네트워크·시리얼로 펌웨어 교체
    3. 부트 제어 : 멀티 이미지 관리, 롤백, 복구 모드
  • 부트로더 기능 범위

    기능부트로더 담당 여부
    하드웨어 초기화
    Flash 초기화
    네트워크 디바이스 초기화
    OS 커널 RAM 로드

베어 메탈 vs 부트로더 기반 시스템

  • 베어 메탈 기반 소프트웨어는 다음 실행 과정을 거친다.
    • 스타트업 코드에서 모든 하드웨어 초기화를 거치고 main() 함수를 실행한다. ``` 리셋 벡터 ↓ 스타트업 코드 (= 사실상 부트로더 역할)
    • SP 초기화
    • .bss 초기화
    • .data Flash→RAM 복사
    • main() 진입 ```
  • 부트로더 기반 소프트웨어는 다음 실행 과정을 거친다.
    • 이 때, 부트로더는 단순히 OS만을 위한 소프트웨어는 아니다. CPU의 Reset Vector 실행 후 점프하는 주소가 사용자 펌웨어일 수도, OS 커널일 수도 있다.
    • 정확하게는, 실행할 바이너리 이미지를 RAM에 로드하는 역할을 수행한다고 보는게 맞다.
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 라이센스를 따릅니다.