커널 포팅 (3. 커널 포팅 기본 실습 / 3.1 타겟 보드 선택 및 디바이스 트리 설정)

2025. 3. 6. 19:40프로그래밍/시스템

3.1 타겟 보드 선택 및 디바이스 트리 설정

커널 포팅을 진행할 때, 타겟 보드(Target Board)에 맞는 설정을 적용하는 것이 필수적입니다.
ARM 및 RISC-V 기반의 임베디드 시스템에서는 디바이스 트리(Device Tree, DT) 를 사용하여 CPU, 메모리, I/O 장치, 버스 등의 하드웨어 정보를 커널에 제공합니다.


🔹 디바이스 트리(Device Tree)의 개념과 역할

디바이스 트리(Device Tree, DT)커널이 하드웨어 정보를 동적으로 읽을 수 있도록 하는 데이터 구조입니다.
이전에는 각 보드마다 하드웨어 정보를 하드코딩했지만,
디바이스 트리를 사용하면 커널 코드를 수정하지 않고도 하드웨어 구성을 변경할 수 있음.

디바이스 트리의 역할

  1. CPU, RAM, 클럭 정보 제공
  2. 버스 및 주변 장치(I2C, SPI, GPIO, USB 등) 설정
  3. 부트로더(U-Boot)와 커널 간 하드웨어 정보 공유
  4. 하드웨어 변경 시 커널 코드 수정 없이 DT만 변경 가능

디바이스 트리 사용 예시

  • 라즈베리파이4: bcm2711-rpi-4-b.dtb
  • BeagleBone Black: am335x-boneblack.dtb
  • FriendlyARM NanoPi: sun8i-h3-nanopi.dtb

디바이스 트리 파일 구성 디바이스 트리는 DTS(Device Tree Source) 파일로 작성되며, 이를 DTB(Device Tree Blob) 로 변환하여 커널과 함께 사용합니다.

디바이스 트리는 크게 3단계로 구성됨:

  1. DTS (Device Tree Source)
    • 사람이 읽을 수 있는 형태의 소스 파일 (.dts)
    • 예: bcm2711-rpi-4-b.dts
  2. DTSI (Device Tree Include)
    • 공통 설정을 포함하는 파일 (.dtsi)
    • 여러 보드에서 공유 가능
  3. DTB (Device Tree Blob)
    • 컴파일된 바이너리 형태 (.dtb)
    • 부트로더(U-Boot)가 로드하여 커널에 전달

디바이스 트리 파일 변환 과정

DTS (텍스트) → [컴파일] → DTB (바이너리)

변환 명령어:

dtc -I dts -O dtb -o output.dtb input.dts
  • dtc: Device Tree Compiler (디바이스 트리 컴파일러)

🔹 보드별 디바이스 트리 소스 분석 (arch/arm/boot/dts/)

리눅스 커널의 디바이스 트리 파일은 arch/arm/boot/dts/ 디렉토리에 위치하며, 각 보드 및 SoC별로 .dts 파일이 존재합니다.

디렉토리 구조

linux/arch/arm/boot/dts/
├── bcm2711-rpi-4-b.dts    # 라즈베리파이 4
├── am335x-boneblack.dts   # BeagleBone Black
├── sun8i-h3-nanopi.dts    # NanoPi
├── imx6q-sabresd.dts      # i.MX6 기반 보드
└── ...

디바이스 트리 예제 (bcm2711-rpi-4-b.dts)

/dts-v1/;
#include "bcm2711.dtsi"

 / {
    compatible = "raspberrypi,4-model-b", "brcm,bcm2711";
    model = "Raspberry Pi 4 Model B";

    memory {
        reg = <0x0 0x40000000>;  /* 1GB RAM */
    };

    chosen {
        bootargs = "console=ttyAMA0,115200 root=/dev/mmcblk0p2";
    };

    gpio: gpio@7e200000 {
        compatible = "brcm,bcm2711-gpio";
        reg = <0x7e200000 0x1000>;
    };
};

디바이스 트리 주요 요소

속성  설명
/ 루트 노드, 보드 전체 정보 포함
compatible 보드 또는 SoC와의 호환성 정보
memory RAM 크기 및 주소 지정
chosen 부팅 관련 설정 (커널 파라미터, 시리얼 콘솔 등)
gpio GPIO 컨트롤러 정보

DTSI 파일 포함 (#include)

#include "bcm2711.dtsi"
  • bcm2711.dtsi 파일에 공통 설정이 들어 있으며, 이를 포함하여 코드 재사용 가능

🔹 디바이스 트리 수정 및 적용 (make dtbs)

타겟 보드에서 새로운 하드웨어를 추가하거나 수정하려면 디바이스 트리를 수정해야 합니다.

1️⃣ 디바이스 트리 수정 (예: 새로운 UART 추가) 파일: bcm2711-rpi-4-b.dts

serial1: uart@7e201400 {
    compatible = "brcm,bcm2711-uart";
    reg = <0x7e201400 0x100>;
    clock-frequency = <250000000>;
};

2️⃣ 디바이스 트리 빌드

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs

3️⃣ 빌드된 디바이스 트리 확인

ls arch/arm/boot/dts/
bcm2711-rpi-4-b.dtb

4️⃣ U-Boot에서 디바이스 트리 로드

tftpboot 0x82000000 bcm2711-rpi-4-b.dtb
bootz 0x80000000 - 0x82000000
  • tftpboot: 네트워크에서 DTB 파일 로드
  • bootz: 커널과 디바이스 트리를 함께 실행

5️⃣ 커널 부팅 후 디바이스 트리 확인

dmesg | grep "Device Tree"
cat /proc/device-tree/model
  • 부팅된 시스템이 올바른 DTB를 로드했는지 확인

🔹 디바이스 트리 수정 시 유용한 명령어

DTB 파일을 DTS로 변환 (디버깅용)

dtc -I dtb -O dts -o output.dts input.dtb

부팅 시 커널이 사용하는 DTB 확인

cat /proc/device-tree/compatible

DT 노드 정보 확인

ls /proc/device-tree/

✅ 정리

  1. 디바이스 트리(Device Tree)란?
    • 하드웨어 정보를 커널에 제공하는 데이터 구조
    • DTS(DTSI) → DTB로 변환하여 사용
  2. 보드별 디바이스 트리 소스 분석
    • arch/arm/boot/dts/ 디렉토리에 저장
    • 각 보드별 .dts 파일이 있으며, SoC 공통 정보는 .dtsi 파일로 관리
  3. 디바이스 트리 수정 및 적용
    • make dtbs로 DTB 빌드
    • tftpboot, bootz로 DTB 로드 및 실행
    • 부팅 후 /proc/device-tree/에서 확인 가능