stringtranslate.com

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

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

Дерево устройств было получено из компьютеров на базе SPARC через проект Open Firmware . Текущая спецификация Devicetree [1] нацелена на меньшие системы и встроенные системы, но все еще используется с некоторыми системами серверного класса (например, описанными в Power Architecture Platform Reference ).

Персональные компьютеры с архитектурой 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]

Он указан в файле Devicetree Source (.dts) и компилируется в Devicetree Blob или файл дерева устройств binary (.dtb) через компилятор Devicetree (DTC). Файлы исходного дерева устройств могут включать другие файлы, называемые включениями исходного дерева устройств. [3] [1]

Обычно дистрибутивы Linux на базе ARM включают загрузчик, который обязательно настраивается под конкретные платы, например Raspberry Pi или Hackberry A10. Это создает проблемы для создателей дистрибутивов Linux, поскольку некоторая часть операционной системы должна быть скомпилирована специально для каждого варианта платы или обновлена ​​для поддержки новых плат. Однако некоторые современные SoC (например, Freescale i.MX6 ) имеют загрузчик, предоставляемый поставщиком, с деревом устройств на отдельном чипе от операционной системы. [4]

Для аналогичных целей используется фирменный формат файла конфигурации FEX [5] , который является фактическим стандартом среди систем на кристалле Allwinner .

Devicetree широко используется для Android -устройств на базе ARM.

Окна

Windows (за исключением Windows CE ) не использует DeviceTree (файл DTB), как описано здесь. Вместо этого он использует ACPI для обнаружения и управления устройствами. [6]

Яблоко

В процессе загрузки iOS , iPadOS и ARM macOS загрузчик низкого уровня (LLB) загрузит зашифрованное Apple дерево устройств в основную память, а затем загрузит iBoot .

Coreboot

Проект coreboot использует деревья устройств, но они отличаются от уплощенных деревьев устройств, используемых в ядре Linux. [7]

Пример

Пример формата источника Devicetree (DTS):

/dts-v1/ ;/ { soc { flash_controller : flash-controller @ 4001e000 { reg = < 0x4001e000 0x1000 > ; flash0 : flash @ 0 { label = "SOC_FLASH" ; erasure-block = < 4096 > ; }; }; }; } ;                      

В приведенном выше примере линия обозначает версию 1 синтаксиса DTS./dts-v1/;

Дерево имеет четыре узла: /(корневой узел), soc(обозначает « система на чипе ») flash-controller@4001e000и flash@0(экземпляр флэш-памяти, использующий контроллер флэш-памяти). Помимо этих имен узлов, последние два узла имеют метки flash_controller и flash0соответственно.

Последние два узла имеют свойства , которые представляют пары имя/значение. Свойство labelимеет строковый тип, свойство erase-blockимеет целочисленный тип, а свойство regявляется массивом целых чисел (32-битные беззнаковые значения). Значения свойств могут ссылаться на другие узлы в дереве устройств по их phandle . Phandle для узла с меткой flash0будет записан как &flash0. Phandle также являются 32-битными значениями.

Части имен узлов после знака "at" ( @) являются адресами узлов . Адреса узлов указывают адрес узла в адресном пространстве его родительского узла.

Вышеуказанное дерево может быть скомпилировано стандартным компилятором DTC в двоичный формат DTB или сборку . Однако в Zephyr RTOS файлы DTS компилируются в файлы заголовков C (.h), которые затем используются системой сборки для компиляции кода для конкретной платы . [8]

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

Ссылки

  1. ^ abc "Спецификация Devicetree" (PDF) . Выпуск v0.3. devicetree.org. 2020-02-13.
  2. ^ ab "Контрольный список поддержки ARM SoC Linux" (PDF) .
  3. ^ Симмондс, Крис (2017). Освоение программирования встраиваемого Linux: раскройте весь потенциал встраиваемого Linux (второе изд.). Бирмингем, Великобритания. ISBN 978-1-78728-885-0. OCLC  995052708.{{cite book}}: CS1 maint: отсутствует местоположение издателя ( ссылка )
  4. ^ "Обновление u-boot для плат Boundary Devices". 2013-11-08.
  5. ^ "Fex Guide". linux-sunxi.org. 2014-05-30 . Получено 2014-06-12 .
  6. ^ "Драйвер Windows ACPI". microsoft.com. 2021-12-14 . Получено 2022-09-19 .
  7. ^ Сан, Джиминг (2015). Встроенные решения для прошивки: лучшие практики разработки для Интернета вещей. Винсент Циммер, Марк Джонс, Стефан Рейнауер. [США]. стр. 82. ISBN 978-1-4842-0070-4. OCLC  902804314.{{cite book}}: CS1 maint: отсутствует местоположение издателя ( ссылка )
  8. ^ "Введение в devicetree – Документация проекта Zephyr". 2.6.0. Проект Zephyr . 2021-06-05.

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