U-Boot 소스코드 구조 분석 – RK3399 기반으로 이해하기
임베디드 리눅스 시스템에서 U-Boot는 가장 널리 사용되는 오픈소스 부트로더입니다. SoC 초기화부터 커널 로딩까지, 시스템 부팅의 핵심을 담당하는 제어 지점이기 때문에 U-Boot 구조를 이해하는 것은 플랫폼 포팅과 부트 문제 해결에 큰 도움이 됩니다.
이번 글에서는 RK3399 플랫폼을 예시로 U-Boot 디렉토리 구조, 구성 파일, 빌드 과정, 생성되는 이미지 파일을 분석해 보겠습니다.
1. U-Boot 디렉토리 구조
U-Boot는 플랫폼별·아키텍처별로 구분된 계층적 구조를 가지고 있습니다. 핵심 디렉토리를 하나씩 살펴보겠습니다.
u-boot/
├─ arch/
├─ board/
├─ cmd/
├─ drivers/
├─ include/
├─ configs/
├─ tools/
├─ Kconfig
└─ Makefile1.1 arch/
CPU 아키텍처별 코드를 포함합니다.
arch/arm/
├─ cpu/
├─ mach-rockchip/
├─ lib/RK3399 관련 초기화 코드는 주로 arch/arm/mach-rockchip/에 존재합니다. 예:
arch/arm/mach-rockchip/rk3399/
├─ clk_rk3399.c # 클럭 초기화
├─ dram_rk3399.c # DDR 초기화
└─ syscon_rk3399.c # 시스템 컨트롤러1.2 board/
보드 제조사·모델별 설정이 포함된 디렉토리입니다.
예: Firefly RK3399
board/firefly/rk3399/
├─ board.c # 보드 초기화
└─ MAINTAINERS1.3 drivers/
U-Boot에서 제공하는 주변장치 드라이버가 포함됩니다.
- MMC/SD
- USB
- I2C, SPI
- Ethernet
- GPIO
예:
drivers/mmc/rockchip_sdhci.c1.4 cmd/
U-Boot 명령어들을 정의하는 폴더입니다.
예: fatls, mmc, gpio 등.
예:
cmd/mmc.c
cmd/bootm.c1.5 include/
U-Boot 전체 헤더 파일이 위치합니다.
- 전역 설정 헤더
- 드라이버 인터페이스 헤더
- SoC/보드별 설정 헤더
특히 중요한 폴더:
include/configs/ # 보드 설정 헤더 파일 모음Firefly RK3399의 경우:
include/configs/rockchip_rk3399.h2. U-Boot 구성 파일 및 빌드 구조
U-Boot는 Linux 커널과 동일하게 Kconfig 시스템과 Makefile을 기반으로 빌드가 진행됩니다.
2.1 Kconfig
컴파일 옵션을 정의하며 menuconfig에서 UI 기반 선택이 가능합니다.
예:
config ROCKCHIP_RK3399
bool "Support Rockchip RK3399"
select ARM64
help
Enable support for Rockchip RK3399 SoC.2.2 Makefile
루트 Makefile은 전체 빌드 과정을 조율하고, 각 서브디렉토리의 Makefile이 실제 빌드를 진행합니다.
2.3 include/configs/
보드별 설정이 들어있는 헤더 파일입니다.
- 주변장치 활성화 여부
- 메모리 주소 매핑
- 부팅 순서(bootcmd)
예 (일부):
#define CONFIG_SYS_TEXT_BASE 0x00200000
#define CONFIG_SPL_STACK 0xff8ffff03. 빌드 과정과 defconfig의 의미
3.1 defconfig란?
보드별 기본 설정(.config)을 자동 생성하는 파일입니다.
RK3399 예시:
configs/rockchip_rk3399_defconfig명령어:
$ make rockchip_rk3399_defconfig→ .config 생성
3.2 빌드 과정
$ export CROSS_COMPILE=aarch64-linux-gnu-
$ make rockchip_rk3399_defconfig
$ make -j8빌드 과정은 다음 순서로 진행됩니다.
- defconfig로
.config생성 - Kconfig 기반 옵션 확정
- SPL 빌드
- U-Boot 메인 빌드
- 이미지 생성(u-boot.bin, u-boot.img 등)
SPL은 미니멀 부트로더로 DDR 초기화 등의 필수 작업을 먼저 수행합니다.
4. 빌드 후 생성되는 주요 이미지
U-Boot 빌드가 완료되면 아래와 같은 주요 이미지 파일들이 생성됩니다.
4.1 u-boot.elf
ELF 형식의 디버깅 가능한 심볼 포함 이미지입니다.
u-boot
├─ u-boot.elf→ GDB를 활용한 디버깅에 사용
4.2 u-boot.bin
실제 플래시 가능한 순수 바이너리 이미지입니다.
u-boot.bin→ 부트 ROM 또는 SPL에서 로드되는 핵심 실행 파일
4.3 u-boot.img
mkimage를 통해 생성된 헤더 포함 이미지입니다.
u-boot.img→ 부트 카운터, 보안 검증, 로딩 주소 등의 정보를 포함
RK3399에서는 보드에 따라 idbloader.img, trust.img도 함께 생성됩니다.
예:
idbloader.img # SPL + TPL 결합 이미지
trust.img # ATF(ARM Trusted Firmware)결론
U-Boot는 구조가 방대해 보이지만, 디렉토리 구조를 이해하고 보드별 파일의 역할만 정리해 두면 높은 난이도의 포팅 작업도 체계적으로 접근할 수 있습니다.
결론 요약: 디렉토리 구조를 알면 U-Boot는 두렵지 않다.
'u-boot' 카테고리의 다른 글
| U-Boot 빌드 및 보드 포팅 준비 (0) | 2025.12.03 |
|---|---|
| U-Boot란 무엇인가? (0) | 2025.12.01 |