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ätestatus und ist für die Initialisierung der vertrauenswürdigen Ausführungsumgebung (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 an den Kernel übergeben wird.
Beispiel für Bootloader-Ablauf
Hier ist ein Beispiel für einen Bootloader-Ablauf:
Arbeitsspeicher laden und initialisieren.
Bestätigen Sie das Gerät gemäß dem Ablauf für den verifizierten Bootmodus.
Prüfen Sie die Bootpartitionen, einschließlich
boot
,dtbo
,init_boot
undrecovery
, gemäß dem Ablauf des verifizierten Bootmodus. Prüfen Sie in diesem Schritt die Version des Boot-Image-Headers und parsen Sie den Header entsprechend.Wenn A/B-Updates verwendet werden, muss der aktuelle Slot für den Bootvorgang ermittelt werden.
Ermittelt, ob der Wiederherstellungsmodus gestartet werden soll. Weitere Informationen finden Sie unter OTA-Updates unterstützen.
Laden Sie die Boot-Images, z. B.
boot.img
,vendor_boot.img
,init_boot.img
und andere proprietäre Vendor-Boot-Images. Diese Boot-Images enthalten die Kernel- und Ramdisk-Images.Laden Sie den Kernel als selbstausfühbares komprimiertes Binärprogramm in den Arbeitsspeicher. Der Kernel wird dekomprimiert und beginnt mit der Ausführung im Arbeitsspeicher.
Laden Sie Ramdisks und den Abschnitt mit der Startkonfiguration in den Arbeitsspeicher, um
initramfs
zu erstellen.
Zusätzliche Bootloader-bezogene Funktionen
Im Folgenden finden Sie eine Liste mit zusätzlichen Bootloader-bezogenen Funktionen, 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 Auswahl der virtuellen Adresse des Kernel-Images: Der Bootloader unterstützt die Randomisierung der virtuellen Adresse, unter der das Kernel-Image geladen wird. Um die Adresse zu randomisieren, legen Sie in der Kernelkonfiguration
RANDOMIZE_BASE
auftrue
fest. Der Bootloader muss Entropie bereitstellen, indem er einen zufälligen u64-Wert im Gerätebaumknoten/chosen/kaslr-seed
übergibt.Verifizierter Bootmodus Mit Verified Boot kann der Bootloader sicherstellen, dass der gesamte ausgeführte Code von einer vertrauenswürdigen Quelle stammt.
Boot-Konfiguration Die Bootkonfiguration ist in Android 12 und höher verfügbar und dient dazu, Konfigurationsdetails vom Build und Bootloader an das Betriebssystem zu übergeben. Vor Android 12 werden Kernelbefehlszeilenparameter 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 die Implementierung des Bootloaders. Allgemeine Informationen zu OTA finden Sie unter OTA-Updates. Weitere Informationen zur bootloader-spezifischen OTA-Implementierung finden Sie unter OTA-Updates unterstützen.
Versionsbindung: Bei der Versionsbindung werden Sicherheitsschlüssel an die Betriebssystem- und Patchebeneversion gebunden. Durch die Versionsbindung wird 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 den mit der neueren Version erstellten Schlüsseln verwenden kann. Der Bootloader muss bestimmte Informationen zur Unterstützung der Versionsbindung bereitstellen. Weitere Informationen finden Sie unter Versionsinformationen in AVB-Eigenschaften.
Kernel-Befehlszeile
Verketten Sie die Kernel-Befehlszeile aus den folgenden Quellen:
Bootloader-Befehlszeile: Eine Reihe von statischen und dynamischen Parametern, die vom Bootloader festgelegt werden
Gerätebaum: ab dem Knoten
chosen/bootargs
defconfig
: abCONFIG_CMDLINE
boot.img
: über die Befehlszeile (Informationen zu Offsets und Größen finden Sie untersystem/core/mkbootimg/bootimg.h
)
Ab Android 12 können wir für androidboot.*
-Parameter, die wir an den Android-Nutzerbereich übergeben müssen, anstelle der Kernelbefehlszeile bootconfig verwenden.