Дерево устройств
В вычислительной технике дерево устройств (также называемое деревом устройств ) — это структура данных , описывающая аппаратные компоненты конкретного компьютера, чтобы операционной системы могло ядро использовать и управлять этими компонентами, включая ЦП или ЦП, память , шины и встроенная периферия .
Дерево устройств было получено на основе 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]
на базе ARM обычно Дистрибутивы Linux включают загрузчик, который обязательно настраивается для конкретных плат, например Raspberry Pi или Hackberry A10. Это создало проблемы для создателей дистрибутивов Linux, поскольку некоторая часть операционной системы должна быть скомпилирована специально для каждого варианта платы или обновлена для поддержки новых плат. Однако некоторые современные SoC (например, Freescale i.MX6 ) имеют предоставленный поставщиком загрузчик с деревом устройств на отдельном от операционной системы чипе. [4]
Собственный формат файла конфигурации, используемый для аналогичных целей, формат файла FEX. [5] является стандартом де-факто среди Allwinner SoC .
Окна
[ редактировать ]Windows (за исключением Windows CE ) не использует DeviceTree (файл DTB), как описано здесь. Вместо этого он использует ACPI для обнаружения устройств и управления ими. [6]
Яблоко
[ редактировать ]В процессе загрузки iOS , iPadOS и ARM macOS загрузчик низкого уровня (LLB) загружает дерево устройств, зашифрованное Apple, в основную память, а затем загружает iBoot .
Основная загрузка
[ редактировать ]Проект coreboot использует деревья устройств, но они отличаются от плоских деревьев устройств, используемых в ядре Linux. [7]
Пример
[ редактировать ]Пример формата исходного кода дерева устройств (DTS):
/dts-v1/;
/ {
soc {
flash_controller: flash-controller@4001e000 {
reg = <0x4001e000 0x1000>;
flash0: flash@0 {
label = "SOC_FLASH";
erase-block = <4096>;
};
};
};
};
В приведенном выше примере строка /dts-v1/;
означает версию 1 синтаксиса DTS.
Дерево имеет четыре узла: /
(корневой узел), 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]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: а б с «Спецификация дерева устройств» (PDF) . Релиз v0.3. http://devicetree.org. 13 февраля 2020 г.
- ^ Jump up to: а б «Контрольный список поддержки ARM SoC Linux» (PDF) .
- ^ Симмондс, Крис (2017). Освоение программирования для встроенного Linux: раскрыть весь потенциал встроенного Linux (второе изд.). Бирмингем, Великобритания. ISBN 978-1-78728-885-0 . OCLC 995052708 .
{{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка ) - ^ «Обновление u-boot для плат Boundary Devices» . 08.11.2013.
- ^ «Руководство по Фексу» . Linux-Sunxi.org. 30 мая 2014 г. Проверено 12 июня 2014 г.
- ^ «Драйвер ACPI для Windows» . microsoft.com. 14 декабря 2021 г. Проверено 19 сентября 2022 г.
- ^ Сунь, Цзимин (2015). Решения для встроенного ПО: лучшие практики разработки для Интернета вещей . Винсент Циммер, Марк Джонс, Стефан Рейнауэр. [Соединенные Штаты]. п. 82. ИСБН 978-1-4842-0070-4 . OCLC 902804314 .
{{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка ) - ^ «Введение в дерево устройств – Документация проекта Zephyr» . 2.6.0. Проект Зефир . 05.06.2021.