En informática , un árbol de dispositivos (también escrito árbol de dispositivos ) es una estructura de datos que describe los componentes de hardware de un ordenador en particular para que el núcleo del sistema operativo pueda usar y gestionar esos componentes, incluyendo la CPU o las CPU, la memoria , los buses y los periféricos integrados .
El árbol de dispositivos se derivó de computadoras basadas en SPARC y PowerPC a través del proyecto Open Firmware . La especificación actual del árbol de dispositivos [ 1 ] está dirigida a sistemas más pequeños y sistemas embebidos, pero todavía se utiliza con algunos sistemas de clase servidor (por ejemplo, los descritos en la Referencia de la plataforma de arquitectura Power ).
Los ordenadores personales con arquitectura x86 generalmente no utilizan árboles de dispositivos, sino que recurren a diversos protocolos de autoconfiguración (por ejemplo, ACPI ) para detectar el hardware. Los sistemas que sí utilizan árboles de dispositivos suelen pasar un árbol de dispositivos estático (almacenado en la EEPROM o en un dispositivo NAND como eUFS ) al sistema operativo, pero también pueden generarlo en las primeras etapas del arranque . Por ejemplo, Das U-Boot y kexec pueden pasar un árbol de dispositivos al iniciar un nuevo sistema operativo. En sistemas con un gestor de arranque que no admite árboles de dispositivos, se puede instalar un árbol de dispositivos estático junto con el sistema operativo; el kernel de Linux admite este método.
La especificación Devicetree está gestionada actualmente por una comunidad llamada devicetree.org , que está asociada, entre otros, con Linaro y Arm .
Formatos
Un árbol de dispositivos puede contener cualquier tipo de datos, ya que internamente es un árbol de nodos y propiedades con nombre . Los nodos contienen propiedades y nodos hijos, mientras que las propiedades son pares nombre-valor .
Los árboles de dispositivos tienen tanto un formato binario para que lo utilicen los sistemas operativos como un formato textual para una edición y gestión convenientes. [ 1 ]
Uso
Linux
Con el árbol de dispositivos correcto, el mismo kernel compilado puede admitir diferentes configuraciones de hardware dentro de una familia de arquitectura más amplia. El kernel de Linux para las arquitecturas ARC , ARM , C6x , H8/300 , MicroBlaze , MIPS , NDS32, Nios II , OpenRISC , PowerPC , Power ISA , RISC-V , SuperH y Xtensa lee la información del árbol de dispositivos; en ARM, los árboles de dispositivos son obligatorios para todos los nuevos SoC desde 2012. [ 2 ] Esto puede considerarse una solución a la gran cantidad de bifurcaciones (de Linux y Das U-Boot) que históricamente se han creado para admitir placas ARM (ligeramente) diferentes. El objetivo es trasladar una parte significativa de la descripción del hardware del binario del kernel al blob del árbol de dispositivos compilado, que el cargador de arranque entrega al kernel , reemplazando una serie de archivos fuente C específicos de la placa y opciones de compilación en el kernel. [ 2 ]
Se especifica en un archivo fuente Devicetree (.dts) y se compila en un archivo binario Devicetree Blob (.dtb) (también conocido como árbol de dispositivos aplanado) [ 3 ] mediante el compilador Devicetree (DTC). Los archivos fuente Devicetree pueden incluir otros archivos, denominados inclusiones fuente Devicetree. [ 4 ] [ 1 ]
Las distribuciones de Linux basadas en ARM solían incluir un gestor de arranque personalizado para placas específicas, como la Raspberry Pi o la Hackberry A10. Esto generaba problemas para los desarrolladores, ya que algunas partes del sistema operativo debían compilarse específicamente para cada variante de placa o actualizarse para admitir nuevas placas. Sin embargo, algunos SoC modernos (por ejemplo, el Freescale i.MX6 ) cuentan con un gestor de arranque proporcionado por el fabricante, con un árbol de dispositivos en un chip independiente del sistema operativo. [ 5 ]
Un formato de archivo de configuración propietario utilizado para fines similares, el formato de archivo FEX, [ 6 ] es un estándar de facto entre los SoC de Allwinner .
Devicetree se utiliza ampliamente en dispositivos Android basados en ARM .
BSD
BSD puede admitir el árbol de dispositivos, ya que este se suele adoptar en dispositivos embebidos. [ 7 ]
Windows
Windows no utiliza Devicetree (archivo DTB) como se describe aquí. En su lugar, utiliza ACPI para descubrir y administrar dispositivos. [ 8 ]
Manzana
Durante el proceso de arranque de iOS , iPadOS y macOS ARM, el gestor de arranque de bajo nivel (LLB) carga el árbol de dispositivos cifrado de Apple en la memoria principal y, a continuación, carga iBoot.
Coreboot
El proyecto coreboot utiliza árboles de dispositivos, pero estos son diferentes de los árboles de dispositivos aplanados utilizados en el kernel de Linux. [ 9 ]
Ejemplo
Ejemplo de formato de Devicetree Source (DTS):
/dts-v1/ ;/ { soc { flash_controller : flash-controller @ 4001e000 { reg = < 0x4001e000 0x1000 > ; flash0 : flash @ 0 { label = "SOC_FLASH" ; erase-block = < 4096 > ; }; }; }; };En el ejemplo anterior, la línea indica la versión 1 de la sintaxis DTS./dts-v1/;
El árbol tiene cuatro nodos: /(nodo raíz), soc(que significa " sistema en un chip ") flash-controller@4001e000y flash@0(instancia de flash que utiliza el controlador de flash). Además de estos nombres de nodo , los dos últimos nodos tienen etiquetasflash_controller y flash0respectivamente.
Los dos últimos nodos tienen propiedades que representan pares nombre/valor. La propiedad labeles de tipo cadena, la propiedad erase-blockes de tipo entero y la propiedad reges una matriz de enteros (valores sin signo de 32 bits). Los valores de las propiedades pueden hacer referencia a otros nodos en el árbol de dispositivos mediante sus identificadores de página . El identificador de página para un nodo con etiqueta flash0se escribiría como &flash0. Los identificadores de página también son valores de 32 bits.
Las partes de los nombres de los nodos que aparecen después del signo "@" ( @) son direcciones de unidad . Las direcciones de unidad especifican la dirección de recurso de un nodo en el espacio de direcciones de su nodo padre.
El árbol anterior podría ser compilado por el compilador DTC estándar al formato binario DTB o en lenguaje ensamblador . Sin embargo, en el RTOS Zephyr , los archivos DTS se compilan en archivos de cabecera C (.h), que luego son utilizados por el sistema de compilación para compilar el código para una placa específica . [ 10 ]
Véase también
Referencias
- 1 2 3 "Especificación de Devicetree" (PDF) . Versión v0.4. devicetree.org. 2023-06-28.
- 1 2 "Lista de verificación de soporte de Linux para ARM SoC" (PDF) .
- ↑ "Parámetros del kernel usando árboles de dispositivos aplanados" . Desarrollador de Arm .
- ↑ Simmonds, Chris (2017). Dominando la programación de Linux embebido : libera todo el potencial de Linux embebido (Segunda edición). Birmingham, Reino Unido. ISBN 978-1-78728-885-0OCLC 995052708
{{cite book}}: CS1 mantenimiento: falta el editor de ubicación ( enlace ) - ↑ "Actualización de u-boot para las placas de Ezurio" . 08/11/2013.
- ↑ "Guía Fex" . linux-sunxi.org. 30 de mayo de 2014. Consultado el 12 de junio de 2014 .
- ↑ "FDT" . man.freebsd.org . Consultado el 12 de septiembre de 2025 .
- ↑ "El controlador ACPI de Windows" . microsoft.com. 14 de diciembre de 2021. Consultado el 19 de septiembre de 2022 .
- ↑ Sun, Jiming (2015). Soluciones de firmware embebido: mejores prácticas de desarrollo para el internet de las cosas . Vincent Zimmer, Marc Jones, Stefan Reinauer. [Estados Unidos]. pág. 82. ISBN 978-1-4842-0070-4OCLC 902804314
{{cite book}}: CS1 mantenimiento: falta el editor de ubicación ( enlace ) - ↑ "Introducción a devicetree – Documentación del proyecto Zephyr" . 2.6.0. Proyecto Zephyr . 5 de junio de 2021.
Enlaces externos
- Estructuras de datos por plataforma informática
- Tecnología de sistemas operativos
- Firmware
- Arquitectura ARM
- Sistemas embebidos