stringtranslate.com

Дерево устройств

В вычислительной технике дерево устройств (также называемое деревом устройств ) — это структура данных , описывающая аппаратные компоненты конкретного компьютера, чтобы ядро ​​операционной системы могло использовать и управлять этими компонентами, включая ЦП или ЦП, память , шины и встроенная периферия .

Дерево устройств было получено на основе компьютеров 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]

Смотрите также

Рекомендации

  1. ^ abc «Спецификация дерева устройств» (PDF) . Релиз v0.3. http://devicetree.org. 13 февраля 2020 г.
  2. ^ ab «Контрольный список поддержки ARM SoC Linux» (PDF) .
  3. ^ Симмондс, Крис (2017). Освоение программирования для встроенного Linux: раскрыть весь потенциал встроенного Linux (второе изд.). Бирмингем, Великобритания. ISBN 978-1-78728-885-0. ОСЛК  995052708.{{cite book}}: CS1 maint: отсутствует местоположение издателя ( ссылка )
  4. ^ «Обновление u-boot для плат Boundary Devices» . 08.11.2013.
  5. ^ "Руководство по Фексу". Linux-Sunxi.org. 30 мая 2014 г. Проверено 12 июня 2014 г.
  6. ^ «Драйвер ACPI для Windows» . microsoft.com. 14 декабря 2021 г. Проверено 19 сентября 2022 г.
  7. ^ Сунь, Цзимин (2015). Решения для встроенного ПО: лучшие практики разработки для Интернета вещей. Винсент Циммер, Марк Джонс, Стефан Рейнауэр. [Соединенные Штаты]. п. 82. ИСБН 978-1-4842-0070-4. ОСЛК  902804314.{{cite book}}: CS1 maint: отсутствует местоположение издателя ( ссылка )
  8. ^ «Введение в дерево устройств - Документация проекта Zephyr» . 2.6.0. Проект Зефир . 05.06.2021.

Внешние ссылки