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:
Arbeitsspeicher laden und initialisieren.
Gerät gemäß dem Ablauf für den Bootmodus mit Verifikation überprüfen.
Bootpartitionen, einschließlich
boot,dtbo,init_bootundrecovery, 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.Wenn A/B-Updates verwendet werden, bestimmen Sie den aktuellen Slot für den Start.
Bestimmen Sie, ob der Wiederherstellungsmodus gestartet werden soll. Weitere Informationen finden Sie unter OTA-Updates unterstützen.
Boot-Images wie
boot.img,vendor_boot.img,init_boot.imgund andere proprietäre Boot-Images des Anbieters laden. Diese Boot-Images enthalten die Kernel- und Ramdisk-Images.Kernel als selbstausführbare komprimierte Binärdatei in den Arbeitsspeicher laden. Der Kernel dekomprimiert sich selbst und beginnt mit der Ausführung im Arbeitsspeicher.
Ramdisks und den Abschnitt mit der Startkonfiguration in den Arbeitsspeicher laden, um
initramfszu 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_BASEauftruefest. 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
androidbootverwendet.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/bootargsdefconfig: ausCONFIG_CMDLINEboot.img: aus der Befehlszeile (Offsets und Größen finden Sie untersystem/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.