U-Boot 포팅 (실습 프로젝트: 새로운 보드에 U-Boot 포팅 / 최종 목표: 새로운 보드에서 U-Boot 및 리눅스 커널 부팅 성공)

2025. 3. 5. 12:56프로그래밍/시스템

최종 목표: 새로운 보드에서 U-Boot 및 리눅스 커널 부팅 성공

이 프로젝트의 최종 목표는 새로운 보드에서 U-Boot를 정상적으로 구동하고, 이를 통해 리눅스 커널을 로드하여 부팅을 성공시키는 것입니다.
이를 위해 U-Boot 포팅, 디바이스 트리 수정, SD 카드 및 eMMC 부팅 설정, 커널 로드 및 부팅 과정 디버깅을 수행해야 합니다.


1. U-Boot 정상 구동 확인

🔹 1) U-Boot 부팅 테스트

📌 SD 카드 또는 eMMC에 U-Boot 설치 후 부팅

  • 보드에 SD 카드를 삽입하거나 eMMC를 사용하여 전원을 켜고 U-Boot 실행을 확인해야 합니다.

📌 시리얼 콘솔(UART)에서 부팅 로그 확인

sudo minicom -D /dev/ttyUSB0 -b 115200

또는

sudo picocom -b 115200 /dev/ttyUSB0

📌 정상적인 부팅 로그 예제

U-Boot 2024.01 (Mar 04 2025 - 10:30:00)

CPU:   Broadcom BCM2711
DRAM:  1024 MiB
MMC:   mmc@7e300000: 0
In:    serial
Out:   serial
Err:   serial
Net:   No ethernet found.
Hit any key to stop autoboot:  0 

U-Boot가 정상적으로 실행되었음을 확인

📌 U-Boot 환경 변수 확인

printenv

📌 부팅 실패 시 환경 변수 초기화

env default -a
saveenv
reset

2. U-Boot에서 커널 로드 및 부팅 설정

🔹 1) 커널 이미지 및 디바이스 트리 준비

📌 부팅할 커널 이미지 확인 (/boot/ 경로에 존재하는지 확인)

ls -l /boot/

필수 파일

  • zImage 또는 Image (커널 이미지)
  • initramfs (루트 파일 시스템)
  • dtb (디바이스 트리 바이너리)

📌 커널 및 디바이스 트리 파일을 SD 카드에 복사

sudo cp arch/arm/boot/zImage /media/user/BOOT/
sudo cp arch/arm/boot/dts/myboard.dtb /media/user/BOOT/
sync

U-Boot가 SD 카드에서 커널과 DTB를 로드할 수 있도록 준비 완료


🔹 2) U-Boot 환경 변수 설정 (커널 로드 및 실행)

📌 커널 및 디바이스 트리 로드

setenv bootcmd 'load mmc 0:1 0x82000000 /boot/zImage; load mmc 0:1 0x83000000 /boot/myboard.dtb; bootz 0x82000000 - 0x83000000'
saveenv
reset

📌 커널 부팅 명령어 실행

run bootcmd

커널이 실행되면 Starting kernel... 메시지가 출력됨


3. 리눅스 부팅 성공 확인 및 디버깅

🔹 1) 커널 부팅 성공 여부 확인

📌 정상적인 커널 부팅 로그 예제

Starting kernel ...

[    0.000000] Linux version 5.10.100 (user@buildhost)
[    0.000000] CPU: ARMv8 Processor
[    0.000000] Memory: 1024MB
...
[ OK ] Reached target Multi-User System.

커널이 정상적으로 실행되고 로그인 프롬프트가 표시되면 부팅 성공

📌 로그인 후 커널 정보 확인

uname -a

커널 버전 및 시스템 정보 확인 가능


🔹 2) 커널 부팅 오류 해결 방법

📌 커널이 Starting kernel...에서 멈추는 경우

  • 디바이스 트리(DTB) 파일이 올바르게 로드되었는지 확인
setenv fdtfile myboard.dtb
  • 커널이 올바른 주소에서 실행되고 있는지 확인
bdinfo
printenv bootcmd

📌 커널 패닉이 발생하는 경우

  • 루트 파일 시스템을 찾을 수 없는 경우 (Kernel panic - not syncing: VFS: Unable to mount root fs)
setenv bootargs "console=ttyS0,115200 root=/dev/mmcblk0p2 rw"
saveenv
reset

올바른 bootargs를 설정하여 해결 가능


🔹 3) U-Boot에서 수동으로 커널 실행 (디버깅 모드)

📌 수동으로 커널 이미지 및 DTB 로드

mmc dev 0
fatload mmc 0:1 0x82000000 /boot/zImage
fatload mmc 0:1 0x83000000 /boot/myboard.dtb
bootz 0x82000000 - 0x83000000

U-Boot에서 직접 커널을 실행하여 디버깅 가능


📌 최종 확인 체크리스트

U-Boot 정상 실행

  • U-Boot가 정상적으로 부팅되는가?
  • printenv를 실행하여 bootcmd, bootargs가 올바르게 설정되었는가?

커널 및 DTB 파일 확인

  • /boot/ 디렉토리에 zImage 또는 Image, myboard.dtb 파일이 있는가?
  • mmc dev 0 및 fatls mmc 0:1 /boot/ 명령어를 실행했을 때 파일이 나오는가?

커널 부팅 성공

  • Starting kernel... 이후 커널이 정상적으로 실행되는가?
  • uname -a를 실행했을 때 커널 버전이 출력되는가?

문제 해결

  • env default -a && saveenv && reset을 실행한 후에도 부팅 문제가 발생하는가?
  • 커널 패닉이 발생하면 bootargs를 올바르게 설정했는가?

📌 정리

U-Boot를 정상적으로 부팅하고 시리얼 콘솔을 통해 로그를 확인
U-Boot에서 커널을 로드하여 실행하는 과정 설정 (bootcmd, bootargs)
커널 부팅 성공 및 리눅스 로그인 확인 (uname -a)
커널 부팅 실패 시 디버깅 및 문제 해결 (env reset, mmc, fatload, bootz)