Embedded Linux Kernel: Bootloader 설정 및 커스터마이징
임베디드 시스템 개발에서 부트로더(Bootloader)는 시스템의 초기화를 담당하며, 커널과 사용자 애플리케이션으로의 전이를 관리하는 중요한 역할을 합니다. 이번 포스팅에서는 Rockchip RK3399 플랫폼을 기준으로 부트로더인 U-Boot을 포팅하고, 설정 및 환경 변수를 조정하는 방법을 알아보겠습니다.
1. Bootloader란 무엇인가?
Bootloader는 하드웨어 초기화와 운영체제 로딩을 위한 프로그램입니다. 부트로더는 주로 다음과 같은 단계로 동작합니다:
- 1단계 부트로더: CPU 및 메모리 초기화.
- 2단계 부트로더: 운영체제 커널 로드.
U-Boot은 임베디드 시스템에서 가장 널리 사용되는 오픈소스 부트로더 중 하나입니다.
2. U-Boot 포팅 방법
2.1 U-Boot 소스 코드 다운로드
U-Boot 소스 코드는 Git 저장소에서 다운로드할 수 있습니다:
$ git clone https://source.denx.de/u-boot/u-boot.git
$ cd u-boot
2.2 Rockchip RK3399 보드 설정
U-Boot은 다양한 보드를 지원합니다. RK3399에 맞는 설정을 적용하려면 다음 명령을 실행하세요:
$ make rockchip_rk3399_defconfig
이 명령은 RK3399에 필요한 기본 설정 파일을 불러옵니다.
2.3 U-Boot 빌드
U-Boot를 빌드하려면 크로스 컴파일러를 설정하고 빌드 명령을 실행합니다:
$ export CROSS_COMPILE=aarch64-linux-gnu-
$ make -j$(nproc)
빌드가 완료되면 u-boot.bin
또는 u-boot.img
파일이 생성됩니다.
2.4 부트로더 플래싱
빌드된 U-Boot 이미지를 RK3399 보드의 저장 장치(eMMC 또는 SD 카드)에 플래싱합니다. 예를 들어:
$ sudo dd if=u-boot.img of=/dev/sdX bs=4M
$ sync
/dev/sdX
는 보드의 저장 장치 경로입니다.
3. Bootloader 설정과 환경 변수 조정
부트로더 설정과 환경 변수는 시스템 초기화와 부팅 프로세스에 큰 영향을 미칩니다.
3.1 U-Boot 환경 변수 확인
U-Boot 명령줄 인터페이스(CLI)에 접속하여 환경 변수를 확인합니다:
=> printenv
3.2 새로운 환경 변수 추가
예를 들어, 커널 부팅 명령줄에 디버그 옵션을 추가하려면:
=> setenv bootargs "console=ttyS0,115200 root=/dev/mmcblk0p1 rw"
=> saveenv
saveenv
명령은 설정을 저장합니다.
3.3 부트 스크립트 커스터마이징
부트로더는 부팅 스크립트를 통해 커널과 루트 파일 시스템을 로드합니다. 다음은 간단한 부팅 스크립트 예제입니다:
=> setenv bootcmd "load mmc 0:1 0x80000000 Image; load mmc 0:1 0x88000000 rk3399.dtb; booti 0x80000000 - 0x88000000"
=> saveenv
=> boot
이 스크립트는 MMC의 첫 번째 파티션에서 커널 이미지와 장치 트리를 로드하고 부팅합니다.
3.4 환경 변수 초기화
환경 변수를 초기 상태로 되돌리려면 다음을 실행합니다:
=> env default -a
=> saveenv
4. 추가적인 커스터마이징
부트로더를 커스터마이징하려면 다음 파일을 수정할 수 있습니다:
include/configs/rk3399_common.h
: RK3399에 대한 공통 설정 파일.board/rockchip/rk3399/
: 보드에 특화된 설정 및 초기화 코드.
예를 들어, 디버그 메시지를 더 상세히 출력하려면 CONFIG_DEBUG_UART
옵션을 활성화합니다.
#define CONFIG_DEBUG_UART
#define CONFIG_DEBUG_UART_BASE 0xff1a0000
#define CONFIG_DEBUG_UART_CLOCK 24000000
이후 다시 빌드하고 플래싱하면 디버그 출력이 활성화됩니다.
5. 요약
이 글에서는 Rockchip RK3399 시스템을 기준으로 U-Boot 포팅, 설정 및 환경 변수 조정 방법을 설명했습니다. 부트로더는 시스템의 초기화 및 운영체제 로딩에 중요한 역할을 하며, 환경 변수를 통해 시스템 부팅 프로세스를 유연하게 관리할 수 있습니다. 실습을 통해 자신만의 커스터마이징된 부트로더를 제작해 보세요!
참고 자료
'Linux > Kernel Driver' 카테고리의 다른 글
Embedded Linux에서 Root Filesystem 생성하기 (0) | 2025.03.15 |
---|---|
Embedded Linux Kernel 설정 - Kernel Configuration (0) | 2025.03.14 |
Board Support Package (BSP) 이해 (0) | 2025.03.12 |
Embedded Linux Kernel 포팅 기본 (0) | 2025.03.11 |
Device Tree의 이해 (0) | 2025.03.10 |