Présentation du bootloader

Un bootloader est une image propriétaire du fournisseur chargée d'afficher le noyau d'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:

  1. Chargez et initialisez la mémoire.

  2. Validez l'appareil conformément au flux de démarrage validé.

  3. Vérifiez les partitions de démarrage, y compris boot, dtbo, init_boot et recovery, conformément au flux de démarrage validé. Lors de cette étape, vérifiez la version de l'en-tête de l'image de démarrage et analysez-le en conséquence.

  4. Si des mises à jour A/B sont utilisées, déterminez l'emplacement actuel à démarrer.

  5. Déterminez si le mode de récupération doit être démarré. Pour en savoir plus, consultez la section Prise en charge des mises à jour OTA.

  6. Chargez les images de démarrage, telles que boot.img, vendor_boot.img, init_boot.img et d'autres images de démarrage propriétaires du fournisseur. Ces images de démarrage contiennent les images du noyau et du ramdisk.

    1. Chargez le noyau en mémoire en tant que binaire compressé auto-exécutable. Le noyau se décompresse et commence à s'exécuter dans la mémoire.

    2. Chargez les ramdisks et la section bootconfig dans la mémoire pour créer initramfs.

Fonctionnalités supplémentaires 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). Une superposition d'arborescence d'appareils permet au bootloader de prendre en charge différentes configurations matérielles. Un DTO est compilé dans un blob d'arborescence de périphérique (DTB), qui est utilisé par le bootloader.

  • Organisation aléatoire des adresses virtuelles de l'image du noyau. Le bootloader permet de passer de manière aléatoire à l'adresse virtuelle à laquelle l'image du noyau est chargée. Pour randomiser l'adresse, définissez RANDOMIZE_BASE sur true dans la configuration du kernel. Le bootloader doit fournir une entropie en transmettant une valeur u64 aléatoire dans le nœud d'arborescence de l'appareil /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 de 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 sont utilisés.

  • Mises à jour OTA (Over The Air) Les appareils Android sur le terrain peuvent recevoir et installer des mises à jour OTA du système, du logiciel d'application et des règles de fuseau horaire. Cette fonctionnalité a des conséquences sur l'implémentation de votre bootloader. Pour obtenir des informations générales sur les mises à jour OTA, consultez la section Mises à jour OTA. Pour en savoir plus sur l'implémentation OTA spécifique au bootloader, consultez la section Prise en charge des mises à jour OTA.

  • Liaison de version La liaison de version lie les clés de sécurité au système d'exploitation et au niveau du correctif. La liaison 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 faire revenir un appareil à la version vulnérable et utiliser les clés créées avec la version plus récente. Le bootloader doit fournir certaines informations pour prendre en charge la liaison de version. Pour en savoir plus, consultez la section Informations sur la version dans les propriétés AVB.

Ligne de commande du kernel

Concatenate la ligne de commande du kernel à partir des emplacements suivants:

  • Ligne de commande du bootloader: ensemble de paramètres statiques et dynamiques déterminés par le bootloader

  • Arborescence des périphériques: à partir du nœud chosen/bootargs

  • defconfig: de CONFIG_CMDLINE

  • boot.img: à partir de la ligne de commande (pour les décalages et la taille, consultez system/core/mkbootimg/bootimg.h)

À partir d'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.