DTB-Images

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 an mkbootimg übergeben wird, um boot.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 Felder id, rev und custom) 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.