Bootloader-Übersicht

Ein Bootloader ist ein herstellereigenes Image, das für das Hochfahren des Kernels auf einem Gerät verantwortlich ist. Der Bootloader überwacht den Gerätestatus und ist für die Initialisierung der Trusted Execution Environment (TEE) und die Bindung ihres Root of Trust verantwortlich. Der Bootloader überprüft außerdem die Integrität der boot und recovery , bevor er die Ausführung in den Kernel verlagert.

Beispiel für einen Bootloader-Ablauf

Hier ist ein Beispiel für einen Bootloader-Ablauf:

  1. Speicher laden und initialisieren.

  2. Überprüfen Sie das Gerät gemäß dem Verified Boot Flow .

  3. Überprüfen Sie die Startpartitionen, einschließlich boot , dtbo , init_boot und recovery , gemäß dem Verified Boot-Ablauf. Überprüfen Sie im Rahmen dieses Schritts die Version des Boot-Image-Headers und analysieren Sie den Header entsprechend.

  4. Wenn A/B-Updates verwendet werden, ermitteln Sie den aktuellen Slot zum Booten.

  5. Bestimmen Sie, ob der Wiederherstellungsmodus gestartet werden soll. Weitere Informationen finden Sie unter Unterstützen von OTA-Updates .

  6. Laden Sie die Boot-Images, z. boot.img , vendor_boot.img , init_boot.img und andere proprietäre Boot-Images von Anbietern. Diese Boot-Images enthalten die Kernel- und Ramdisk-Images.

    1. Laden Sie den Kernel als selbstausführbare komprimierte Binärdatei in den Speicher. Der Kernel dekomprimiert sich selbst und beginnt mit der Ausführung im Speicher.

    2. Laden Sie Ramdisks und den Bootconfig-Abschnitt in den Speicher, um initramfs zu erstellen.

Zusätzliche Bootloader-bezogene Funktionen

Im Folgenden finden Sie eine Liste zusätzlicher Bootloader-bezogener Funktionen, die Sie implementieren können:

  • Gerätebaum-Overlay (DTO). Ein Gerätebaum-Overlay ermöglicht es dem Bootloader, verschiedene Hardwarekonfigurationen zu unterstützen. Ein DTO wird in einen Device Tree Blob (DTB) kompiliert, der vom Bootloader verwendet wird.

  • Randomisierung virtueller Kernel-Image-Adressen. Der Bootloader unterstützt die Zufallsauswahl der virtuellen Adresse, an der das Kernel-Image geladen wird. Um die Adresse zufällig zu sortieren, setzen Sie RANDOMIZE_BASE in der Kernel-Konfiguration auf true . Der Bootloader muss Entropie bereitstellen, indem er einen zufälligen u64-Wert im Gerätebaumknoten /chosen/kaslr-seed übergibt.

  • Verifizierter Start. Mit Verified Boot kann der Bootloader sicherstellen, dass der gesamte ausgeführte Code von einer vertrauenswürdigen Quelle stammt.

  • Boot-Konfiguration. Die Boot-Konfiguration ist in Android 12 und höher verfügbar und ist ein Mechanismus zum Übergeben von Konfigurationsdetails vom Build und Bootloader an das Betriebssystem. Vor Android 12 werden Kernel-Befehlszeilenparameter mit dem Präfix androidboot verwendet.

  • Over-the-Air-Updates (OTA). Android-Geräte im Feld können OTA-Updates für das System, die App-Software und die Zeitzonenregeln empfangen und installieren. Diese Funktion hat Auswirkungen auf Ihre Bootloader-Implementierung. Allgemeine Informationen zu OTA finden Sie unter OTA-Updates . Details zur Bootloader-spezifischen OTA-Implementierung finden Sie unter Unterstützen von OTA-Updates .

  • Versionsbindung . Die Versionsbindung bindet Sicherheitsschlüssel an das Betriebssystem und die Patch-Level-Version. Durch die Versionsbindung wird sichergestellt, dass ein Angreifer, der eine Schwachstelle in einer alten Version des Systems oder der TEE-Software entdeckt, ein Gerät nicht auf die anfällige Version zurücksetzen und mit der neueren Version erstellte Schlüssel verwenden kann. Der Bootloader muss bestimmte Informationen bereitstellen, um die Versionsbindung zu unterstützen. Weitere Informationen finden Sie unter Versionsinformationen in den AVB-Eigenschaften .

Kernel-Befehlszeile

Verketten Sie die Kernel-Befehlszeile von den folgenden Orten:

  • Bootloader-Befehlszeile: Satz statischer und dynamischer Parameter, die vom Bootloader bestimmt werden

  • Gerätebaum: vom Knoten chosen/bootargs

  • defconfig : aus CONFIG_CMDLINE

  • boot.img : über die Befehlszeile (Informationen zu Offsets und Größe finden Sie unter system/core/mkbootimg/bootimg.h

Ab Android 12 können wir für androidboot.* Parameter, die wir an den Android-Userspace übergeben müssen, bootconfig anstelle der Kernel-Befehlszeile verwenden.