Android-Implementierungen können ein DTB-Image (Device Tree Blob) für den Bootloader enthalten. Der Speicherort des DTB-Images (und die Optionen zum Angeben von DTB-Imageparametern) unterscheiden sich zwischen den Android-Releases.
Unter Android 11 müssen Geräte, die das Generic Kernel Image (GKI) verwenden, die Boot-Partition des Anbieters unterstützen. Diese enthält alle anbieterspezifischen Informationen, die aus der Boot-Partition verschoben wurden. Da das DTB-Image anbieterspezifische Daten enthält, ist es jetzt Teil der Boot-Partition des Anbieters. Informationen zum Angeben von DTB-Image-Parametern finden Sie unter Vendor-Boot-Header.
Unter Android 10 können Geräte das DTB-Image in der Bootpartition enthalten. Informationen zum Angeben von DTB-Image-Parametern finden Sie unter DTB-Image in das Boot-Image einbinden.
Unter Android 9 und niedriger kann das DTB-Image in einer eigenen Partition vorhanden sein oder an den Kernel
image.gz
angehängt werden, um das Kernel- und DTB-Image zu erstellen, das dann anmkbootimg
übergeben wird, umboot.img
zu erstellen.
DTB-Bildformat
Unter Android 10 und höher muss das DTB-Image eines der folgenden Formate verwenden:
Nacheinander konkatenierte DT-Blobs. Der Bootloader verwendet das Feld
totalsize
in jeder FDT-Headerzeile, um den entsprechenden Blob zu lesen und zu parsen.DTB/DTBO-Partitionen Der Bootloader kann den richtigen DT-Blob effizient auswählen, indem er das
dt_table_entry
-Objekt (enthält die Felderid
,rev
undcustom
) untersucht, das Informationen zur Hardwareidentifikation für den Eintrag enthalten kann. Weitere Informationen finden Sie unter DTB/DTBO-Partitionen.
DTB-Image in das Boot-Image aufnehmen
Geräte mit Android 10 können das DTB-Image im Boot-Image enthalten. Dadurch muss Android keine Scripts mehr unterstützen, die das DTB-Image an image.gz
im Kernel anhängen. Außerdem kann die Vendor Test Suite (VTS) verwendet werden, um die Platzierung des DTB zu prüfen und zu standardisieren.
Außerdem ist es bei Geräten ohne A/B-Partition sicherer, das DTB als Teil des Wiederherstellungs-Images anstelle einer separaten Partition zu speichern, um Probleme durch unterbrochene OTAs zu vermeiden. Wenn während eines Over-the-air-Updates ein Problem auftritt, nachdem die DTB-Partition aktualisiert wurde, aber vor Abschluss des vollständigen Updates, versucht das Gerät, im Wiederherstellungsmodus zu starten, um das OTA-Update abzuschließen. Da die DTB-Partition jedoch bereits aktualisiert wurde, kann es zu einer Abweichung vom Wiederherstellungs-Image kommen, das noch nicht aktualisiert wurde. Wenn das DTB-Image Teil des Boot-Image-Formats ist, werden solche Probleme verhindert, da das Wiederherstellungs-Image autark ist, d. h., es ist nicht von einer anderen Partition abhängig.
Struktur des Boot-Images
Geräte mit Android 10 können ein DTB-Image mit der folgenden Boot-Image-Struktur enthalten.
Abschnitt „Boot-Image“ | Seitenzahl |
---|---|
Boot-Header (1 Seite) | 1 |
Kernel (l-Seiten) | l = (kernel_size + page_size –
1) / page_size |
Ramdisk (m Seiten) | m = (ramdisk_size + page_size –
1) / page_size |
Bootloader der zweiten Stufe (n Seiten) | n = (second_size + page_size – 1) ÷ page_size |
DTBO für die Wiederherstellung (ohne Seiten) | o = (recovery_dtbo_size + page_size –
1) / page_size |
DTB (p-Seiten) | p = (dtb_size + page_size – 1) ÷ page_size |
DTB-Image-Pfad
Bei Geräten mit Android 10 können Sie das mkbootimg.py
-Tool und die folgenden Argumente verwenden, um den Pfad zum DTB-Image anzugeben.
Argument | Beschreibung |
---|---|
dtb |
Pfad zum DTB-Image, das in den Boot-/Wiederherstellungs-Images enthalten sein soll. |
dtb_offset |
Wenn dem Argument base hinzugefügt, gibt die physische Ladeadresse für den endgültigen Gerätebaum an. Wenn das base -Argument beispielsweise 0x10000000 und das dtb_offset -Argument 0x01000000 ist, wird dtb_addr_field im Boot-Image-Header als 0x11000000 ausgefüllt. |
Mit der Variablen „board_config“ BOARD_PREBUILT_DTBIMAGE_DIR
muss der Pfad zum DTB-Image angegeben werden. Wenn sich im Verzeichnis BOARD_PREBUILT_DTBIMAGE_DIR
mehr als eine Datei mit der Erweiterung *.dtb
befindet, werden die Dateien vom Android-Build-System zusammengeführt, um das endgültige DTB-Image zu erstellen, das beim Erstellen des Boot-Images verwendet wird.
Wenn Sie das Argument dtb
mit dem DTB-Image aus dem von BOARD_PREBUILT_DTBIMAGE_DIR
angegebenen Verzeichnis an mkbootimg.py
übergeben möchten, muss die Variable für die Boardkonfiguration BOARD_INCLUDE_DTB_IN_BOOTIMG
auf true
gesetzt sein. Beispiel:
BOARD_INCLUDE_DTB_IN_BOOTIMG := true
Sie können das Argument dtb_offset
der Konfigurationsvariablen BOARD_MKBOOTIMG_ARGS
für das Steuerfeld mit den anderen Offsets und der Kopfzeilenversion anhängen. Beispiel:
BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --dtb_offset $(BOARD_DTB_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
Bootloader-Unterstützung
Damit VTS auf Geräten mit Android 10 ausgeführt werden kann, muss der Bootloader das aktualisierte Boot-Image unterstützen und den Kernel-Befehlszeilenparameter androidboot.dtb_idx
hinzufügen, um den Index des ausgewählten Gerätebaums (DT) anzugeben. Sie können nur einen Index angeben. Der Parameter androidboot.dtb_idx=N
gibt beispielsweise N
als den nullbasierten Index des Gerätebaums an, der vom Bootloader aus den im Boot-Image vorhandenen DTBs ausgewählt wurde.