Descripción general del cargador de arranque

Un gestor de arranque es una imagen propiedad del proveedor responsable de abrir el kernel en un dispositivo. El gestor de arranque protege el estado del dispositivo y es responsable de inicializar el entorno de ejecución confiable (TEE) y vincular su raíz de confianza. El gestor de arranque también verifica la integridad de las particiones boot y recovery antes de pasar la ejecución al kernel.

Ejemplo de flujo del gestor de arranque

A continuación se muestra un ejemplo de flujo del gestor de arranque:

  1. Cargar e inicializar la memoria.

  2. Verifique el dispositivo según el flujo de arranque verificado .

  3. Verifique las particiones de inicio, incluidas boot , dtbo , init_boot y recovery , de acuerdo con el flujo de inicio verificado. Como parte de este paso, verifique la versión del encabezado de la imagen de inicio y analice el encabezado en consecuencia.

  4. Si se utilizan actualizaciones A/B , determine la ranura actual para iniciar.

  5. Determine si se debe iniciar el modo de recuperación. Para obtener más información, consulte Compatibilidad con actualizaciones OTA .

  6. Cargue las imágenes de inicio, como boot.img , vendor_boot.img , init_boot.img y otras imágenes de inicio de proveedores propietarios. Estas imágenes de arranque contienen las imágenes del kernel y del disco RAM.

    1. Cargue el kernel en la memoria como un binario comprimido autoejecutable. El kernel se descomprime y comienza a ejecutarse en la memoria.

    2. Cargue los discos ram y la sección bootconfig en la memoria para crear initramfs .

Funciones adicionales relacionadas con el gestor de arranque

A continuación se muestra una lista de características adicionales relacionadas con el gestor de arranque que puede implementar:

  • Superposición de árbol de dispositivos (DTO). Una superposición de árbol de dispositivos permite que el gestor de arranque admita diferentes configuraciones de hardware. Un DTO se compila en un blob de árbol de dispositivos (DTB) que utiliza el gestor de arranque.

  • Aleatorización de direcciones virtuales de imágenes del kernel. El gestor de arranque admite la aleatorización de la dirección virtual en la que se carga la imagen del kernel. Para aleatorizar la dirección, establezca RANDOMIZE_BASE en true en la configuración del kernel. El gestor de arranque debe proporcionar entropía pasando un valor u64 aleatorio en el nodo del árbol de dispositivos /chosen/kaslr-seed .

  • Arranque verificado. El arranque verificado permite al gestor de arranque garantizar que todo el código ejecutado provenga de una fuente confiable.

  • Configuración de arranque. La configuración de arranque está disponible en Android 12 y versiones posteriores y es un mecanismo para pasar detalles de configuración desde la compilación y el gestor de arranque al sistema operativo. Antes de Android 12, se usaban parámetros de línea de comandos del kernel con el prefijo androidboot .

  • Actualizaciones inalámbricas (OTA). Los dispositivos Android en el campo pueden recibir e instalar actualizaciones OTA para el sistema, el software de la aplicación y las reglas de zona horaria. Esta característica tiene implicaciones en la implementación de su gestor de arranque. Para obtener información general sobre OTA, consulte Actualizaciones de OTA . Para obtener detalles sobre la implementación de OTA específica del gestor de arranque, consulte Compatibilidad con actualizaciones de OTA .

  • Enlace de versión . El enlace de versión vincula las claves de seguridad al sistema operativo y a la versión del nivel de parche. El enlace de versión garantiza que un atacante que descubre una debilidad en una versión antigua del sistema o en el software TEE no pueda revertir un dispositivo a la versión vulnerable y usar claves creadas con la versión más nueva. El gestor de arranque debe proporcionar cierta información para admitir el enlace de versiones. Para obtener más información, consulte Información de versión en propiedades de AVB .

Línea de comando del núcleo

Concatene la línea de comando del kernel desde las siguientes ubicaciones:

  • Línea de comando del gestor de arranque: conjunto de parámetros estáticos y dinámicos determinados por el gestor de arranque

  • Árbol de dispositivos: desde el nodo chosen/bootargs

  • defconfig : de CONFIG_CMDLINE

  • boot.img : desde la línea de comando (para compensaciones y tamaños, consulte system/core/mkbootimg/bootimg.h

A partir de Android 12, para los parámetros androidboot.* que necesitamos pasar al espacio de usuario de Android, podemos usar bootconfig en lugar de la línea de comando del kernel.