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 überprüft auch die Integrität der Partitionen boot und recovery, bevor die Ausführung an den Kernel übergeben wird.

Beispiel für einen Bootloader-Vorgang

Hier ein Beispiel für einen Bootloader-Vorgang:

  1. Arbeitsspeicher laden und initialisieren.

  2. Prüfen Sie das Gerät gemäß der Anleitung für den bestätigten Bootmodus.

  3. Prüfen Sie die Bootpartitionen, einschließlich boot, dtbo, init_boot und recovery, gemäß dem Ablauf für den bestätigten 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, ermitteln Sie den aktuellen Boot-Speicherplatz.

  5. Legen Sie fest, 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ührbares komprimiertes Binärprogramm 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:

  • Gerätebaum-Overlay (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 Patchebene 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-Userspace übergeben werden müssen, anstelle der Kernel-Befehlszeile bootconfig verwenden.