Zur Implementierung von Gerätebaum-Overlays (Device Tree Overlays, DTOs) gehören die Unterteilung, Erstellung, Partitionierung und Ausführung des Gerätebaums. Wenn deine Implementierung funktioniert, musst du außerdem für Kompatibilität zwischen den beiden Gerätebäumen sorgen und eine Strategie zur Gewährleistung der Sicherheit der einzelnen Partitionen der Gerätebäume entwickeln.
Gerätebaum unterteilen
Unterteile den Gerätebaum zuerst in zwei Teile:
- Haupt-Gerätebaum: der reine SoC-Teil und die Standardkonfigurationen, die vom SoC-Anbieter bereitgestellt werden
- Overlay-Gerätebaum: die gerätespezifischen Konfigurationen, die vom ODM/OEM bereitgestellt werden
Danach musst du für Kompatibilität zwischen beiden Gerätebäumen sorgen, damit durch die Zusammenführung der beiden Teile ein vollständiger Gerätebaum für das jeweilige Gerät entsteht. Weitere Informationen zum DTO-Format und den Regeln findest du unter DTO-Syntax. Informationen zur Nutzung mehrerer Gerätebäume sind unter Mehrere Gerätebäume verwenden zu finden.
Haupt- und Overlay-Gerätebaum erstellen
So wird der Haupt-Gerätebaum erstellt:
- Kompiliere die
.dts
-Datei des Haupt-Gerätebaums in eine.dtb
-Datei. - Flashe die
.dtb
-Datei in eine Partition, die für den Bootloader während der Laufzeit erreichbar ist (siehe [Gerätebäume partitionieren](#partition)).
So wird der Overlay-Gerätebaum erstellt:
- Kompiliere die
.dts
-Datei des Overlay-Gerätebaums in eine.dtbo
-Datei. Diese Datei hat zwar dasselbe Format wie die.dtb
-Datei des zusammengefassten Gerätebaums, aber durch die andere Dateiendung lässt sie sich vom Haupt-Gerätebaum unterscheiden. - Flashe die
.dtbo
-Datei in eine Partition, die für den Bootloader während der Laufzeit erreichbar ist (siehe [Gerätebäume partitionieren](#partition)).
Informationen zum Kompilieren mit DTC und Überprüfen der DTO-Ergebnisse auf dem Host findest du unter Kompilieren und überprüfen.
Gerätebäume partitionieren
Lege für .dtb
und .dtbo
in einem Flash-Speicher einen Speicherort fest, der für den Bootloader während der Laufzeit erreichbar ist und der vertrauenswürdig ist.
Beispiele für Speicherorte für den Haupt-Gerätebaum:
- Teil einer Boot-Partition, die an den Kernel (
image.gz
) angehängt wird - Separate Gerätebaum-Blobs (
.dtb
) in einer eigenen Partition (dtb
)
Beispiele für Speicherorte für den Overlay-Gerätebaum:
Abbildung 1: Lege die DTBO-Datei in einer speziellen Partition ab, zum Beispiel einer DTBO-Partition.
Abbildung 2: Lege die DTBO-Datei in einer ODM-Partition ab, sofern der Bootloader Daten aus dem Dateisystem einer ODM-Partition laden kann.
Hinweis: Die Größe der Partition für den Overlay-Gerätebaum hängt vom Gerät und der Anzahl der Änderungen ab, die an dem Blob des Haupt-Gerätebaums vorgenommen werden müssen. In der Regel reichen 8 MB aus und bieten genügend Spielraum für zukünftige Updates.
Für Geräte, die nahtlose A/B-Updates unterstützen, unterteile die Partitionen der Haupt- und Overlay-Gerätebäume entsprechend:
Abbildung 3: DTBO-Partition für A/B-Updates, Beispiel 1
Abbildung 4: DTBO-Partition für A/B-Updates, Beispiel 2
Im Bootloader ausführen
Gehe zum Ausführen so vor:
Abbildung 5: Typische Laufzeitimplementierung des Gerätebaum-Overlays im Bootloader
- Lade
.dtb
vom Speicherort in den Arbeitsspeicher. - Lade
.dtbo
vom Speicherort in den Arbeitsspeicher. - Erstelle für
.dtb
ein.dtbo
-Overlay, um diese in einem Gerätebaum zusammenzuführen. - Starte den Kernel mit der Adresse des Arbeitsspeichers, in dem sich der zusammengeführte Gerätebaum befindet.
Für Kompatibilität sorgen
Der Haupt-Gerätebaum-Blob (vom SoC-Anbieter) wird als API-Oberfläche für DTBOs verwendet. Nachdem der Gerätebaum in einen reinen SoC- und einen gerätespezifischen Teil unterteilt wurde, musst du dafür sorgen, dass diese beiden Teile auch in Zukunft in beispielsweise den folgenden Punkten kompatibel sind:
- Gerätebaumdefinition im Haupt-Gerätebaum: zum Beispiel Knoten, Eigenschaften und Labels. Jede Änderung an der Definition des Haupt-Gerätebaums könnte auch Änderungen des Overlay-Gerätebaums zur Folge haben. Wenn du beispielsweise den Namen eines Knoten im Haupt-Gerätebaum korrigieren möchtest, erstelle ein „Alias“-Label, das dem ursprünglichen Knotennamen zugewiesen wird (um eine Änderung des Overlay-Gerätebaums zu vermeiden).
- Speicherort des Overlay-Gerätebaums: zum Beispiel Name der Partition und Speicherformat
Sicherheitsstrategie entwickeln
Der Bootloader muss dafür sorgen, dass der Gerätebaum-Blob (Device Tree Blob, DTB) oder das Overlay des Gerätebaum-Blobs (Device Tree Blob Overlay, DTBO) sicher ist und weder verändert noch manipuliert wurde. Du kannst dafür eine beliebige Sicherheitsmethode verwenden, zum Beispiel eine Boot-Image-Signatur in VBoot 1.0 oder den AVB-Hash-Footer in VBoot 2.0.
- Wenn sich der DTB oder das DTBO in einer separaten Partition befindet, kannst du diese Partition der AVB-Vertrauenskette hinzufügen. Die Vertrauenskette beginnt am hardwaregeschützten Root of Trust und endet am Bootloader, der die Integrität und Authentizität der DTB- oder DTBO-Partition verifiziert.
- Wenn sich der DTB oder das DTBO in einer bestehenden Partition (zum Beispiel der
odm
-Partition) befindet, sollte diese in der AVB-Vertrauenskette enthalten sein. Die DTBO-Partition kann denselben öffentlichen Schlüssel wie dieodm
-Partition verwenden.
Weitere Informationen dazu findest du unter Bootmodus mit Verifikation.