Bootloader – Übersicht

Ein Bootloader ist ein vom Anbieter eigenes Image, das für das Starten des Kernels auf einem Gerät verantwortlich ist. Der Bootloader schützt den Gerätestatus und ist für die Initialisierung der Trusted Execution Environment (TEE) und die Bindung des Root of Trust verantwortlich. Der Bootloader prüft auch die Integrität der Partitionen boot und recovery, bevor die Ausführung in den Kernel verschoben wird.

Beispiel für einen Bootloader-Vorgang

Hier ein Beispiel für einen Bootloader-Vorgang:

  1. Arbeitsspeicher laden und initialisieren.

  2. Prüfen Sie, ob das Gerät gemäß dem Ablauf des verifizierten Bootmodus funktioniert.

  3. Prüfen Sie die Bootpartitionen, einschließlich boot, dtbo, init_boot und recovery, gemäß dem Ablauf für den verifizierten Bootmodus. Prüfen Sie in diesem Schritt die Version des Boot-Image-Headers und parsen Sie den Header entsprechend.

  4. Wenn A/B-Updates verwendet werden, wird der aktuell zu startende Slot ermittelt.

  5. Ermitteln, ob der Wiederherstellungsmodus gestartet werden soll Weitere Informationen finden Sie unter Unterstützung von Over-the-air-Updates.

  6. Laden Sie die Boot-Images wie 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 Arbeitsspeicher. Der Kernel dekomprimiert sich selbst und beginnt mit der Ausführung im Arbeitsspeicher.

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

Zusätzliche Funktionen für den Bootloader

Im Folgenden finden Sie eine Liste weiterer bootloaderbezogener Funktionen, die Sie implementieren können:

  • Device Tree Overlay (DTO) Mit einem Gerätebaum-Overlay kann der Bootloader unterschiedliche Hardwarekonfigurationen unterstützen. Ein DTO wird in einen Device Tree Blob (DTB) kompiliert, der vom Bootloader verwendet wird.

  • Zufallsgenerierung der virtuellen Adressen des Kernel-Images Der Bootloader unterstützt die Zufallsgenerierung der virtuellen Adresse, unter der das Kernel-Image geladen wird. Wenn Sie die Adresse zufällig generieren lassen möchten, setzen Sie in der Kernelkonfiguration RANDOMIZE_BASE auf true. Der Bootloader muss Entropie bereitstellen, indem er einen zufälligen u64-Wert an den Gerätebaumknoten /chosen/kaslr-seed übergibt.

  • Verifizierter Bootmodus Mit dem verifizierten Bootmodus kann der Bootloader dafür sorgen, dass der gesamte ausgeführte Code aus einer vertrauenswürdigen Quelle stammt.

  • Boot-Konfiguration. Die Boot-Konfiguration ist in Android 12 und höher verfügbar und dient dazu, Konfigurationsdetails vom Build und Bootloader an das Betriebssystem weiterzugeben. Vor Android 12 werden Kernel-Befehlszeilenparameter mit dem Präfix androidboot verwendet.

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

  • Versionsbindung Bei der Versionsbindung werden Sicherheitsschlüssel an das Betriebssystem und die Patch-Version gebunden. Die Versionsbindung sorgt dafür, 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 Schlüssel verwenden kann, die mit der neueren Version erstellt wurden. Der Bootloader muss bestimmte Informationen zur Unterstützung der Versionsbindung bereitstellen. Weitere Informationen finden Sie unter Versionsinformationen in AVB-Properties.

Kernel-Befehlszeile

Konkatenieren Sie die Kernel-Befehlszeile aus den folgenden Speicherorten:

  • Bootloader-Befehlszeile: Eine Reihe von statischen und dynamischen Parametern, die vom Bootloader festgelegt werden

  • Gerätebaum: über den Knoten chosen/bootargs

  • defconfig: von CONFIG_CMDLINE

  • boot.img: Über die Befehlszeile (Offset und Größe finden Sie unter system/core/mkbootimg/bootimg.h

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