DTB(Device Tree Blob) 구조
- FDT(Flattened Device Tree)로도 불린다.
- 4바이트 단위로 정렬되어 저장된다.
- 저장되는 포맷은 빅엔디안 구조를 사용한다.
- cpu는 DTB를 읽어 cpu 엔디안에 맞춰 엔디안 변환을 하여 사용해야 한다.
- 처음 4바이트에는 DTB magic 넘버인 0xd00dfeed 값이 들어있다.
- 이 값을 읽어서 엔디안 변환이 필요함을 알아낼 수도 있다.
- DTB는 커널에서 읽어들인 후 꼭 필요한 속성 값을 먼저(early) 참고하여 사용한다. 그런 후 slab 메모리 관리자가 초기화된 후 object 형태로 변환(unflatten 과정)하여 사용한다.
DTB 덤프 분석
현재 사용중인 DTB 확인
DTB(FDT)
- hexdump /sys/firmware/fdt -C
OF(노드들)
- 커널에서 사용 중인 디바이스 트리 노드
- unflatten되어 하이라키 구조로 표현된 디바이스 트리 노드 object
$ ls /sys/firmware/devicetree/base -la total 0 -r--r--r-- 1 root root 4 Jun 25 13:57 #address-cells -r--r--r-- 1 root root 4 Jun 25 13:57 #size-cells drwxr-xr-x 52 root root 0 Jun 25 13:58 . drwxr-xr-x 3 root root 0 Jun 25 13:47 .. drwxr-xr-x 2 root root 0 Jun 25 13:57 apb-pclk drwxr-xr-x 2 root root 0 Jun 25 13:57 chosen -r--r--r-- 1 root root 17 Jun 25 13:57 compatible drwxr-xr-x 4 root root 0 Jun 25 13:57 cpus drwxr-xr-x 2 root root 0 Jun 25 13:57 flash@0 drwxr-xr-x 2 root root 0 Jun 25 13:57 foo4 drwxr-xr-x 2 root root 0 Jun 25 13:57 fw-cfg@9020000 drwxr-xr-x 2 root root 0 Jun 25 13:57 gpio drwxr-xr-x 3 root root 0 Jun 25 13:57 gpio-keys drwxr-xr-x 3 root root 0 Jun 25 13:57 intc -r--r--r-- 1 root root 4 Jun 25 13:57 interrupt-parent drwxr-xr-x 2 root root 0 Jun 25 13:57 memory -r--r--r-- 1 root root 1 Jun 25 13:57 name drwxr-xr-x 2 root root 0 Jun 25 13:57 pcie@10000000 drwxr-xr-x 2 root root 0 Jun 25 13:57 pl011@9000000 drwxr-xr-x 2 root root 0 Jun 25 13:57 pl031@9010000 drwxr-xr-x 2 root root 0 Jun 25 13:57 pl061@9030000 drwxr-xr-x 2 root root 0 Jun 25 13:57 platform@c000000 drwxr-xr-x 2 root root 0 Jun 25 13:57 pmu drwxr-xr-x 2 root root 0 Jun 25 13:57 psci drwxr-xr-x 2 root root 0 Jun 25 13:57 timer drwxr-xr-x 2 root root 0 Jun 25 13:57 virtio_mmio@a000000 drwxr-xr-x 2 root root 0 Jun 25 13:57 virtio_mmio@a000200 ... drwxr-xr-x 2 root root 0 Jun 25 13:57 virtio_mmio@a003e00
하이라키 구조로 표현된 디렉토리들
$ tree /sys/firmware/devicetree
/sys/firmware/devicetree
└── base
├── #address-cells
├── #size-cells
├── apb-pclk
│ ├── #clock-cells
│ ├── clock-frequency
│ ├── clock-output-names
│ ├── compatible
│ ├── name
│ └── phandle
├── chosen
│ ├── bootargs
│ ├── name
│ └── stdout-path
├── compatible
├── cpus
│ ├── #address-cells
│ ├── #size-cells
│ ├── cpu@0
│ │ ├── compatible
│ │ ├── device_type
│ │ ├── enable-method
│ │ ├── name
│ │ └── reg
│ ├── cpu@1
│ │ ├── compatible
│ │ ├── device_type
│ │ ├── enable-method
│ │ ├── name
│ │ └── reg
│ └── name
├── flash@0
│ ├── bank-width
│ ├── compatible
│ ├── name
...
참고
- Device Tree Usage | devicetree.org
- The Linux usage model for device tree data | kernel.org
- Booting the Linux/ppc kernel without Open Firmware | kernel.org
- [Linux:Kernel] 리눅스와 디바이스 트리(Linux and device tree) | 다솜돌이
- devicetree: kernel internals and practical troubleshooting | Sony Mobile – 다운로드 pdf
- Devicetree Specification Release 0.1 | devicetree.org – 다운로드 pdf
- Device Tree 101 | Bootlin – 다운로드 pdf
안녕하세요. 디바이스 트리에 대한 개념이 서지 않아 많이 고생하고 있습니다.
정말 친절한 이곳 사이트 덕분에 많이 알아갑니다.
너무 고맙습니다. 항상 건강하세요.
감사합니다. 홍찬님도 좋은 하루 되세요.