Un bootloader est une image propriétaire du fournisseur chargée de démarrer le noyau sur un appareil. Le bootloader protège l'état de l'appareil et est responsable de l'initialisation de l'environnement d'exécution sécurisé (TEE) et de la liaison de sa racine de confiance. Le bootloader vérifie également l'intégrité des partitions boot
et recovery
avant de transférer l'exécution au noyau.
Exemple de flux de bootloader
Voici un exemple de flux de bootloader :
Charger et initialiser la mémoire
Validez l'appareil en suivant la procédure de démarrage validé.
Validez les partitions de démarrage, y compris
boot
,dtbo
,init_boot
etrecovery
, conformément au flux de démarrage validé. Dans le cadre de cette étape, vérifiez la version de l'en-tête de l'image de démarrage et analysez l'en-tête en conséquence.Si des mises à jour A/B sont utilisées, déterminez l'emplacement actuel à partir duquel démarrer.
Déterminez si le mode Récupération doit être démarré. Pour en savoir plus, consultez Prise en charge des mises à jour OTA.
Chargez les images de démarrage, telles que
boot.img
,vendor_boot.img
,init_boot.img
et d'autres images de démarrage de fournisseurs propriétaires. Ces images de démarrage contiennent les images du noyau et du disque RAM.Chargez le noyau en mémoire sous forme de fichier binaire compressé auto-exécutable. Le noyau se décompresse et commence à s'exécuter en mémoire.
Chargez les ramdisks et la section bootconfig dans la mémoire pour créer
initramfs
.
Autres fonctionnalités liées au bootloader
Vous trouverez ci-dessous une liste de fonctionnalités supplémentaires liées au bootloader que vous pouvez implémenter :
Superposition d'arborescence de périphériques (DTO, Device Tree Overlay) Un overlay d'arborescence de périphériques permet au bootloader de prendre en charge différentes configurations matérielles. Un DTO est compilé dans un blob d'arborescence de périphériques (DTB) utilisé par le bootloader.
Randomisation de l'adresse virtuelle de l'image du noyau. Le bootloader permet d'aléatoriser l'adresse virtuelle à laquelle l'image du noyau est chargée. Pour randomiser l'adresse, définissez
RANDOMIZE_BASE
surtrue
dans la configuration du noyau. Le bootloader doit fournir de l'entropie en transmettant une valeur u64 aléatoire dans le nœud d'arborescence de périphériques/chosen/kaslr-seed
.Démarrage validé : Le démarrage validé permet au bootloader de s'assurer que tout le code exécuté provient d'une source fiable.
Configuration du démarrage La configuration de démarrage est disponible dans Android 12 et versions ultérieures. Il s'agit d'un mécanisme permettant de transmettre les détails de configuration de la compilation et du bootloader au système d'exploitation. Avant Android 12, les paramètres de ligne de commande du noyau avec le préfixe
androidboot
étaient utilisés.Mises à jour OTA (Over-The-Air) : mises à jour des fonctionnalités logicielles d'un appareil par l'intermédiaire d'un réseau. Les appareils Android sur le terrain peuvent recevoir et installer des mises à jour OTA pour le système, le logiciel de l'application et les règles de fuseau horaire. Cette fonctionnalité a des implications sur l'implémentation de votre bootloader. Pour obtenir des informations générales sur les mises à jour OTA, consultez Mises à jour OTA. Pour en savoir plus sur l'implémentation OTA spécifique au bootloader, consultez Prise en charge des mises à jour OTA.
Liaison de version. La liaison de version associe les clés de sécurité à la version du système d'exploitation et au niveau du correctif. L'association de version garantit qu'un pirate informatique qui découvre une faille dans une ancienne version du système ou du logiciel TEE ne peut pas rétablir la version vulnérable sur un appareil et utiliser les clés créées avec la version plus récente. Le bootloader doit fournir certaines informations pour prendre en charge l'association de version. Pour en savoir plus, consultez Informations sur la version dans les propriétés AVB.
Ligne de commande du noyau
Concaténez la ligne de commande du noyau à partir des emplacements suivants :
Ligne de commande du bootloader : ensemble de paramètres statiques et dynamiques déterminés par le bootloader
Arborescence des appareils : à partir du nœud
chosen/bootargs
defconfig
: à partir duCONFIG_CMDLINE
boot.img
: depuis la ligne de commande (pour les décalages et les tailles, consultezsystem/core/mkbootimg/bootimg.h
).
Depuis Android 12, pour les paramètres androidboot.*
que nous devons transmettre à l'espace utilisateur Android, nous pouvons utiliser bootconfig au lieu de la ligne de commande du noyau.