U-Boot 포팅 (7. U-Boot 디버깅 및 문제 해결 / U-Boot 디버깅 방법)

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

U-Boot 디버깅 방법

U-Boot를 디버깅하는 것은 부팅 과정에서 발생하는 문제를 해결하고, 하드웨어 동작을 검증하는 중요한 과정입니다.
U-Boot 디버깅 방법에는 시리얼 콘솔 로그 분석, 메모리 값 확인 및 수정, 비교하는 기능이 포함됩니다.

이 문서에서는 시리얼 콘솔 로그 분석(printk 활용), U-Boot 내부에서 메모리 확인(md, mw, cmp 명령어 사용) 방법을 설명합니다.


1. 시리얼 콘솔 로그 분석 (printk 활용)

🔹 시리얼 콘솔을 이용한 로그 출력

U-Boot는 기본적으로 시리얼(UART) 콘솔을 통해 디버깅 로그를 출력합니다.
이를 통해 부팅 과정에서 어디서 문제가 발생했는지 확인할 수 있습니다.

📌 시리얼 콘솔 설정 (minicom 또는 picocom)

sudo minicom -D /dev/ttyUSB0 -b 115200

또는

sudo picocom -b 115200 /dev/ttyUSB0

📌 U-Boot 부팅 시 출력되는 로그 예제

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

CPU:   Allwinner H3
DRAM:  1024 MiB
MMC:   mmc@1c0f000: 0, mmc@1c11000: 1
In:    serial
Out:   serial
Err:   serial
Net:   No ethernet found.
Hit any key to stop autoboot:  0 

시스템이 어디까지 초기화되었는지 로그를 통해 확인 가능


🔹 printk를 활용한 디버깅 로그 추가

U-Boot에서는 printf()를 사용하여 디버깅 로그를 추가할 수 있습니다.

📌 로그 추가 (board/myboard/myboard.c)

#include <common.h>
#include <dm.h>

int board_init(void)
{
    printf("Initializing MyBoard...\n");
    return 0;
}

printf()를 이용하여 특정 코드가 실행되는지 확인 가능

📌 부팅 후 로그 확인

Initializing MyBoard...

📌 디버깅 레벨을 높여 더 많은 로그 출력

setenv debug 1
saveenv

2. U-Boot 내부에서 메모리 확인 (md, mw, cmp 명령어 사용)

🔹 메모리 디버깅 명령어

명령어 설명
md 메모리 내용을 덤프 (memory display)
mw 메모리 값을 설정 (memory write)
cmp 메모리 비교 (compare memory)

🔹 md (Memory Display) - 메모리 내용 확인

📌 메모리 주소 0x80000000부터 16개의 값 확인

md 0x80000000 10

📌 출력 예제

80000000: 00000000 00000000 12345678 9abcdef0    ...........Vx...
80000010: 11223344 55667788 aabbccdd eeff0011    ..3DUfw......

RAM, 플래시 메모리, 레지스터 값을 직접 확인 가능


🔹 mw (Memory Write) - 메모리 값 변경

📌 메모리 주소 0x80000000에 0xDEADBEEF 값 쓰기

mw 0x80000000 0xDEADBEEF

📌 값이 변경되었는지 확인

md 0x80000000 1

📌 출력 예제

80000000: DEADBEEF

U-Boot 실행 중 특정 메모리 값을 변경하여 테스트 가능


🔹 cmp (Compare Memory) - 메모리 비교

📌 두 메모리 블록이 동일한지 비교 (cmp <주소1> <주소2> <길이>)

cmp 0x80000000 0x80000010 4

📌 출력 예제 (두 블록이 다름)

Memcmp at 0x80000000 and 0x80000010 differ

메모리 비교를 통해 특정 값이 정상적으로 변경되었는지 확인 가능


3. 메모리 디버깅을 활용한 부팅 문제 해결

🔹 1) RAM이 정상적으로 초기화되었는지 확인

📌 메모리 덤프 (md 사용)

md 0x80000000 10

이상한 값이 표시되면 RAM 초기화 과정에서 문제가 있을 수 있음

📌 RAM 테스트 (mtest 사용)

mtest 0x80000000 0x800FFFFF

RAM이 정상적으로 읽기/쓰기가 가능한지 확인


🔹 2) 저장 장치에서 데이터가 정상적으로 읽히는지 확인

📌 eMMC에서 부팅 이미지 로드 테스트

mmc dev 0
fatload mmc 0:1 0x82000000 /boot/zImage
md 0x82000000 10

정상적으로 커널이 로드되었는지 확인 가능


🔹 3) 부팅 프로세스가 중단될 경우 디버깅

📌 부팅 커맨드 확인

printenv bootcmd

📌 변경 후 저장

setenv bootcmd 'run my_custom_boot'
saveenv

잘못된 bootcmd로 인해 부팅이 멈출 경우 수정 가능


📌 정리

시리얼 콘솔을 활용한 부팅 로그 분석 방법 (printf 활용)
U-Boot에서 메모리 확인 (md), 수정 (mw), 비교 (cmp) 명령어 사용법
RAM 테스트(mtest), 저장 장치 디버깅(fatload, mmc), 부팅 명령어 디버깅 방법 정리