Konfigurowanie funkcji jądra jako modułów GKI

Na tej stronie znajdziesz informacje o konfigurowaniu nowej funkcji jądra jako modułu GKI lub konfigurowaniu dotychczasowej wbudowanej funkcji jądra jako modułu 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 obu plikach arch/arm64/configs/gki_defconfigarch/x86/configs/gki_defconfig.

  2. Dodaj wygenerowane w przypadku funkcji pliki KO (.ko) do sekcji COMMON_GKI_MODULES_LIST w pliku common/modules.bzl. Dodaj pliki w posortowanej kolejności. Jeśli nie masz pewności, czy wszystkie wygenerowane pliki są prawidłowe, kompilacja zakończy się niepowodzeniem i wyświetli listę wszystkich niezbędnych plików KO.

  3. W przypadku Androida 14 dodaj ten sam zestaw plików KO z kroku 2, posortowany w rosnącej kolejności, aby umożliwić wyszukiwanie binarne w czasie wykonywania. Użyj do tego pliku common/android/gki_{ARCH}_protected_modules, aby oznaczyć moduł jako chroniony moduł GKI.

  4. W przypadku Androida 14–16 zaktualizuj listę eksportów, aby zawierała nowo dodane eksporty w pliku common/android/abi_gki_protected_exports_ARCHITECTURE. Aby na przykład zaktualizować listę, uruchom polecenie tools/bazel run //common:kernel_aarch64_abi_update_protected_exports zamiast aarch64.

  5. Upewnij się, że nowo dodane pliki KO z etapu 2 zostały skopiowane do właściwości out/<androidX-Y.Z>/dist/system_dlkm.imgout/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz jądra. Moduły z archiwum system_dlkm_staging_archive.tar.gz mogą służyć jako dane wejściowe do generowania system_dlkm.img w kompilacji platformy.

  6. Prześlij zmiany do sprawdzenia. Moduł GKI to funkcja jądra dostępna tylko na Androidzie, więc nie trzeba przesyłać poprawek do konwersji modułów. Aby jednak przesłać poprawki Android Common Kernel (ACK), musisz przestrzegać innych wytycznych.

Konfigurowanie funkcji wbudowanej w jądro jako modułu GKI

  1. W przypadku istniejącej wbudowanej funkcji jądra zmodyfikuj element konfiguracji gki_defconfig i ustaw wartość elementu konfiguracji wymaganej funkcji jądra z y na m (=m). Ustaw to ustawienie w elementach arch/arm64/configs/gki_defconfigarch/x86/configs/gki_defconfig.

  2. Dodaj wygenerowane dla funkcji pliki KO (.ko) do sekcji COMMON_GKI_MODULES_LIST w pliku common/modules.bzl. Dodaj pliki w uporządkowanej kolejności. Jeśli nie masz pewności, czy wszystkie wygenerowane pliki są prawidłowe, kompilacja zakończy się niepowodzeniem i wyświetli listę wszystkich niezbędnych plików KO.

  3. W przypadku Androida 14 dodaj ten sam zestaw plików KO z kroku 2, posortowany w rosnącej kolejności, aby umożliwić wyszukiwanie binarne w czasie wykonywania. Użyj do tego pliku common/android/gki_{ARCH}_protected_modules, aby oznaczyć moduł jako chroniony moduł GKI.

  4. W przypadku Androida 14–16 zaktualizuj listę eksportów, które są chronione, aby uwzględnić te z nowo dodanego modułu w common/android/abi_gki_protected_exports_{ARCH} (lub common/gki/{ARCH}/protected_exports w Androidzie 16), używając tools/bazel run //common:kernel_aarch64_abi_update_protected_exports zamiast aarch64.

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

  6. Prześlij zmiany do sprawdzenia. Moduł GKI to funkcja jądra dostępna tylko na Androida, więc nie trzeba przesyłać poprawek do konwersji modułów. Aby jednak przesłać poprawki Android Common Kernel (ACK), musisz przestrzegać innych wskazówek.

Przekształcanie chronionego modułu GKI w niechroniony

  1. W przypadku Androida 15 i wyższych dodaj moduł, który jest przekształcany z chronionego na niezabezpieczony, do listy COMMON_UNPROTECTED_MODULES_LIST w pliku common/modules.bzl.

  2. W przypadku Androida 14 usuń moduł, który ma być przekształcony z modułu chronionego w niechroniony, z listy chronionych modułów na stronie common/android/gki_protected_modules.

  3. W przypadku Androida 14–16 zaktualizuj listę eksportów, które są chronione, aby wykluczyć te z niedawno przekonwertowanego niezabezpieczonego modułu w common/android/abi_gki_protected_exports_{ARCH} (lub common/gki/{ARCH}/protected_exports w przypadku Androida 16) z użyciem tools/bazel run //common:kernel_aarch64_abi_update_protected_exports zamiast aarch64.

  4. Prześlij zmiany do sprawdzenia. Moduł GKI to funkcja jądra dostępna tylko na Androidzie, więc nie trzeba przesyłać poprawek do konwersji modułów. Aby jednak przesłać poprawki Android Common Kernel (ACK), musisz przestrzegać innych wskazówek.

Krótki przewodnik po rozwiązywaniu naruszeń zasad dotyczących symboli w modułach GKI

Jeśli niepodpisane moduły naruszają ochronę symboli w modułach GKI, podczas ich wczytywania mogą wystąpić 2 rodzaje błędów, które mogą spowodować niepowodzenie.

1. Niepodpisany moduł korzystający z ochronionego symbolu

Błąd:

module: Protected symbol: some_kernel_function (err -13)

Przyczyna:

Plik module.ko to niezatwierdzony moduł dostawcy, który podczas wczytywania próbuje rozwiązać symbol wyeksportowany z modułu GKI some_kernel_function, mimo że nie jest wymieniony na liście symboli dostawcy.

Rozwiązanie:

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

2. Moduł bez podpisu eksportujący chroniony symbol

Błąd:

module: exports protected symbol some_kernel_function

Przyczyna:

Moduł eksportujący some_kernel_function to chroniony moduł GKI, a module.ko to prawdopodobnie niestandardowa wersja tego modułu bez podpisu. Gdy module.ko próbuje wyeksportować some_kernel_function, który może być eksportowany tylko przez podpisany moduł GKI, ładowanie kończy się niepowodzeniem i pojawia się ten komunikat.

Rozwiązanie:

Można to naprawić, używając wersji modułu GKI, który eksportuje some_kernel_function, jeśli nie podpisany moduł jest wersją niestandardową.