Bootloader 커스터마이징 및 환경설정
1. 개요
Bootloader는 임베디드 시스템에서 운영체제를 로드하고 실행하기 전에 하드웨어를 초기화하고, 시스템을 원하는 상태로 설정하는 중요한 역할을 합니다. Buildroot를 사용하면 Bootloader를 쉽게 빌드하고 커스터마이징할 수 있으며, 이를 통해 특정 하드웨어에 맞게 설정할 수 있습니다. 이번 포스팅에서는 Bootloader 커스터마이징 및 환경설정 방법을 자세히 다루겠습니다.
2. Bootloader의 역할과 개요
Bootloader는 일반적으로 두 단계로 구성됩니다.
- 1차 부트로더(Primary Bootloader): SoC의 ROM 또는 내부 저장소에서 실행되며, 기본적인 하드웨어 초기화를 수행하고 2차 부트로더를 로드합니다.
- 2차 부트로더(Secondary Bootloader): 1차 부트로더가 로드한 실행 파일로, 보다 정교한 하드웨어 초기화 및 OS 로딩 기능을 수행합니다. 대표적인 예로 U-Boot가 있습니다.
Buildroot에서는 U-Boot와 같은 다양한 Bootloader를 빌드하고 설정할 수 있습니다. 다음 장에서는 U-Boot를 기준으로 Buildroot에서 Bootloader를 커스터마이징하는 방법을 설명합니다.
3. Buildroot에서 Bootloader 빌드 설정
Buildroot에서는 기본적으로 U-Boot를 지원하며, 설정을 통해 Bootloader를 빌드할 수 있습니다. 이를 위해 Buildroot의 menuconfig
를 활용하여 설정합니다.
3.1 Bootloader 설정
먼저 Buildroot의 menuconfig
를 실행합니다.
make menuconfig
이후 아래의 경로로 이동하여 Bootloader 설정을 진행합니다.
Target Images --->
[*] Build a bootloader
Bootloaders --->
[*] U-Boot
위 설정을 활성화하면 U-Boot가 자동으로 빌드됩니다.
3.2 특정 버전의 U-Boot 사용하기
기본적으로 Buildroot는 최신 안정화 버전의 U-Boot를 사용하지만, 특정 버전을 사용하려면 Bootloader
설정에서 U-Boot 버전을 명시적으로 지정할 수 있습니다.
Bootloaders --->
(2023.07) U-Boot version
원하는 버전을 입력하면 해당 버전이 빌드됩니다.
4. U-Boot 환경설정 커스터마이징
U-Boot는 환경설정을 통해 다양한 기능을 설정할 수 있으며, fw_printenv
와 fw_setenv
명령어를 이용해 환경변수를 확인하고 변경할 수 있습니다.
4.1 환경변수 확인
U-Boot의 환경변수를 확인하려면 다음 명령어를 실행합니다.
printenv
출력 예시는 다음과 같습니다.
bootcmd=run boot_default
bootargs=console=ttyS0,115200 root=/dev/mmcblk0p2 rw
bootdelay=3
4.2 환경변수 변경
환경변수를 변경하려면 setenv
명령어를 사용한 후 saveenv
명령어를 실행해야 합니다.
setenv bootdelay 5
saveenv
이를 통해 Bootloader의 딜레이 시간을 5초로 변경할 수 있습니다.
5. U-Boot 디바이스 트리 수정
U-Boot는 Device Tree
를 통해 하드웨어 설정을 정의합니다. 특정 하드웨어에 맞게 수정하려면 arch/arm/dts/
디렉터리의 적절한 dts
파일을 편집해야 합니다.
예를 들어, 기본 콘솔 출력을 UART1에서 UART3으로 변경하려면 아래와 같이 dts
파일을 수정할 수 있습니다.
chosen {
bootargs = "console=ttyS3,115200 root=/dev/mmcblk0p2 rw";
};
이후 make
를 실행하여 새로운 dtb
파일을 빌드해야 합니다.
make u-boot-dtb
6. 커스텀 U-Boot 명령어 추가하기
U-Boot는 커스텀 명령어를 추가하여 사용자의 필요에 맞게 확장할 수 있습니다. 예를 들어, hello
라는 간단한 명령어를 추가하려면 cmd/hello.c
파일을 생성하고 다음과 같이 작성합니다.
#include <common.h>
#include <command.h>
static int do_hello(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
printf("Hello, U-Boot!\n");
return 0;
}
U_BOOT_CMD(
hello, 1, 0, do_hello,
"Print Hello, U-Boot!", ""
);
이후 cmd/Kconfig
와 cmd/Makefile
을 수정하여 빌드 시스템에 추가합니다.
config CMD_HELLO
bool "Enable hello command"
default y
obj-$(CONFIG_CMD_HELLO) += hello.o
이후 U-Boot를 다시 빌드하면 hello
명령어를 사용할 수 있습니다.
make u-boot
U-Boot 환경에서 hello
를 입력하면 다음과 같은 출력이 나타납니다.
Hello, U-Boot!
7. 결론
이번 포스팅에서는 Buildroot를 이용해 Bootloader(U-Boot)를 빌드하는 방법과 커스터마이징하는 방법을 설명하였습니다. Bootloader는 시스템 부팅 과정에서 중요한 역할을 하므로, 프로젝트의 요구사항에 맞게 환경변수를 설정하고, 디바이스 트리를 수정하며, 필요 시 커스텀 명령어를 추가하는 등의 작업이 필요합니다.
'Linux > buildroot' 카테고리의 다른 글
SD 카드 또는 eMMC에 Buildroot 이미지 굽기 (0) | 2025.04.28 |
---|---|
Rockchip RK3399 등 특정 보드에 Buildroot 적용 예제 (0) | 2025.04.27 |
Buildroot에서 커널 설정 및 패치 적용 방법 (0) | 2025.04.25 |
Buildroot에서 U-Boot 및 커널 빌드 과정 (0) | 2025.04.24 |
Buildroot에서 네트워크 패키지 추가 및 설정 (0) | 2025.04.23 |