Bootloader – Übersicht

Ein Bootloader ist ein proprietäres Image des Anbieters, das für das Starten des Kernels auf einem Gerät verantwortlich ist. Der Bootloader schützt den Gerätezustand und ist verantwortlich für die Initialisierung der vertrauenswürdigen Ausführungsumgebung (Trusted Execution Environment, TEE) und die Bindung des Root of Trust. 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-Ablauf

Hier ein Beispiel für einen Bootloader-Ablauf:

  1. Arbeitsspeicher laden und initialisieren.

  2. Gerät gemäß dem Ablauf für den Bootmodus mit Verifikation überprüfen.

  3. Bootpartitionen, einschließlich boot, dtbo, init_boot und recovery, gemäß dem Ablauf für den Bootmodus mit Verifikation überprüfen. 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, bestimmen Sie den aktuellen Slot für den Start.

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

  6. Boot-Images wie boot.img, vendor_boot.img, init_boot.img und andere proprietäre Boot-Images des Anbieters laden. Diese Boot-Images enthalten die Kernel- und Ramdisk-Images.

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

    2. Ramdisks und den Abschnitt mit der Startkonfiguration in den Arbeitsspeicher laden, um initramfs zu erstellen.

Zusätzliche Funktionen im Zusammenhang mit dem Bootloader

Im Folgenden finden Sie eine Liste mit zusätzlichen Funktionen im Zusammenhang mit dem Bootloader, die Sie implementieren können:

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

  • Zufällige virtuelle Adresse des Kernel-Image Der Bootloader unterstützt die zufällige Auswahl der virtuellen Adresse, unter der das Kernel-Image geladen wird. Um die Adresse zufällig auszuwählen, legen Sie in der Kernel-Konfiguration RANDOMIZE_BASE auf true fest. Der Bootloader muss Entropie bereitstellen, indem er einen zufälligen u64-Wert im Gerätebaumknoten /chosen/kaslr-seed übergibt.

  • Bootmodus mit Verifikation Bootmodus mit Verifikation ermöglicht dem Bootloader sicherzustellen, dass der gesamte ausgeführte Code von einer vertrauenswürdigen Quelle stammt.

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

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

  • Versionsbindung Bei der Versionsbindung werden Sicherheitsschlüssel an die Version des Betriebssystems und der Patchebene gebunden. Die Versionsbindung verhindert, dass ein Angreifer, der eine Schwachstelle in einer alten Version des Systems oder der TEE-Software entdeckt, ein Gerät 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 AVB-Properties.

Kernel-Befehlszeile

Verketten Sie die Kernel-Befehlszeile aus den folgenden Quellen:

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

  • Gerätebaum: aus dem Knoten chosen/bootargs

  • defconfig: aus CONFIG_CMDLINE

  • boot.img: aus der Befehlszeile (Offsets und Größen 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 die Startkonfiguration verwenden.