В вычислительной технике дерево устройств (также называемое деревом устройств ) — это структура данных , описывающая аппаратные компоненты конкретного компьютера, чтобы ядро операционной системы могло использовать и управлять этими компонентами, включая ЦП или ЦП, память , шины и встроенная периферия .
Дерево устройств было получено на основе компьютеров SPARC в рамках проекта Open Firmware . Текущая спецификация Devicetree [1] ориентирована на небольшие системы, но все еще используется с некоторыми системами серверного класса (например, описанными в справочнике по платформе Power Architecture ).
Персональные компьютеры с архитектурой x86 обычно не используют деревья устройств, вместо этого полагаясь на различные протоколы автоматической настройки (например, ACPI ) для обнаружения оборудования. Системы, использующие деревья устройств, обычно передают статическое дерево устройств (возможно, хранящееся в EEPROM или хранящееся в устройстве NAND, например eUFS ) в операционную систему, но также могут генерировать дерево устройств на ранних этапах загрузки . Например, Das U-Boot и kexec могут передавать дерево устройств при запуске новой операционной системы. В системах с загрузчиком, не поддерживающим деревья устройств, статическое дерево устройств может быть установлено вместе с операционной системой; ядро Linux поддерживает этот подход.
Спецификацией Devicetree в настоящее время управляет сообщество под названием devicetree.org, которое связано, среди прочего, с Linaro и Arm .
Дерево устройств может содержать любые данные, поскольку внутри оно представляет собой дерево именованных узлов и свойств . Узлы содержат свойства и дочерние узлы, а свойства представляют собой пары имя-значение .
Деревья устройств имеют как двоичный формат для использования операционными системами, так и текстовый формат для удобного редактирования и управления. [1]
При правильном дереве устройств одно и то же скомпилированное ядро может поддерживать различные конфигурации оборудования в более широком семействе архитектур. Ядро Linux для архитектур ARC , ARM , C6x , H8/300 , MicroBlaze , MIPS , NDS32, Nios II , OpenRISC , PowerPC , RISC-V , SuperH и Xtensa считывает информацию о дереве устройств; на ARM деревья устройств являются обязательными для всех новых SoC с 2012 года . [2] Это можно рассматривать как средство борьбы с огромным количеством форков (Linux и Das U-Boot), которые исторически создавались для поддержки (незначительно) разные платы ARM. Цель состоит в том, чтобы переместить значительную часть описания оборудования из двоичного файла ядра в скомпилированный объект дерева устройств, который передается ядру загрузчиком , заменяя ряд исходных файлов C для конкретной платы и компилируя его. параметры времени в ядре. [2]
Он указывается в исходном файле дерева устройств (.dts) и компилируется в двоичный файл дерева устройств или двоичный файл дерева устройств (.dtb) с помощью компилятора дерева устройств (DTC). Исходные файлы дерева устройств могут включать в себя другие файлы, называемые «включениями исходного дерева устройств». [3] [1]
Дистрибутивы Linux на базе ARM обычно включают загрузчик, который обязательно настраивается для конкретных плат, например Raspberry Pi или Hackberry A10. Это создало проблемы для создателей дистрибутивов Linux, поскольку некоторая часть операционной системы должна быть скомпилирована специально для каждого варианта платы или обновлена для поддержки новых плат. Однако некоторые современные SoC (например, Freescale i.MX6 ) имеют предоставленный поставщиком загрузчик с деревом устройств на отдельном от операционной системы чипе. [4]
Собственный формат файла конфигурации, используемый для аналогичных целей, формат файла FEX [5] является фактическим стандартом среди SoC Allwinner .
Windows (за исключением Windows CE ) не использует DeviceTree (файл DTB), как описано здесь. Вместо этого он использует ACPI для обнаружения устройств и управления ими. [6]
Проект coreboot использует деревья устройств, но они отличаются от плоских деревьев устройств, используемых в ядре Linux. [7]
Пример формата источника дерева устройств (DTS):
/дтс-v1/ ;/ { soc { flash_controller : flash-controller @ 4001e000 { reg = < 0x4001e000 0x1000 > ; flash0 : flash @ 0 { label = "SOC_FLASH" ; стереть - блок = <4096> ; }; }; }; };
В приведенном выше примере линия означает версию 1 синтаксиса DTS./dts-v1/;
Дерево имеет четыре узла: /
(корневой узел), soc
(означает « система на кристалле ») flash-controller@4001e000
и flash@0
(экземпляр флэш-памяти, использующий флэш-контроллер). Помимо этих имен узлов, последние два узла имеют метки flash_controller
и flash0
соответственно.
Последние два узла имеют свойства , которые представляют пары имя/значение. Свойство label
имеет строковый тип, свойство erase-block
имеет целочисленный тип, а свойство reg
представляет собой массив целых чисел (32-битные значения без знака). Значения свойств могут ссылаться на другие узлы в дереве устройств посредством их фанделов . Фандл для узла с меткой flash0
будет записан как &flash0
. Фандлы также являются 32-битными значениями.
Части имен узлов после знака «at» ( @
) являются адресами устройств . Адреса модулей определяют адрес узла в адресном пространстве его родительского узла.
Вышеупомянутое дерево может быть скомпилировано стандартным компилятором DTC в двоичный формат или ассемблер DTB . Однако в Zephyr RTOS файлы DTS компилируются в файлы заголовков C (.h), которые затем используются системой сборки для компиляции кода для конкретной платы . [8]
{{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка ){{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка )