Kernel-Features als GKI-Module konfigurieren

Auf dieser Seite wird beschrieben, wie Sie eine neue Kernelfunktion als GKI-Modul oder eine vorhandene integrierte Kernelfunktion als GKI-Modul konfigurieren.

Neue Funktion als GKI-Modul konfigurieren

  1. Bearbeiten Sie für die neue Funktion gki_defconfig und legen Sie das Konfigurationselement der erforderlichen Kernelfunktion von n auf m (=m) fest. Legen Sie diese Einstellung sowohl in arch/arm64/configs/gki_defconfig als auch in arch/x86/configs/gki_defconfig fest.

  2. Fügen Sie die für die Funktion generierten KO-Dateien (.ko) dem Abschnitt COMMON_GKI_MODULES_LIST von common/modules.bzl hinzu. Fügen Sie die Dateien in sortierter Reihenfolge hinzu. Wenn Sie sich nicht sicher sind, ob alle generierten Dateien vorhanden sind, schlägt der Build fehl und alle erforderlichen KO-Dateien werden aufgelistet, die der Liste hinzugefügt werden müssen.

  3. Fügen Sie dieselben KO-Dateien aus Schritt 2, sortiert in aufsteigender Reihenfolge für die binäre Suche zur Laufzeit, zu common/android/gki_{ARCH}_protected_modules hinzu, um das Modul als geschütztes GKI-Modul zu kennzeichnen. Aktualisieren Sie die Liste der geschützten Exporte, um die Exporte aus dem neu hinzugefügten Modul in die common/android/abi_gki_protected_exports_{ARCH} aufzunehmen. Verwenden Sie dazu tools/bazel run //common:kernel_aarch64_abi_update_protected_exports anstelle von aarch64. Module, die als geschützte GKI-Module gekennzeichnet sind, müssen von Google als offizielle geschützte Module genehmigt werden.

  4. Achten Sie darauf, dass neu hinzugefügte KO-Dateien aus Schritt 2 in die out/<androidX-Y.Z>/dist/system_dlkm.img und out/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz des Kernels kopiert werden. Module im system_dlkm_staging_archive.tar.gz-Archiv können als Eingabe verwendet werden, um die system_dlkm.img im Plattformbuild zu generieren.

  5. Reichen Sie Ihre Änderungen zur Überprüfung ein. GKI-Module sind eine nur für Android verfügbare Kernelfunktion. Daher müssen keine Patches zur Modulkonvertierung gesendet werden. Für das Einreichen von Android Common Kernel (ACK)-Patches gelten jedoch andere Richtlinien.

Eine integrierte Kernelfunktion als GKI-Modul konfigurieren

  1. Bearbeiten Sie für eine vorhandene integrierte Kernelfunktion gki_defconfig und ändern Sie das Konfigurationselement der erforderlichen Kernelfunktion von y in m (=m). Legen Sie diese Einstellung sowohl in arch/arm64/configs/gki_defconfig als auch in arch/x86/configs/gki_defconfig fest.

  2. Fügen Sie die für die Funktion generierten KO-Dateien (.ko) dem Abschnitt COMMON_GKI_MODULES_LIST von common/modules.bzl hinzu. Fügen Sie die Dateien in sortierter Reihenfolge hinzu. Wenn Sie sich nicht sicher sind, ob alle generierten Dateien vorhanden sind, schlägt der Build fehl und alle erforderlichen KO-Dateien werden aufgelistet, die der Liste hinzugefügt werden müssen.

  3. Fügen Sie den gleichen Satz von KO-Dateien aus Schritt 2, sortiert in aufsteigender Reihenfolge für die binäre Suche zur Laufzeit, zu common/android/gki_{ARCH}_protected_modules hinzu, um das Modul als geschütztes GKI-Modul zu kennzeichnen. Aktualisieren Sie die Liste der geschützten Exporte um Exporte aus dem neu hinzugefügten Modul in common/android/abi_gki_protected_exports_{ARCH}. Verwenden Sie dazu tools/bazel run //common:kernel_aarch64_abi_update_protected_exports für aarch64. Als geschützte GKI-Module gekennzeichnete Module müssen weiterhin von Google genehmigt werden, um offizielle geschützte Module zu sein.

  4. Achten Sie darauf, dass neu konvertierte Modul-KO-Dateien aus Schritt 2 in die out/<androidX-Y.Z>/dist/system_dlkm.img und out/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz des Kernels kopiert werden. Module im system_dlkm_staging_archive.tar.gz-Archiv können als Eingabe verwendet werden, um die system_dlkm.img im Plattformbuild zu generieren.

  5. Reichen Sie Ihre Änderungen zur Überprüfung ein. GKI-Module sind eine nur für Android verfügbare Kernelfunktion. Daher müssen keine Patches zur Modulkonvertierung gesendet werden. Sie müssen jedoch die anderen Richtlinien einhalten, um Android Common Kernel (ACK)-Patches einzureichen.

Geschütztes GKI-Modul in ein ungeschütztes Modul umwandeln

  1. Entfernen Sie das Modul, das von geschützt zu ungeschützt konvertiert werden soll, aus der Liste der geschützten Module unter common/android/gki_protected_modules.

  2. Aktualisieren Sie die Liste der geschützten Exporte, um die Exporte des neu konvertierten ungeschützten Moduls in common/android/abi_gki_protected_exports_{ARCH} auszuschließen. Verwenden Sie dazu tools/bazel run //common:kernel_aarch64_abi_update_protected_exports anstelle von aarch64.

  3. Reichen Sie Ihre Änderungen zur Überprüfung ein. GKI-Module sind eine nur für Android verfügbare Kernelfunktion. Daher müssen keine Patches zur Modulkonvertierung gesendet werden. Sie müssen sich jedoch an die anderen Richtlinien halten, wenn Sie ACK-Patches für Android Common Kernel (ACK) senden.

Kurzanleitung zur Behebung von Symbolverstößen bei GKI-Modulen

Wenn unsignierte Module gegen den für GKI-Module geltenden Symbolschutz verstoßen, können beim Laden des Moduls zwei Arten von Fehlern auftreten, die zu einem Fehler führen.

1. Unsigniertes Modul mit dem geschützten Symbol

Fehler:

module: Protected symbol: some_kernel_function (err -13)

Ursache:

Die Datei module.ko ist ein nicht signiertes Anbietermodul und versucht, das aus dem GKI-Modul exportierte Symbol some_kernel_function beim Laden aufzulösen, ohne in der Anbietersymbolliste aufgeführt zu sein.

Lösung:

Wenn module.ko kein geschütztes GKI-Modul ist, wird der Fehler durch Aktualisieren der Symbolliste behoben, indem some_kernel_function in die Symbolliste des Anbieters aufgenommen wird. Alternativ können Sie die GKI-Version von module.ko verwenden.

2. Unsigniertes Modul, das das geschützte Symbol exportiert

Fehler:

module: exports protected symbol some_kernel_function

Ursache:

Das Modul, das some_kernel_function exportiert, ist ein geschütztes GKI-Modul und module.ko ist wahrscheinlich eine signaturlose benutzerdefinierte Version dieses Moduls. Wenn module.ko versucht, some_kernel_function zu exportieren, das nur von einem signierten GKI-Modul exportiert werden kann, schlägt das Laden mit dieser Meldung fehl.

Lösung:

Wenn das signaturlose Modul eine benutzerdefinierte Version ist, kann das Problem durch Verwendung der GKI-Version des Moduls behoben werden, das some_kernel_function exportiert.