Un bootloader es una imagen propiedad del proveedor responsable de iniciar el kernel en un dispositivo. El bootloader 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 transferir la ejecución al kernel.
Ejemplo de flujo de bootloader
Este es un ejemplo de flujo del bootloader:
Carga e inicializa la memoria.
Verifica el dispositivo según el flujo de inicio verificado.
Verifica las particiones de inicio, incluidas
boot
,dtbo
,init_boot
yrecovery
, según el flujo de inicio verificado. Como parte de este paso, verifica la versión del encabezado de imagen de arranque y analiza el encabezado según corresponda.Si se usan actualizaciones A/B, determina el espacio actual para iniciar.
Determina si se debe iniciar el modo de recuperación. Para obtener más información, consulta Compatibilidad con actualizaciones OTA.
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.Carga el kernel en la memoria como un objeto binario comprimido que se ejecuta automáticamente. El kernel se descomprime y comienza a ejecutarse en la memoria.
Carga los discos RAM y la sección bootconfig en la memoria para crear
initramfs
.
Funciones adicionales relacionadas con el bootloader
A continuación, se muestra una lista de funciones adicionales relacionadas con el bootloader que puedes implementar:
Superposición del árbol de dispositivos (DTO): Una superposición de árbol de dispositivos permite que el bootloader admita diferentes configuraciones de hardware. Un DTO se compila en un BLOB de árbol de dispositivos (DTB) que usa el bootloader.
Aleatorización de la dirección virtual de la imagen del kernel. El bootloader admite la aleatoriedad de la dirección virtual en la que se carga la imagen del kernel. Para aleatorizar la dirección, configura
RANDOMIZE_BASE
comotrue
en la configuración del kernel. El bootloader debe proporcionar entropía pasando un valor u64 aleatorio en el nodo del árbol del dispositivo/chosen/kaslr-seed
.Inicio verificado. El inicio verificado permite que el bootloader se asegure de que todo el código ejecutado provenga de una fuente confiable.
Configuración de inicio La configuración de arranque está disponible en Android 12 y versiones posteriores, y es un mecanismo para pasar detalles de configuración de la compilación y el bootloader 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 inalámbricas del sistema, el software de apps y las reglas de zona horaria. Esta función tiene consecuencias en la implementación del bootloader. Para obtener información general sobre las actualizaciones OTA, consulta Actualizaciones OTA. Para obtener detalles sobre la implementación inalámbrica específica del bootloader, consulta Cómo brindar compatibilidad con actualizaciones inalámbricas.
Vinculación de versión: La vinculación de versiones vincula las claves de seguridad al sistema operativo y a la versión del nivel de revisión. La vinculación de versiones garantiza que un atacante que descubra una debilidad en una versión anterior del sistema o del software de TEE no pueda restablecer un dispositivo a la versión vulnerable y usar 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 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: Es un conjunto de parámetros estáticos y dinámicos que determina el bootloader.
Árbol de dispositivos: a partir del nodo
chosen/bootargs
defconfig
: deCONFIG_CMDLINE
boot.img
: Desde la línea de comandos (para los desplazamientos y el tamaño, consultasystem/core/mkbootimg/bootimg.h
).
A partir de Android 12, para los parámetros androidboot.*
que debemos pasar al espacio de usuario de Android, podemos usar bootconfig en lugar de la línea de comandos del kernel.