Linux/Kernel Driver

Embedded Linux Kernel: Bootloader 설정 및 커스터마이징

임베디드 친구 2025. 3. 13. 08:01
728x90
반응형

Embedded Linux Kernel: Bootloader 설정 및 커스터마이징

임베디드 시스템 개발에서 부트로더(Bootloader)는 시스템의 초기화를 담당하며, 커널과 사용자 애플리케이션으로의 전이를 관리하는 중요한 역할을 합니다. 이번 포스팅에서는 Rockchip RK3399 플랫폼을 기준으로 부트로더인 U-Boot을 포팅하고, 설정 및 환경 변수를 조정하는 방법을 알아보겠습니다.

1. Bootloader란 무엇인가?

Bootloader는 하드웨어 초기화와 운영체제 로딩을 위한 프로그램입니다. 부트로더는 주로 다음과 같은 단계로 동작합니다:

  1. 1단계 부트로더: CPU 및 메모리 초기화.
  2. 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 포팅, 설정 및 환경 변수 조정 방법을 설명했습니다. 부트로더는 시스템의 초기화 및 운영체제 로딩에 중요한 역할을 하며, 환경 변수를 통해 시스템 부팅 프로세스를 유연하게 관리할 수 있습니다. 실습을 통해 자신만의 커스터마이징된 부트로더를 제작해 보세요!

참고 자료

728x90
반응형