Descripción general del bootloader

Un cargador de arranque es una imagen propiedad del proveedor que se encarga de iniciar el kernel en un dispositivo. El cargador 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 bootloader también verifica la integridad de las particiones boot y recovery antes de pasar la ejecución al kernel.

Ejemplo de flujo del bootloader

Este es un ejemplo de flujo del cargador de arranque:

  1. Carga e inicializa la memoria.

  2. Verifica el dispositivo según el flujo de inicio verificado.

  3. Verifica las particiones de inicio, incluidas boot, dtbo, init_boot y recovery, según el flujo de inicio verificado. Como parte de este paso, verifica la versión del encabezado de la imagen de arranque y analiza el encabezado según corresponda.

  4. Si se usan actualizaciones A/B, determina la ranura actual para iniciar.

  5. Determina si se debe iniciar el modo de recuperación. Para obtener más información, consulta Cómo admitir actualizaciones OTA.

  6. Carga 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 del ramdisk.

    1. Carga el kernel en la memoria como un archivo binario comprimido auto ejecutable. El kernel se descomprime y comienza a ejecutarse en la memoria.

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

Funciones adicionales relacionadas con el bootloader

A continuación, se incluye una lista de funciones adicionales relacionadas con el cargador de arranque que puedes implementar:

  • Superposición del árbol de dispositivos (DTO): Una superposición del árbol de dispositivos permite que el cargador de arranque admita diferentes configuraciones de hardware. Un DTO se compila en un BLOB del árbol de dispositivos (DTB) que usa el cargador de arranque.

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

  • Inicio verificado. El inicio verificado permite que el bootloader garantice que todo el código ejecutado provenga de una fuente confiable.

  • Configuración de inicio. Boot config está disponible en Android 12 y versiones posteriores, y es un mecanismo para pasar detalles de configuración de la compilación y del bootloader al sistema operativo. En versiones anteriores a Android 12, se usan parámetros de la 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 inalámbricas del sistema, el software de apps y las reglas de zona horaria. Esta función tiene implicaciones en la implementación del cargador de arranque. Para obtener información general sobre las actualizaciones OTA, consulta Actualizaciones OTA. Para obtener detalles sobre la implementación de OTA específica del bootloader, consulta Compatibilidad con actualizaciones OTA.

  • Vinculación de versión La vinculación de versión vincula las llaves de seguridad al sistema operativo y a la versión del nivel de parche. La vinculación de versiones garantiza que un atacante que descubre una debilidad en una versión anterior del sistema o del software del TEE no pueda revertir un dispositivo a la versión vulnerable y usar las claves creadas con la versión más reciente. El bootloader debe proporcionar cierta información para admitir la vinculación de versiones. Para obtener más información, consulta Información de la versión en las propiedades de AVB.

Línea de comandos del kernel

Concatena la línea de comandos del kernel desde las siguientes ubicaciones:

  • Línea de comandos del bootloader: Conjunto de parámetros estáticos y dinámicos determinados por el bootloader

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

  • defconfig: desde CONFIG_CMDLINE

  • boot.img: Desde la línea de comandos (para los desplazamientos y tamaños, consulta system/core/mkbootimg/bootimg.h)

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