linux - compatible - device tree android
ARM Linux Atags vs Device Tree (2)
Un árbol de dispositivos describe todo sobre el hardware que utiliza el kernel para seleccionar qué controladores cargar, dónde están todas las interfaces MMIO, etc ... en tiempo de ejecución. Los ATAG simplemente describen cosas como dónde encontrar un initrd y los parámetros del kernel, memoria, etc. ... todo lo demás sobre la máquina está codificado en el núcleo.
El método preferido ahora es usar árboles de dispositivos en lugar de ATAG. Una de las ventajas es el hecho de que agregar una nueva plataforma no siempre requiere agregar un nuevo código al kernel.
Para responder a su segunda pregunta, si hubiera leído la documentación para arrancar Linux en la plataforma ARM , encontrará que el núcleo espera que lo siguiente se coloque en los registros antes de que el control se transfiera al núcleo:
r0 = 0,
r1 = machine type number discovered in (3) above.
r2 = physical address of tagged list in system RAM, or
physical address of device tree block (dtb) in system RAM
Creo que hay (o al menos fue) una opción para cargar ATAG desde una ubicación fija en lugar de la dirección que se encuentra en r2. Sin embargo, el uso de ATAG ahora está en desuso y obsoleto, y las nuevas plataformas no deberían usarlo.
¿Cuál es la diferencia entre el árbol de dispositivos y los ATAG? Además, ¿los ATAG son obligatorios y el kernel los espera en una dirección fija, o los espera en r0-r3?
Básicamente, los ATAG se usaban para enviar información al kernel de Linux sobre la información específica de la máquina de la placa, como la memoria, la información de la consola, etc., y el núcleo de Linux utilizaba estos ATAG para inicializar la MMU y otros subsistemas.
Pero con el advenimiento del árbol de dispositivos (más de usarlo con el brazo porque ya se estaba utilizando en la arquitectura powerpc) ahora toda la información relacionada con la máquina se puede pasar usando FDT (blob del árbol del dispositivo).
Hubo algunas ideas flotando para enviar información del árbol del dispositivo al kernel usando un nuevo atag "atag_dtd" pero luego hubo un debate para no usar ATAG en absoluto porque no había necesidad de usar dos métodos de seprate para hacer una sola cosa. Entonces, kernel espera que un gestor de arranque proporcione la siguiente información.
r0 = 0
r1 = Same type of SOC fdt machine id.
r2 = physical address where the dtd can be found.
Utiliza la misma estructura que fue utilizada por el gestor de arranque para enviar información atag, por lo que podría ser compatible con la palabra de nuevo.
Espero eso ayude.