Présentation du chargeur de démarrage

Un chargeur de démarrage est une image propriétaire du fournisseur chargée d'afficher le noyau sur un périphérique. Le chargeur de démarrage protège l'état du périphérique et est responsable de l'initialisation du Trusted Execution Environment (TEE) et de la liaison de sa racine de confiance. Le chargeur de démarrage vérifie également l'intégrité des partitions boot et recovery avant de déplacer l'exécution vers le noyau.

Exemple de flux de chargeur de démarrage

Voici un exemple de flux de chargeur de démarrage :

  1. Chargez et initialisez la mémoire.

  2. Vérifiez le périphérique selon le flux de démarrage vérifié .

  3. Vérifiez les partitions de démarrage, y compris boot , dtbo , init_boot et recovery , selon le flux de démarrage vérifié. 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.

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

  5. Déterminez si le mode de récupération doit être démarré. Pour plus d'informations, consultez 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 de fournisseurs propriétaires. Ces images de démarrage contiennent les images du noyau et du disque virtuel.

    1. Chargez le noyau en mémoire sous forme de binaire compressé auto-exécutable. Le noyau se décompresse et commence à s'exécuter en mémoire.

    2. Chargez les disques virtuels et la section bootconfig en mémoire pour créer initramfs .

Fonctionnalités supplémentaires liées au chargeur de démarrage

Voici une liste de fonctionnalités supplémentaires liées au chargeur de démarrage que vous pouvez implémenter :

  • Superposition de l'arborescence des périphériques (DTO). Une superposition d'arborescence de périphériques permet au chargeur de démarrage de prendre en charge différentes configurations matérielles. Un DTO est compilé dans un blob d’arborescence de périphériques (DTB) qui est utilisé par le chargeur de démarrage.

  • Randomisation des adresses virtuelles de l’image du noyau. Le chargeur de démarrage prend en charge la randomisation de 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 noyau. Le chargeur de démarrage doit fournir de l'entropie en transmettant une valeur u64 aléatoire dans le nœud de l'arborescence des périphériques /chosen/kaslr-seed .

  • Démarrage vérifié. Verified Boot permet au chargeur de démarrage de garantir 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 et constitue un mécanisme permettant de transmettre les détails de configuration de la version et du chargeur de démarrage 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 en direct (OTA). Les appareils Android sur le terrain peuvent recevoir et installer des mises à jour OTA du système, des applications et des règles de fuseau horaire. Cette fonctionnalité a des implications sur la mise en œuvre de votre chargeur de démarrage. Pour des informations générales sur OTA, consultez Mises à jour OTA . Pour plus de détails sur l’implémentation OTA spécifique au chargeur de démarrage, consultez Prise en charge des mises à jour OTA .

  • Liaison de version . La liaison de version lie les clés de sécurité à la version du système d’exploitation et du correctif. La liaison de version garantit qu'un attaquant qui découvre une faiblesse dans une ancienne version du système ou du logiciel TEE ne peut pas restaurer un appareil vers la version vulnérable et utiliser les clés créées avec la version la plus récente. Le chargeur de démarrage doit fournir certaines informations pour prendre en charge la liaison de version. Pour plus d'informations, 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 périphériques : à partir du nœud chosen/bootargs

  • defconfig : depuis CONFIG_CMDLINE

  • boot.img : depuis la ligne de commande (pour les décalages et la taille, reportez-vous à system/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.