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 una computadora en particular para que el núcleo del sistema operativo pueda usar y administrar esos componentes, incluyendo la CPU o CPUs, la memoria , los buses y los periféricos integrados .
El árbol de dispositivos se derivó de las computadoras basadas en SPARC a través del proyecto Open Firmware . La especificación actual de Devicetree [1] está orientada a sistemas más pequeños y sistemas integrados, pero aún se utiliza con algunos sistemas de clase servidor (por ejemplo, los descritos en la Referencia de la plataforma de arquitectura de potencia ).
Los ordenadores personales con arquitectura x86 no suelen utilizar árboles de dispositivos, sino que se basan en varios protocolos de configuración automática (por ejemplo, ACPI ) para descubrir el hardware. Los sistemas que utilizan árboles de dispositivos suelen pasar un árbol de dispositivos estático (quizás almacenado en EEPROM o en un dispositivo NAND como eUFS ) al sistema operativo, pero también pueden generar un árbol de dispositivos 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 admita árboles de dispositivos, se puede instalar un árbol de dispositivos estático junto con el sistema operativo; el núcleo de Linux admite este enfoque.
La especificación Devicetree actualmente está administrada por una comunidad llamada devicetree.org, que está asociada, entre otros, con Linaro y Arm .
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 secundarios, mientras que las propiedades son pares nombre-valor .
Los árboles de dispositivos tienen un formato binario para que los utilicen los sistemas operativos y un formato textual para una edición y gestión cómodas. [1]
Si se utiliza el árbol de dispositivos correcto, el mismo núcleo compilado puede soportar distintas configuraciones de hardware dentro de una familia de arquitecturas más amplia. El núcleo Linux para las arquitecturas ARC , ARM , C6x , H8/300 , MicroBlaze , MIPS , NDS32, Nios II , OpenRISC , PowerPC , RISC-V , SuperH y Xtensa lee la información del árbol de dispositivos; en ARM, los árboles de dispositivos han sido obligatorios para todos los nuevos SoC desde 2012. [2] Esto puede verse como un remedio a la gran cantidad de bifurcaciones (de Linux y Das U-Boot) que se han creado históricamente para soportar (marginalmente) distintas placas ARM. El propósito es sacar una parte significativa de la descripción del hardware del binario del núcleo y colocarla en el árbol de dispositivos compilado, que el cargador de arranque entrega al núcleo , reemplazando una serie de archivos fuente C específicos de la placa y opciones de tiempo de compilación en el núcleo. [2]
Se especifica en un archivo de origen de Devicetree (.dts) y se compila en un archivo binario de Devicetree o Devicetree Blob (.dtb) a través del compilador Devicetree (DTC). Los archivos de origen de Devicetree pueden incluir otros archivos, denominados inclusiones de origen de Devicetree. [3] [1]
Ha sido habitual que las distribuciones Linux basadas en ARM incluyan un gestor de arranque, que necesariamente se personaliza para placas específicas, por ejemplo Raspberry Pi o Hackberry A10. Esto ha creado problemas para los creadores de distribuciones Linux, ya que alguna parte del sistema operativo debe compilarse específicamente para cada variante de placa, o actualizarse para soportar nuevas placas. Sin embargo, algunos SoC modernos (por ejemplo, Freescale i.MX6 ) tienen un gestor de arranque proporcionado por el proveedor con un árbol de dispositivos en un chip separado del sistema operativo. [4]
Un formato de archivo de configuración propietario utilizado para propósitos similares, el formato de archivo FEX, [5] es un estándar de facto entre los SoC Allwinner .
Devicetree se utiliza ampliamente para dispositivos Android basados en ARM .
Windows (excepto Windows CE ) no utiliza DeviceTree (archivo DTB) como se describe aquí. En su lugar, utiliza ACPI para detectar y administrar dispositivos. [6]
En el proceso de arranque de iOS , iPadOS y ARM macOS , el cargador de arranque de bajo nivel (LLB) cargará el árbol de dispositivos cifrado de Apple en la memoria principal y luego cargará iBoot .
El proyecto coreboot utiliza árboles de dispositivos, pero son diferentes de los árboles de dispositivos aplanados utilizados en el kernel de Linux. [7]
Ejemplo de formato de fuente Devicetree (DTS):
/dts-v1/ ;/ { soc { flash_controller : flash-controller @ 4001e000 { reg = < 0x4001e000 0x1000 > ; flash0 : flash @ 0 { etiqueta = "SOC_FLASH" ; borrar-bloque = < 4096 > ; }; }; } ; } ;
En el ejemplo anterior, la línea significa la versión 1 de la sintaxis DTS./dts-v1/;
El árbol tiene cuatro nodos: /
(nodo raíz), soc
(significa " sistema en un chip ") flash-controller@4001e000
y flash@0
(instancia de flash que utiliza el controlador flash). Además de estos nombres de nodo, los dos últimos nodos tienen etiquetas flash_controller
y flash0
respectivamente.
Los dos últimos nodos tienen propiedades , que representan pares nombre/valor. La propiedad label
tiene tipo cadena, la propiedad erase-block
tiene tipo entero y la propiedad reg
es una matriz de enteros (valores sin signo de 32 bits). Los valores de propiedad pueden hacer referencia a otros nodos en el árbol de dispositivos mediante sus phandles . El phandle de un nodo con etiqueta flash0
se escribiría como &flash0
. Los phandles también son valores de 32 bits.
Las partes de los nombres de los nodos que aparecen después del signo "arroba" ( @
) son direcciones de unidad . Las direcciones de unidad especifican la dirección de un nodo en el espacio de direcciones de su nodo padre.
El árbol anterior se puede compilar con el compilador DTC estándar en formato binario DTB o ensamblado . Sin embargo, en Zephyr RTOS , los archivos DTS se compilan en archivos de encabezado C (.h), que luego son utilizados por el sistema de compilación para compilar el código para una placa específica . [8]
{{cite book}}
: Mantenimiento de CS1: falta la ubicación del editor ( enlace ){{cite book}}
: Mantenimiento de CS1: falta la ubicación del editor ( enlace )