Kernelfunktionen als GKI-Module konfigurieren

Auf dieser Seite wird beschrieben, wie Sie ein neues Kernelfeature als GKI-Modul oder ein vorhandenes integriertes Kernelfeature 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 des erforderlichen Kernel-Features 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 der folgenden Datei hinzu. Fügen Sie die Dateien in sortierter Reihenfolge hinzu. Wenn Sie sich nicht sicher sind, welche Dateien generiert werden, schlägt der Build fehl und es wird eine Liste mit allen erforderlichen KO-Dateien angezeigt, die der Liste hinzugefügt werden müssen.

    • Fügen Sie in android17-6.18 und höher Elemente zu common/bazel/modules_private.bzl hinzu.
    • Fügen Sie in android16-6.12 und niedriger Elemente zu common/modules.bzl hinzu.
  3. Fügen Sie für Android 14 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.

  4. Aktualisieren Sie für Android 14 und 15 die Liste der Exporte, damit sie die neu hinzugefügten Exporte in common/android/abi_gki_protected_exports_ARCHITECTURE enthält. Wenn Sie beispielsweise die Liste für aarch64 aktualisieren möchten, führen Sie tools/bazel run //common:kernel_aarch64_abi_update_protected_exports aus.

  5. Achten Sie darauf, dass die neu hinzugefügten 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 Archiv system_dlkm_staging_archive.tar.gz können als Eingabe verwendet werden, um system_dlkm.img im Plattform-Build zu generieren.

  6. Reichen Sie Ihre Änderungen zur Überprüfung ein. GKI-Module sind eine Kernel-Funktion, die nur für Android verfügbar ist. Daher müssen keine Patches zur Modulkonvertierung upstream eingereicht werden. Für das Einreichen von ACK-Patches (Android Common Kernel) müssen Sie jedoch andere Richtlinien beachten.

In den Kernel integrierte Funktion als GKI-Modul konfigurieren

  1. Bearbeiten Sie für ein vorhandenes integriertes Kernelfeature gki_defconfig und legen Sie das Konfigurationselement des erforderlichen Kernelfeatures von y 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 der folgenden Datei hinzu. Fügen Sie die Dateien in sortierter Reihenfolge hinzu. Wenn Sie sich nicht sicher sind, welche Dateien generiert werden, schlägt der Build fehl und es wird eine Liste mit allen erforderlichen KO-Dateien angezeigt, die der Liste hinzugefügt werden müssen.

    • Fügen Sie in android17-6.18 und höher Elemente zu common/bazel/modules_private.bzl hinzu.
    • Fügen Sie in android16-6.12 und niedriger Elemente zu `common/modules.bzl` hinzu.
  3. Fügen Sie für Android 14 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.

  4. Aktualisieren Sie für Android 14 und 15 die Liste der geschützten Exporte, um die Exporte aus dem neu hinzugefügten Modul in common/android/abi_gki_protected_exports_{ARCH} mit tools/bazel run //common:kernel_aarch64_abi_update_protected_exports für aarch64 einzuschließen.

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

  6. Reichen Sie Ihre Änderungen zur Überprüfung ein. GKI-Module sind eine Kernel-Funktion, die nur für Android verfügbar ist. Daher müssen keine Patches zur Modulkonvertierung upstream eingereicht werden. Sie müssen jedoch die anderen Richtlinien befolgen, um ACK-Patches (Android Common Kernel) einzureichen.

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

  1. Fügen Sie bei Android 15 und höher das Modul, das von „geschützt“ in „nicht geschützt“ konvertiert wird, der Liste _COMMON_UNPROTECTED_MODULES_LIST in der folgenden Datei hinzu:

    • Fügen Sie in android17-6.18 und höher Elemente zu common/bazel/modules_private.bzl hinzu.
    • Fügen Sie in android16-6.12 und niedriger Elemente zu common/modules.bzl hinzu.
  2. Entfernen Sie für Android 14 das Modul, das von „geschützt“ in „ungeschützt“ konvertiert wird, aus der Liste der geschützten Module unter common/android/gki_protected_modules.

  3. Aktualisieren Sie für Android 14 und 15 die Liste der geschützten Exporte, um Exporte aus dem neu konvertierten ungeschützten Modul in common/android/abi_gki_protected_exports_{ARCH} mit tools/bazel run //common:kernel_aarch64_abi_update_protected_exports für aarch64 auszuschließen.

  4. Reichen Sie Ihre Änderungen zur Überprüfung ein. GKI-Module sind eine Kernel-Funktion, die nur für Android verfügbar ist. Daher müssen keine Patches zur Modulkonvertierung upstream eingereicht werden. Sie müssen jedoch die anderen Richtlinien befolgen, um ACK-Patches (Android Common Kernel) einzureichen.

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

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

1. Nicht signiertes 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 exportierte GKI-Modulsymbol 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 Anbieter-Symbolliste aufgenommen wird. Alternativ können Sie die GKI-Version von module.ko verwenden.

2. Nicht signiertes 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 unsignierte 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:

Dies kann korrigiert werden, indem die GKI-Version des Moduls verwendet wird, das some_kernel_function exportiert, wenn das nicht signierte Modul eine benutzerdefinierte Version ist.