U-Boot 포팅 (1. U-Boot 개요 및 기본 개념 / U-Boot란?)

2025. 2. 26. 12:25프로그래밍/시스템

U-Boot란?

U-Boot(Unified Bootloader)는 임베디드 시스템에서 널리 사용되는 오픈소스 부트로더입니다.
ARM, RISC-V, PowerPC, MIPS 등의 임베디드 프로세서에서 작동하며, 운영체제(예: 리눅스, RTOS 등)를 로드하고 실행하는 역할을 수행합니다.

임베디드 시스템에서 하드웨어 초기화, 부팅 옵션 설정, 네트워크 부팅, 환경 변수 관리 등 다양한 기능을 제공하여, 사용자가 원하는 방식으로 시스템을 부팅할 수 있도록 지원합니다.


1. 부트로더의 개념 및 역할

부트로더란?

부트로더(Bootloader)는 전원이 켜졌을 때 CPU가 실행하는 첫 번째 소프트웨어입니다.
운영체제(OS)를 실행하기 전에 하드웨어를 초기화하고, 커널을 로드하는 역할을 합니다.

부트 과정 요약
1️⃣ ROM 코드 실행 (CPU 내장 BootROM 또는 Flash에서 부트로더 실행)
2️⃣ 1차 부트로더(SPL, Secondary Program Loader) 실행
3️⃣ 2차 부트로더(U-Boot 메인 바이너리) 실행
4️⃣ 운영체제(리눅스, RTOS 등) 로드 및 실행

U-Boot의 역할

하드웨어 초기화

  • CPU, RAM, 클럭, 전원 관리, GPIO, 시리얼(UART), I2C, SPI 등 기본적인 장치 설정
    부팅 옵션 제공
  • SD 카드, eMMC, NAND, 네트워크(TFTP), USB 등 다양한 부팅 방식 지원
    운영체제 커널 로드 및 실행
  • 리눅스 커널 및 디바이스 트리를 메모리에 로드하고 실행
    네트워크 부팅 지원
  • TFTP, NFS를 통한 원격 부팅 가능
    환경 변수 관리
  • U-Boot 환경 변수 저장 및 부팅 설정 변경 가능

2. U-Boot의 특징과 지원하는 아키텍처

U-Boot의 특징

오픈소스 프로젝트 (GPL 라이선스)
C언어 기반, 다양한 보드 및 프로세서 지원
커스터마이징 가능 (보드별 환경 설정 및 코드 수정 가능)
다양한 부트 옵션 지원 (NAND, SD, eMMC, 네트워크 부팅)
환경 변수 사용 가능 (bootcmd, bootargs 등)
네트워크 및 진단 기능 제공 (TFTP, DHCP, PXE 지원)
Shell-like 인터페이스 지원 (커맨드라인에서 직접 조작 가능)

지원하는 아키텍처

U-Boot는 다양한 프로세서 아키텍처를 지원합니다.
다음과 같은 아키텍처에서 사용할 수 있습니다.

아키텍처  설명
ARM Cortex-A/R/M 시리즈 지원 (Raspberry Pi, BeagleBone, i.MX, Allwinner, Rockchip 등)
RISC-V 오픈소스 ISA 기반 아키텍처 (SiFive, Kendryte 등)
PowerPC 기존 PowerPC 기반 임베디드 보드 지원
MIPS 네트워크 라우터 등 MIPS 기반 장치 지원
x86 일부 x86 임베디드 시스템 지원 (일반 PC에서는 UEFI 사용이 일반적)

3. U-Boot의 주요 기능

U-Boot는 단순한 부트로더가 아니라 부팅 환경을 설정하고, 다양한 기능을 제공하는 강력한 도구입니다.
아래는 주요 기능을 정리한 내용입니다.

1) 부트 스트랩(Boot Strap)

U-Boot는 전원이 켜지면 가장 먼저 실행되는 프로그램으로, 다음과 같은 기능을 수행합니다.
CPU 및 RAM 초기화
클럭 및 전원 관리 설정
부트 미디어 탐색 (NAND, eMMC, SD, 네트워크 등)
1차 부트로더(SPL)에서 2차 부트로더(U-Boot)로 제어 전달

📌 예제: RAM 초기화 코드 (ARM Cortex-A)

void dram_init(void)
{
    gd->ram_size = get_ram_size();
}

2) U-Boot 커맨드 (명령어)

U-Boot에는 자체적인 CLI(Command Line Interface)가 있어, 사용자가 직접 명령어를 입력하여 부팅 과정을 제어할 수 있습니다.

주요 명령어

명령어  설명
help 사용 가능한 명령어 목록 출력
printenv 환경 변수 확인
setenv var value 환경 변수 설정
saveenv 환경 변수 저장
bootm 커널 이미지 실행 (bootm <addr>)
tftp TFTP 서버에서 파일 다운로드
dhcp DHCP 서버로부터 IP 설정
fatload FAT 파일 시스템에서 파일 로드
ext4load ext4 파일 시스템에서 파일 로드
reset 시스템 리셋

📌 예제: 환경 변수 설정 및 커널 부팅

setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rw
saveenv
bootm 0x82000000

3) 네트워크 부팅 (TFTP, PXE, NFS)

U-Boot는 네트워크를 통해 원격으로 OS를 다운로드하고 실행할 수 있습니다.

TFTP 부팅 (커널 이미지 다운로드 후 실행)

setenv ipaddr 192.168.1.100
setenv serverip 192.168.1.1
tftp 0x82000000 uImage
bootm 0x82000000

NFS 부팅 (리눅스 루트 파일시스템 마운트)

setenv bootargs root=/dev/nfs nfsroot=192.168.1.1:/nfsroot
tftp 0x82000000 uImage
bootm 0x82000000

PXE 부팅 (자동 네트워크 부팅 설정)

dhcp
pxe get
pxe boot

4) 저장 장치 관리 (NAND, SD, eMMC)

U-Boot는 다양한 저장 장치에서 커널과 파일을 로드할 수 있습니다.

SD 카드에서 커널 로드

fatload mmc 0:1 0x82000000 zImage
bootz 0x82000000

NAND 플래시에서 U-Boot 로드

nand read 0x82000000 0x400000 0x800000
bootm 0x82000000

eMMC에서 환경 변수 저장

mmc dev 0
ext4load mmc 0:1 0x82000000 boot.scr
source 0x82000000

📌 정리

U-Boot는 임베디드 시스템에서 운영체제(리눅스 등)를 로드하는 역할을 하는 부트로더이다.
부팅 과정에서 하드웨어를 초기화하고, 다양한 저장장치 및 네트워크를 통해 커널을 로드할 수 있다.
ARM, RISC-V, PowerPC 등 다양한 아키텍처를 지원하며, 커스터마이징이 가능하다.
CLI 명령어를 제공하여 부팅 과정 및 환경 변수를 제어할 수 있다.
TFTP, PXE, SD, eMMC, NAND 등 다양한 부팅 방식을 지원한다.