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)
'프로그래밍 > 시스템' 카테고리의 다른 글
U-Boot 포팅 (마무리 및 학습 자료 / U-Boot 공식 문서 및 관련 자료 정리) (0) | 2025.03.05 |
---|---|
U-Boot 포팅 (9. 추가 심화 과정) (0) | 2025.03.05 |
U-Boot 포팅 (실습 프로젝트: 새로운 보드에 U-Boot 포팅 / U-Boot 포팅 프로젝트 개요) (0) | 2025.03.05 |
U-Boot 포팅 (7. U-Boot 디버깅 및 문제 해결 / 부팅 실패 시 해결 방법) (0) | 2025.03.05 |
U-Boot 포팅 (7. U-Boot 디버깅 및 문제 해결 / JTAG 디버깅) (0) | 2025.03.05 |