Konfigurowanie funkcji jądra jako modułów GKI

Na tej stronie opisujemy, jak skonfigurować nową funkcję jądra jako moduł GKI lub skonfigurować istniejącą wbudowaną funkcję jądra jako moduł GKI.

Konfigurowanie nowej funkcji jako modułu GKI

  1. W przypadku nowej funkcji edytuj gki_defconfig i ustaw wymagany element konfiguracji funkcji jądra z n na m (=m). Ustaw to ustawienie w plikach arch/arm64/configs/gki_defconfig i arch/x86/configs/gki_defconfig.

  2. Dodaj pliki KO (.ko) wygenerowane dla funkcji do sekcji _COMMON_GKI_MODULES_LIST w tym pliku. Dodaj pliki w kolejności posortowanej. Jeśli nie masz pewności, które pliki zostały wygenerowane, kompilacja się nie powiedzie i wyświetli listę wszystkich plików KO, które należy dodać do listy.

    • W przypadku android17-6.18 i nowszych wersji dodaj elementy do common/bazel/modules_private.bzl.
    • W przypadku android16-6.12 i starszych wersji dodaj elementy do common/modules.bzl.
  3. W przypadku Androida 14 dodaj ten sam zestaw plików KO z kroku 2, posortowanych w kolejności rosnącej na potrzeby wyszukiwania binarnego w czasie działania, do common/android/gki_{ARCH}_protected_modules, aby oznaczyć moduł jako chroniony moduł GKI.

  4. W przypadku Androida 14 i 15 zaktualizuj listę eksportów, aby uwzględnić nowo dodane eksporty w common/android/abi_gki_protected_exports_ARCHITECTURE. Aby na przykład zaktualizować listę, uruchom tools/bazel run //common:kernel_aarch64_abi_update_protected_exports w przypadku aarch64.

  5. Upewnij się, że nowo dodane pliki KO z kroku 2 zostały skopiowane do plików out/<androidX-Y.Z>/dist/system_dlkm.img i out/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz jądra. Moduły w archiwum system_dlkm_staging_archive.tar.gz mogą być używane jako dane wejściowe do wygenerowania pliku system_dlkm.img w kompilacji platformy.

  6. Prześlij zmiany do sprawdzenia. Moduły GKI to funkcja jądra dostępna tylko w Androidzie, więc nie trzeba przesyłać poprawek konwersji modułów do upstream. Musisz jednak przestrzegać innych wytycznych dotyczących przesyłania poprawek do wspólnego jądra Androida (ACK).

Konfigurowanie wbudowanej funkcji jądra jako modułu GKI

  1. W przypadku istniejącej wbudowanej funkcji jądra edytuj gki_defconfig i ustaw wymagany element konfiguracji funkcji jądra z y na m (=m). Ustaw to ustawienie w plikach arch/arm64/configs/gki_defconfig i arch/x86/configs/gki_defconfig.

  2. Dodaj pliki KO (.ko) wygenerowane dla funkcji do sekcji _COMMON_GKI_MODULES_LIST w tym pliku. Dodaj pliki w kolejności posortowanej. Jeśli nie masz pewności, które pliki zostały wygenerowane, kompilacja się nie powiedzie i wyświetli listę wszystkich plików KO, które należy dodać do listy.

    • W przypadku android17-6.18 i nowszych wersji dodaj elementy do common/bazel/modules_private.bzl.
    • W przypadku android16-6.12 i starszych wersji dodaj elementy do `common/modules.bzl.
  3. W przypadku Androida 14 dodaj ten sam zestaw plików KO z kroku 2, posortowanych w kolejności rosnącej na potrzeby wyszukiwania binarnego w czasie działania, do common/android/gki_{ARCH}_protected_modules, aby oznaczyć moduł jako chroniony moduł GKI.

  4. W przypadku Androida 14 i 15 zaktualizuj listę chronionych eksportów, aby uwzględnić eksporty z nowo dodanego modułu w common/android/abi_gki_protected_exports_{ARCH} za pomocą tools/bazel run //common:kernel_aarch64_abi_update_protected_exports w przypadku aarch64.

  5. Upewnij się, że nowo przekonwertowane pliki KO modułu z kroku 2 zostały skopiowane do jądra out/<androidX-Y.Z>/dist/system_dlkm.img i out/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz. Moduły w archiwum system_dlkm_staging_archive.tar.gz mogą być używane jako dane wejściowe do wygenerowania pliku system_dlkm.img w kompilacji platformy.

  6. Prześlij zmiany do sprawdzenia. Moduły GKI to funkcja jądra dostępna tylko w Androidzie, więc nie trzeba przesyłać poprawek konwersji modułów do upstream. Musisz jednak przestrzegać innych wytycznych dotyczących przesyłania poprawek do wspólnego jądra Androida (ACK).

Konwertowanie chronionego modułu GKI na niechroniony

  1. W przypadku Androida 15 i nowszych wersji dodaj moduł konwertowany z chronionego na niechroniony do listy _COMMON_UNPROTECTED_MODULES_LIST w tym pliku:

    • W przypadku android17-6.18 i nowszych wersji dodaj elementy do common/bazel/modules_private.bzl.
    • W przypadku android16-6.12 i starszych wersji dodaj elementy do common/modules.bzl.
  2. W przypadku Androida 14 usuń moduł konwertowany z chronionego na niechroniony z listy chronionych modułów w common/android/gki_protected_modules.

  3. W przypadku Androida 14 i 15 zaktualizuj listę chronionych eksportów, aby wykluczyć eksporty z nowo przekonwertowanego niechronionego modułu w common/android/abi_gki_protected_exports_{ARCH} za pomocą tools/bazel run //common:kernel_aarch64_abi_update_protected_exports w przypadku aarch64.

  4. Prześlij zmiany do sprawdzenia. Moduły GKI to funkcja jądra dostępna tylko w Androidzie, więc nie trzeba przesyłać poprawek konwersji modułów do upstream. Musisz jednak przestrzegać innych wytycznych dotyczących przesyłania poprawek do wspólnego jądra Androida (ACK).

Krótki przewodnik po rozwiązywaniu problemów z naruszeniem symboli modułów GKI

Gdy niepodpisane moduły naruszają ochronę symboli w modułach GKI, podczas wczytywania modułu mogą wystąpić 2 rodzaje błędów, które powodują niepowodzenie.

1. Niepodpisany moduł używający chronionego symbolu

Błąd:

module: Protected symbol: some_kernel_function (err -13)

Przyczyna:

Plik module.ko jest niepodpisanym modułem dostawcy i podczas wczytywania próbuje rozpoznać symbol eksportowany przez moduł GKI some_kernel_function, ale nie znajduje się na liście symboli dostawcy.

Rozwiązanie:

Jeśli module.ko nie jest chronionym modułem GKI, zaktualizowanie listy symboli rozwiąże błąd, ponieważ symbol some_kernel_function zostanie uwzględniony na liście symboli dostawcy. Możesz też użyć wersji GKI pliku module.ko.

2. Niepodpisany moduł eksportujący chroniony symbol

Błąd:

module: exports protected symbol some_kernel_function

Przyczyna:

Moduł eksportujący some_kernel_function jest chronionym modułem GKI, a module.ko jest prawdopodobnie niepodpisaną wersją niestandardową tego modułu. Gdy module.ko próbuje wyeksportować some_kernel_function, który może być eksportowany tylko przez podpisany moduł GKI, wczytywanie kończy się niepowodzeniem i wyświetla ten komunikat.

Rozwiązanie:

Jeśli niepodpisany moduł jest wersją niestandardową, można to naprawić, używając wersji GKI modułu, który eksportuje some_kernel_function.