U-Boot란 무엇인가?
임베디드 시스템을 처음 접하면 가장 먼저 마주치는 소프트웨어가 바로 U-Boot입니다. 개발자의 입장에서 U-Boot는 단순한 부트로더가 아니라, 시스템을 이해하고 제어하는 데 매우 중요한 역할을 합니다. 본 글에서는 U-Boot의 개념부터 구조, 임베디드 환경에서 필요한 이유, 그리고 Rockchip RK3399 기반 예제를 중심으로 상세히 설명드리겠습니다.
U-Boot의 역할과 개념
U-Boot는 _Universal Boot Loader_의 약자로, 임베디드 시스템에서 가장 널리 사용하는 오픈소스 부트로더입니다. 부트로더는 하드웨어가 전원을 켠 직후 실행되는 소프트웨어로서, 하드웨어 초기화, 메모리 설정, 커널 로딩 등 운영체제를 실행하기 위한 준비를 담당합니다.
U-Boot는 다음과 같은 특징을 가지고 있습니다:
- 다양한 CPU 아키텍처 지원 (ARM, RISC-V, MIPS 등)
- 광범위한 보드와 SoC 지원
- 네트워크, 스토리지, 파일시스템 등의 풍부한 드라이버 지원
- 강력한 커맨드라인 인터페이스 제공
- 부트 환경 변수 관리 기능 제공
Bootloader의 단계: Stage 1과 Stage 2
임베디드 시스템의 부트 과정은 보통 두 단계로 나뉩니다.
1. Stage 1 (SPL: Secondary Program Loader)
SPL은 시스템이 가장 먼저 실행하는 아주 작은 크기의 부트로더입니다. 일반적으로 SoC 내부의 BootROM이 NAND, eMMC, SD 카드, SPI NOR Flash 등에서 SPL을 읽어 실행합니다.
SPL의 주요 역할은 다음과 같습니다:
- 최소한의 하드웨어 초기화 (DDR, 클럭 설정)
- Stage 2 이미지(U-Boot 본체) 로딩
2. Stage 2 (U-Boot 본체)
Stage 2는 우리가 흔히 알고 있는 U-Boot가 실행되는 단계입니다. 이 단계에서는 훨씬 풍부한 기능을 제공합니다.
역할은 다음과 같습니다:
- DRAM, 스토리지, 네트워크 등 하드웨어 전체 초기화
- 부트 커맨드 실행
- 커널 이미지(zImage, Image, uImage 등) 로딩 및 실행
- 장치 트리(Device Tree) 로딩
- 부트 환경 변수 관리
RK3399의 Boot Flow 예시
RK3399 기준 부트 흐름은 아래와 같습니다:
- BootROM 실행 → 부트 장치 검사
- IDBLoader(SPL) 로딩 및 실행
- U-Boot 본체(u-boot.itb) 로딩
- U-Boot에서 커널 및 DTB 로딩
- Linux 커널 실행
[BootROM] → [SPL(IDBLoader)] → [U-Boot] → [Kernel] → [RootFS]BIOS와 U-Boot의 차이
| 구분 | BIOS | U-Boot |
|---|---|---|
| 사용 환경 | PC | 임베디드 시스템 |
| 구조 | 폐쇄적 번들 | 오픈소스 |
| 확장성 | 제한적 | 매우 유연함 |
| 부트 대상 | HDD/SSD 중심 | 플래시, SD, eMMC, 네트워크 다양 |
| 커스터마이징 | 어려움 | 쉽고 코드 수정 가능 |
| 인터페이스 | 기본적인 설정 화면 | 강력한 CLI 제공 |
BIOS는 일반적인 PC에서만 사용되며, 제조사가 미리 구성해 둔 기능을 사용해야 합니다. 반면 U-Boot는 소스 코드 기반으로 보드에 맞게 포팅할 수 있으며, 임베디드 시스템에 최적화된 구조를 갖추고 있습니다.
임베디드 시스템에서 U-Boot가 필요한 이유
임베디드 시스템은 일반 PC와 달리 다음과 같은 특징을 갖습니다:
- 다양한 보드 구성과 주변 장치
- 직접적인 하드웨어 초기화 필요
- 일관된 스토리지/네트워크 환경 보장 어려움
따라서 U-Boot는 다음과 같은 점에서 필수적입니다:
- 하드웨어 의존적인 초기화를 직접 구현해야 함
- 보드별 특성을 반영한 부트 로직 작성 가능
- 네트워크 부트, TFTP, USB 업데이트 등 개발에 필요한 기능 제공
- 부트 환경 변수로 동적 설정 가능
즉, U-Boot는 임베디드 시스템에서 부팅의 전 과정을 책임지는 핵심 컴포넌트입니다.
U-Boot의 주요 기능
1. 하드웨어 초기화
예를 들면 RK3399 보드를 위한 초기화 항목은 다음과 같습니다:
- PLL 및 클럭 설정
- DDR 메모리 컨트롤러 초기화
- GPIO 설정 및 전원 레일 활성화
- PMIC 설정
2. 커널 이미지 로딩
U-Boot는 다양한 장치에서 커널을 읽어 들일 수 있습니다:
- eMMC
- SD 카드
- SPI NOR Flash
- USB
- 네트워크(TFTP)
RK3399 예제 환경변수:
setenv bootcmd "mmc dev 0; ext4load mmc 0:1 0x02000000 Image; ext4load mmc 0:1 0x01f00000 rk3399.dtb; booti 0x02000000 - 0x01f00000"
saveenv3. U-Boot 명령 인터페이스
U-Boot는 다양한 명령어를 제공합니다:
| 명령 | 설명 |
|---|---|
mmc, fatload, ext4load |
스토리지 읽기 |
printenv, setenv |
환경 변수 |
booti, bootm |
커널 실행 |
tftpboot |
네트워크 부트 |
usb start |
USB 장치 인식 |
RK3399에서 커널을 TFTP로 부팅하는 예제:
setenv ipaddr 192.168.0.10
setenv serverip 192.168.0.2
tftpboot 0x02000000 Image
tftpboot 0x01f00000 rk3399.dtb
booti 0x02000000 - 0x01f00000결론: "U-Boot는 임베디드 시스템의 첫 번째 운영자다."
U-Boot는 단순히 커널을 로딩하는 소프트웨어가 아니라, 임베디드 시스템의 하드웨어를 가장 먼저 만지고 제어하는 ‘첫 번째 운영자’입니다. 부트 과정 전반을 담당하며 개발자가 시스템을 이해하고 제어할 수 있도록 강력한 기능을 제공합니다.
앞으로 본 블로그에서는 RK3399 기반 시스템에서 U-Boot를 포팅하고, 디바이스 드라이버를 추가하고, 최종적으로 커널과 함께 동작시키는 전 과정을 차근차근 다뤄보겠습니다.
'u-boot' 카테고리의 다른 글
| U-Boot 부팅 시퀀스 완전 해부 (0) | 2025.12.04 |
|---|---|
| U-Boot 빌드 및 보드 포팅 준비 (0) | 2025.12.03 |
| U-Boot 소스코드 구조 분석 – RK3399 기반으로 이해하기 (0) | 2025.12.02 |