stringtranslate.com

Árbol de dispositivos

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 .

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 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]

Uso

Linux

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 .

Ventanas

Windows (excepto Windows CE ) no utiliza DeviceTree (archivo DTB) como se describe aquí. En su lugar, utiliza ACPI para detectar y administrar dispositivos. [6]

Manzana

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 .

Arranque básico

El proyecto coreboot utiliza árboles de dispositivos, pero son diferentes de los árboles de dispositivos aplanados utilizados en el kernel de Linux. [7]

Ejemplo

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@4001e000y 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 flash0respectivamente.

Los dos últimos nodos tienen propiedades , que representan pares nombre/valor. La propiedad labeltiene tipo cadena, la propiedad erase-blocktiene tipo entero y la propiedad reges 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 flash0se 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]

Véase también

Referencias

  1. ^ abc "Especificación de Devicetree" (PDF) . Versión v0.3. devicetree.org. 13 de febrero de 2020.
  2. ^ ab "Lista de verificación de compatibilidad de Linux con ARM SoC" (PDF) .
  3. ^ Simmonds, Chris (2017). Dominar la programación Linux embebida: liberar todo el potencial de Linux embebido (segunda edición). Birmingham, Reino Unido. ISBN 978-1-78728-885-0.OCLC 995052708  .{{cite book}}: Mantenimiento de CS1: falta la ubicación del editor ( enlace )
  4. ^ "Actualización de u-boot para las placas de Boundary Devices". 2013-11-08.
  5. ^ "Guía de Fex". linux-sunxi.org. 2014-05-30 . Consultado el 2014-06-12 .
  6. ^ "El controlador ACPI de Windows". microsoft.com. 2021-12-14 . Consultado el 2022-09-19 .
  7. ^ Sun, Jiming (2015). Soluciones de firmware integrado: mejores prácticas de desarrollo para la Internet de las cosas. Vincent Zimmer, Marc Jones, Stefan Reinauer. [Estados Unidos]. pág. 82. ISBN 978-1-4842-0070-4.OCLC 902804314  .{{cite book}}: Mantenimiento de CS1: falta la ubicación del editor ( enlace )
  8. ^ "Introducción a devicetree – Documentación del proyecto Zephyr". 2.6.0. Proyecto Zephyr . 2021-06-05.

Enlaces externos