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), 부팅 명령어 디버깅 방법 정리
'프로그래밍 > 시스템' 카테고리의 다른 글
U-Boot 포팅 (7. U-Boot 디버깅 및 문제 해결 / 부팅 실패 시 해결 방법) (0) | 2025.03.05 |
---|---|
U-Boot 포팅 (7. U-Boot 디버깅 및 문제 해결 / JTAG 디버깅) (0) | 2025.03.05 |
U-Boot 포팅 (6. U-Boot 기능 확장 및 디바이스 드라이버 추가 / 새로운 디바이스 추가하기 (UART, I2C, SPI, GPIO 설정)) (0) | 2025.02.26 |
U-Boot 포팅 (6. U-Boot 기능 확장 및 디바이스 드라이버 추가 / U-Boot 환경 변수 설정) (0) | 2025.02.26 |
U-Boot 포팅 (5. 디바이스 트리(DTS) 및 환경 변수 설정 / U-Boot 환경 변수 설정) (0) | 2025.02.26 |