u-boot

U-Boot 소스코드 구조 분석 – RK3399 기반으로 이해하기

임베디드 친구 2025. 12. 2. 20:40
728x90
반응형

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
 └─ Makefile

1.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           # 보드 초기화
 └─ MAINTAINERS

1.3 drivers/

U-Boot에서 제공하는 주변장치 드라이버가 포함됩니다.

  • MMC/SD
  • USB
  • I2C, SPI
  • Ethernet
  • GPIO

예:

drivers/mmc/rockchip_sdhci.c

1.4 cmd/

U-Boot 명령어들을 정의하는 폴더입니다.
예: fatls, mmc, gpio 등.

예:

cmd/mmc.c
cmd/bootm.c

1.5 include/

U-Boot 전체 헤더 파일이 위치합니다.

  • 전역 설정 헤더
  • 드라이버 인터페이스 헤더
  • SoC/보드별 설정 헤더

특히 중요한 폴더:

include/configs/     # 보드 설정 헤더 파일 모음

Firefly RK3399의 경우:

include/configs/rockchip_rk3399.h

2. 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    0xff8ffff0

3. 빌드 과정과 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

빌드 과정은 다음 순서로 진행됩니다.

  1. defconfig로 .config 생성
  2. Kconfig 기반 옵션 확정
  3. SPL 빌드
  4. U-Boot 메인 빌드
  5. 이미지 생성(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