디바이스 트리, 리눅스 보드가 하드웨어를 보는 방법
디바이스 트리는 리눅스 커널이 보드 하드웨어(CPU, 메모리, 버스, GPIO, 클록, 장치) 배치를 코드에 붙여 둘 대신 트리 문서로 보는 방식입니다.
이 글은 Linux 커널 Devicetree 사용 모델과 Devicetree Specification 공식 페이지를 2026-08-30 기준으로 정리한 일반 설명이며, 아키텍처와 보드 구현에 따라 세부 동작은 달라질 수 있습니다.
디바이스 트리는 무엇인가?
한 줄 답: 이 문서는 운영체제가 보드 하드웨어 세부사항을 코드에 붙이지 않도록, 이름 있는 노드와 속성으로 하드웨어를 서술하는 자료 구조이자 언어입니다.
이 자료는 운영체제가 기계의 세부사항을 미리 하드코딩하지 않아도 읽을 수 있도록 하드웨어를 표현합니다. 따라서 보드 구성과 장치 드라이버 지원을 한 덩어리의 보드별 코드로 고정하기보다, 커널에 전달되는 데이터에 따라 설정하는 구조를 만들 수 있습니다.
구조적으로는 이름 있는 노드와 이름 있는 속성으로 이루어진 트리이며, 자연스러운 트리로만 한정되지 않는 비순환 그래프로도 볼 수 있습니다. 각 속성에는 하드웨어를 설명하는 임의의 데이터가 들어갈 수 있고, 트리 계층 밖에서 한 노드가 다른 노드를 가리키는 연결도 표현할 수 있습니다.
바인딩은 버스, 인터럽트 선, GPIO 연결, 주변장치처럼 자주 나타나는 하드웨어 특성을 노드와 속성으로 어떻게 표현할지 정하는 사용 규약입니다. Linux는 이 설명을 플랫폼 식별, 런타임 설정, 장치 등록이라는 세 가지 용도로 활용합니다.
보드가 전용 컴퓨터라는 기본 개념은 임베디드 시스템이란에서 확인할 수 있으며, 여기서는 하드웨어를 설명하는 방식에 집중합니다.
dts와 dtb는 어떻게 다른가?
한 줄 답: dts는 사람이 읽고 쓰는 Devicetree 소스이고, dtb는 커널이 받는 Flattened Device Tree 바이너리 블롭입니다.
DTS는 Devicetree Sources를 뜻하는 텍스트 소스이며, 공식 커널 문서는 이를 dtc 컴파일러와 함께 사용하는 소스로 설명합니다. 사람이 하드웨어 구성을 읽고 수정하는 쪽이 이 소스입니다.
FDT는 Devicetree를 커널에 이진 블롭으로 전달할 수 있게 만든 표현입니다. DTB는 Device Tree Binary를 뜻하며, 커널이 전달받아 읽는 FDT 바이너리 형태를 가리킵니다.
소스는 보통 공통 부분과 보드 부분으로 나누어 관리합니다. SoC 전체의 공통 하드웨어와 재사용 가능한 부분은 DTSI에 두고, 실제 보드에 존재하는 하드웨어와 보드별 구성은 보드 DTS에 둔다는 원칙을 적용합니다.
이미지가 빌드 산출물로 만들어지는 배경은 Yocto/Poky에서 확인할 수 있지만, 여기서는 DTS 소스와 DTB 전달 형태의 구분만 다룹니다.
커널은 이 트리를 언제 읽나?
한 줄 답: 커널은 부팅 초기에 이 트리를 읽어 기계를 식별하고, 런타임 설정을 파싱한 뒤, 장치를 등록합니다.
사용 목적은 플랫폼 식별, 런타임 설정, 장치 등록의 세 가지로 나뉩니다. 먼저 플랫폼을 식별하고, 이어서 런타임 설정을 확인한 다음, 설명에 나타난 장치를 Linux 장치 모델에 등록하는 순서로 사용합니다.
초기 부팅에서 아키텍처 설정 코드는 페이징을 설정하기 전에 of_scan_flat_dt()를 여러 차례 호출해 자료를 훑습니다. 이 과정에서 early_init_dt_scan_chosen, early_init_dt_scan_root, early_init_dt_scan_memory 같은 콜백이 각각 런타임 설정, 주소 공간 모델, 사용 가능한 메모리의 위치와 크기를 읽습니다.
/chosen 노드는 커널 인자 문자열과 initrd 이미지 위치 같은 런타임 설정을 담습니다. 이후 unflatten_device_tree()가 자료를 더 효율적인 런타임 표현으로 바꾸고, 보드 지원 코드가 of_platform_populate(...)를 호출해 루트부터 장치 발견을 시작합니다.
compatible와 노드는 왜 중요한가?
한 줄 답: 노드는 하드웨어 조각을 나타내고, compatible 문자열은 그 노드가 어떤 기계·장치에 맞는지 커널이 고르는 기준입니다.
노드는 CPU, 메모리, 버스, GPIO 컨트롤러, 주변장치 같은 하드웨어 요소를 나타냅니다. 일반적으로 compatible 속성을 가진 노드는 어떤 종류의 장치를 표현하며, 루트 노드의 compatible은 실행 중인 특정 기계를 식별하는 기준이 됩니다.
일반 예:
compatible = "ti,omap3-beagleboard", "ti,omap3450", "ti,omap3";
이 목록은 가장 구체적인 보드 이름에서 시작해 더 일반적인 SoC 계열 순서로 나열됩니다. 호환 대상을 넓혀 가는 순서이므로 커널은 먼저 정확한 대상과의 일치를 고려하고, compatible 문자열은 Documentation/devicetree/bindings에 문서화해야 합니다.
DTS 코딩 스타일에서 장치 노드의 권장 속성 순서도 compatible로 시작합니다. 루트 수준에서 이런 속성을 가진 노드는 Linux가 platform_device로 동적으로 할당하고 등록할 수 있습니다.
I2C나 SPI처럼 버스 아래에 있는 자식 장치는 부모 버스 드라이버가 .probe()를 수행할 때 등록합니다. 따라서 트리의 계층과 compatible의 의미를 함께 봐야, 노드가 어떤 장치로 발견되고 어느 등록 경로를 거치는지 구분할 수 있습니다.
FAQ
한 줄 답: 이 문서의 목적, dts와 dtb의 구분, compatible의 순서, 바인딩의 뜻을 확인하면 핵심을 정리할 수 있습니다.
| 질문 | 답변 |
|---|---|
| 이 문서는 왜 필요합니까? | 운영체제가 기계 세부사항을 하드코딩하지 않도록 하드웨어를 서술하기 위해서입니다. 보드 구성과 장치 드라이버 지원을 데이터 기반으로 나눌 수 있습니다. |
| dts를 커널이 그대로 읽습니까? | 커널이 받는 형태는 Flattened Device Tree 바이너리 블롭인 dtb입니다. dts는 사람이 읽고 수정하는 Devicetree 소스입니다. |
| compatible 목록은 어떤 순서로 씁니까? | 가장 구체적인 이름부터 호환되는 덜 구체적인 이름 순으로 씁니다. |
| 바인딩은 무엇입니까? | 버스·인터럽트·GPIO·주변장치가 트리에 어떻게 나타나야 하는지 정하는 사용 규약입니다. |
출처
한 줄 답: 본문은 2026-08-30에 확인한 Linux 커널과 Devicetree 공식 페이지의 설명만 사용합니다.
- Linux and the Devicetree — 자료 구조와 언어의 정의, 세 가지 사용 목적,
/chosen, 초기 파싱, 장치 등록,compatible예시를 확인했습니다. - Open Firmware and Devicetree — Linux Devicetree 사용 문서와 DTS·바인딩 관련 공식 문서 색인을 확인했습니다.
- Devicetree Specifications — Devicetree Specification 공식 페이지와 현재 공개 릴리스 v0.4(2023-06-28)를 확인했습니다.
- Devicetree Sources (DTS) Coding Style — DTS 소스의 성격, DTSI·DTS 구성 원칙,
compatible로 시작하는 권장 속성 순서를 확인했습니다.