ARM Core - 4. ARM 프로세서의 운영 모드 및 시스템 프로그래밍 (3. 부트로더 및 시스템 초기화 실습)

2025. 3. 7. 13:40정보기술/하드웨어

3. 부트로더 및 시스템 초기화 실습: U-Boot 실습 (부트 메시지 출력)


1. U-Boot란?

U-Boot(Universal Bootloader)는 ARM 기반 임베디드 시스템에서 널리 사용되는 오픈소스 부트로더로, 운영체제가 실행되기 전에 하드웨어를 초기화하고 커널을 로드하는 역할을 한다.

U-Boot의 주요 기능

기능  설명
하드웨어 초기화 CPU, RAM, 클럭, I/O 설정
부팅 모드 지원 SD 카드, eMMC, 네트워크(TFTP) 부팅
커널 및 루트파일시스템 로드 Linux 커널 및 Device Tree 로드
디버깅 지원 U-Boot 콘솔을 통한 시스템 진단

2. U-Boot 환경 설정 및 빌드

1) 필요 패키지 설치 (Ubuntu 기준)

sudo apt update
sudo apt install gcc-arm-linux-gnueabihf make git

2) U-Boot 소스 코드 다운로드

git clone https://source.denx.de/u-boot/u-boot.git
cd u-boot

3) 최신 버전 확인 및 설정

git tag | tail -n 5  # 최신 태그 확인
git checkout v2024.04  # 최신 버전으로 체크아웃

4) 대상 보드 설정 (예: QEMU 가상 보드)

make qemu_arm_defconfig
  • qemu_arm_defconfig는 QEMU(ARM 가상 보드)용 기본 설정 파일이다.

5) U-Boot 빌드

make -j$(nproc) CROSS_COMPILE=arm-linux-gnueabihf-
  • CROSS_COMPILE=arm-linux-gnueabihf- → ARM 크로스 컴파일러 사용

6) 빌드 완료 후 U-Boot 실행 파일 확인

ls -l u-boot.bin
  • u-boot.bin이 생성되었으면 빌드 성공

3. QEMU에서 U-Boot 실행 및 부트 메시지 출력

1) QEMU를 이용한 U-Boot 실행

qemu-system-arm -M virt -cpu cortex-a15 -nographic -kernel u-boot.bin
  • -M virt → QEMU 가상 ARM 보드 사용
  • -cpu cortex-a15 → Cortex-A15 프로세서 에뮬레이션
  • -nographic → GUI 없이 콘솔 모드로 실행
  • -kernel u-boot.bin → 빌드한 U-Boot 실행

2) 부트 메시지 확인

U-Boot가 실행되면 다음과 같은 메시지가 출력된다.

U-Boot 2024.04 (Mar 06 2025 - 12:00:00)

DRAM:  512 MiB
Flash: 64 MiB
In:    serial
Out:   serial
Err:   serial
Net:   No ethernet found.
Hit any key to stop autoboot:  0
=> _
  • U-Boot 2024.04 → 최신 빌드된 U-Boot 버전 표시
  • DRAM: 512 MiB → RAM 크기 확인
  • Hit any key to stop autoboot → 자동 부팅을 중지하려면 키 입력 가능
  • => → U-Boot 명령 프롬프트가 표시됨

4. U-Boot 명령어 실습

U-Boot는 명령어 기반 콘솔을 제공하며, 다양한 부트 관련 명령을 실행할 수 있다.

1) 현재 환경 변수 확인

printenv
  • 현재 설정된 환경 변수 출력

2) 메모리 내용 확인

md 0x10000000 10
  • md(memory display) 명령어로 지정된 주소(0x10000000)에서 10개의 워드 출력

3) 부팅 모드 설정

setenv bootcmd 'bootm 0x82000000'
saveenv
  • setenv bootcmd → 부팅 명령을 설정
  • saveenv → 변경된 설정을 저장

4) 부팅 테스트

boot
  • boot 명령어를 실행하면 설정된 커널이 로드됨

5. U-Boot 부트 메시지 커스텀하기

U-Boot 실행 시 출력되는 메시지를 변경할 수도 있다.

1) board_init_f() 함수 수정

U-Boot 부트 메시지를 변경하려면 board_init_f() 함수를 수정해야 한다.
이 함수는 common/board_f.c 파일에 정의되어 있다.

소스 코드 수정 (common/board_f.c)

#include <common.h>
#include <init.h>
#include <stdio.h>

int board_init_f(ulong boot_flags) {
    printf("\n*** Custom U-Boot Build: Hello from U-Boot! ***\n");
    
    /* 기존 U-Boot 초기화 코드 */
    return 0;
}
  • printf("\n*** Custom U-Boot Build: Hello from U-Boot! ***\n"); 추가
  • U-Boot 부팅 시 해당 메시지가 출력됨

2) 변경 후 다시 빌드 및 실행

make -j$(nproc) CROSS_COMPILE=arm-linux-gnueabihf-
qemu-system-arm -M virt -cpu cortex-a15 -nographic -kernel u-boot.bin
  • 실행하면 U-Boot 부트 메시지와 함께 새로운 메시지가 출력된다.
*** Custom U-Boot Build: Hello from U-Boot! ***

U-Boot 2024.04 (Mar 06 2025 - 12:00:00)

DRAM:  512 MiB
...

6. 실습 요약

실습 단계 설명
U-Boot 다운로드 및 빌드 최신 버전(2024.04) 소스를 받아 크로스 컴파일
QEMU에서 실행 빌드한 U-Boot를 QEMU에서 실행
부트 메시지 출력 U-Boot 실행 시 기본 부트 메시지 확인
U-Boot 명령어 실습 printenv, md, boot 등의 기본 명령 실행
부트 메시지 커스텀 board_init_f()를 수정하여 메시지 변경

7. 결론

  • U-Boot는 ARM 기반의 강력한 부트로더로, 다양한 보드에서 사용 가능하다.
  • QEMU를 활용하면 실제 보드 없이도 U-Boot를 실습할 수 있다.
  • printenv, md, boot 등의 명령을 통해 부트 환경을 제어할 수 있다.
  • 소스 코드를 수정하여 부트 메시지를 커스텀할 수 있다.

본 실습을 통해 부트로더의 동작 방식과 ARM 기반 시스템의 초기화 과정을 익힐 수 있다.