[U-Boot] U-Boot 정의 및 순서

SMJ·2025년 8월 24일

BSP development

목록 보기
2/17
post-thumbnail

<RBL → PBL → SPL → U-Boot → Kernel 부팅 과정>

```objectivec
전원 ON
   │
   ▼
┌──────────────────────────────┐
│ RBL (ROM Boot Loader)        │
│ - SoC 내부 Mask ROM에 고정    │
│ - 부팅모드핀 확인             │
│ - SD카드 0번 섹터에서 PBL 읽기│
└──────────────────────────────┘
   │   (칩 내부 SRAM/IRAM에 로드)
   ▼
┌──────────────────────────────┐
│ PBL (Primary Boot Loader)    │
│ - SD/eMMC/NAND 컨트롤러 초기화│
│ - SPL 위치로 이동하여 읽기    │
└──────────────────────────────┘
   │   (칩 내부 SRAM/IRAM → DDR 또는 IRAM)
   ▼
┌──────────────────────────────┐
│ SPL (Secondary Program Loader)│
│ - DDR 초기화                  │
│ - SD카드/플래시에서 U-Boot 본체│
│   (u-boot.bin) 읽기            │
└──────────────────────────────┘
   │   (DDR에 로드)
   ▼
┌──────────────────────────────┐
│ 메인 U-Boot                   │
│ - 환경변수 로드               │
│ - 커널(Image) + DTB 로드      │
│ - bootargs 전달               │
└──────────────────────────────┘
   │   (DDR에 커널 + DTB 로드)
   ▼
┌──────────────────────────────┐
│ Linux 커널                    │
│ - RootFS 마운트               │
│ - 사용자 공간 실행            │
└──────────────────────────────┘

1.1.1 전체 그림 잡기

  • U-Boot란?
    • 오픈 소스 부트로더로 시스템이 전원이 인가되거나 리셋될 때 가장 먼저 실행되는 코드
    • 하드웨어 초기화. 시스템 클럭 설정, 메모리 제어, Kernel을 메모리에 로드하고 실행하는 역할
  • 부트로더의 역할
    • 전원 켜짐 → SoC의 ROM 코드 실행 → 1차 부트로더(SPL) → 2차 부트로더(U‑Boot) → 커널 로드
  • U‑Boot이 하는 일
    • 하드웨어 초기화 (DRAM, 클럭, GPIO, 시리얼 콘솔, 저장장치 인터페이스)
    • 커널 이미지/디바이스 트리 로드
    • 환경변수에 따라 부팅 시나리오 결정
    • 네트워크/TFTP 부팅, MMC/eMMC 부팅 등 다양한 부팅 방식 지원

+) “U‑Boot Overview”
https://docs.u-boot.org/en/latest/


1.1.2 보드별 부팅 흐름 이해

  • start.S
    • CPU 아키텍처 초기화 (레지스터, 스택, 캐시, MMU)
    • 보드에 맞는 low-level init 실행
  • board_init_f() → board_init_r()
    • DRAM 설정, 시리얼, 클럭 초기화
    • 스토리지(MMC/NAND/SPI) 드라이버 초기화
  • SPL (Secondary Program Loader)
    • 메모리가 없는 환경에서 최소한의 코드로 DRAM 세팅 후 U‑Boot 본체 로드
  • 환경변수(bootcmd, bootargs) 읽어서 커널 로딩

+) arch/arm/cpu/ + board/<vendor>/<board> 디렉토리 코드를 직접 열어보기


1.1.3 커맨드·환경변수 익히기

  • printenv → 현재 환경변수 보기
  • setenv bootcmd '...' → 부팅 명령 변경
  • saveenv → 변경 저장
  • help → 사용 가능한 커맨드 목록
  • mmc list, fatls, load 등 저장장치 명령
  • tftpboot, ping 등 네트워크 부팅 관련 명령

+) 실제 보드에서 printenv와 부팅 로그를 비교하면서 bootcmd → 실행된 명령 흐름을 추적하는 게 효과적.


1.1.4 빌드와 포팅

  • U‑Boot 빌드
    make CROSS_COMPILE=arm-linux-gnueabihf- <board>_defconfig
    make CROSS_COMPILE=arm-linux-gnueabihf-
  • Device Tree 연계
    • 커널이 이해할 수 있는 하드웨어 정보를 부팅 전에 준비
  • 포팅 시 수정 포인트
    • board.c, Kconfig, MAINTAINERS, Makefile
    • 메모리 맵, 핀 설정, 클럭 트리
profile
Embedded Junior Developer

0개의 댓글