Descripción general del cargador de arranque

Un cargador 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 de confianza (TEE) y vincular su raíz de confianza. El gestor de arranque también verifica la integridad de las particiones de boot y recovery antes de pasar la ejecución al kernel.

Ejemplo de flujo de cargador de arranque

Aquí hay un ejemplo de flujo de cargador de arranque:

  1. Carga e inicializa la memoria.

  2. Verifique el dispositivo de acuerdo con 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 arranque y analice el encabezado en consecuencia.

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

  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 arranque, como boot.img , vendor_boot.img , init_boot.img y otras imágenes de arranque de proveedores propietarios. Estas imágenes de arranque contienen las imágenes del kernel y ramdisk.

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

    2. Cargue ramdisks y la sección bootconfig en la memoria para crear initramfs .

Funciones adicionales relacionadas con el gestor de arranque

La siguiente es 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 cargador 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 la dirección virtual de la imagen del núcleo. El cargador de arranque admite la asignación aleatoria 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 cargador de arranque debe proporcionar entropía al pasar un valor u64 aleatorio en el nodo del árbol de dispositivos /chosen/kaslr-seed .

  • Arranque verificado. Verified Boot permite que el gestor de arranque se asegure de 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 cargador de arranque al sistema operativo. Antes de Android 12, se usaban los parámetros de línea de comandos del kernel con el prefijo de androidboot .

  • Actualizaciones por aire (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 las actualizaciones de OTA . Para obtener detalles de implementación de OTA específicos del cargador 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 la versión de nivel de parche. La vinculación de versiones garantiza que un atacante que descubra una debilidad en una versión anterior del sistema o el software TEE no pueda revertir un dispositivo a la versión vulnerable y usar claves creadas con la versión más reciente. 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 la versión en las 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 cargador de arranque: conjunto de parámetros estáticos y dinámicos determinados por el cargador de arranque

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

  • defconfig : de CONFIG_CMDLINE

  • boot.img : desde la línea de comando (para las compensaciones y el tamaño, 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 comandos del kernel.