Konfigurowanie funkcji jądra jako modułów GKI

Na tej stronie dowiesz się, 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 zmień gki_defconfig i ustaw wymagany element konfiguracji funkcji jądra z n na m (=m). Ustaw to w arch/arm64/configs/gki_defconfigarch/x86/configs/gki_defconfig.

  2. Dodaj pliki KO (.ko) wygenerowane dla funkcji do sekcji COMMON_GKI_MODULES_LISTcommon/modules.bzl. Dodaj pliki w posortowanej kolejności. Jeśli nie masz pewności, jakie pliki zostały wygenerowane, kompilacja zakończy się niepowodzeniem i wyświetli listę wszystkich niezbędnych plików KO, które należy dodać do listy.

  3. W przypadku Androida 14 dodaj ten sam zestaw plików KO z kroku 2, posortowanych rosnąco pod kątem 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 zawierała nowo dodane eksporty w 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 for aarch64.

  5. Upewnij się, że nowo dodane pliki KO z kroku 2 zostały skopiowane do katalogów out/<androidX-Y.Z>/dist/system_dlkm.imgout/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz jądra. Moduły w system_dlkm_staging_archive.tar.gz archiwum mogą być używane jako dane wejściowe do generowania 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ć do upstreamu poprawek konwersji modułów. Aby przesłać łatki do wspólnego jądra Androida (ACK), musisz jednak przestrzegać innych wytycznych.

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 w arch/arm64/configs/gki_defconfigarch/x86/configs/gki_defconfig.

  2. Dodaj pliki KO (.ko) wygenerowane dla funkcji do sekcji COMMON_GKI_MODULES_LISTcommon/modules.bzl. Dodaj pliki w posortowanej kolejności. Jeśli nie masz pewności, jakie pliki zostały wygenerowane, kompilacja zakończy się niepowodzeniem i wyświetli listę wszystkich niezbędnych plików KO, które należy dodać do listy.

  3. W przypadku Androida 14 dodaj ten sam zestaw plików KO z kroku 2, posortowanych rosnąco pod kątem 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 dla aarch64.

  5. Upewnij się, że nowo przekonwertowane pliki KO modułu z kroku 2 zostały skopiowane do folderów out/<androidX-Y.Z>/dist/system_dlkm.imgout/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz w jądrze. Moduły w system_dlkm_staging_archive.tar.gz archiwum mogą być używane jako dane wejściowe do generowania 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ć do upstreamu poprawek konwersji modułów. Musisz jednak przestrzegać pozostałych wytycznych, aby przesyłać łatki do wspólnego jądra Androida (ACK).

Konwertowanie chronionego modułu GKI na niechroniony

  1. W przypadku Androida 15 i nowszych dodaj moduł, który ma zostać przekonwertowany z chronionego na niechroniony, do listy COMMON_UNPROTECTED_MODULES_LIST w pliku common/modules.bzl.

  2. W przypadku Androida 14 usuń z listy chronionych modułów w common/android/gki_protected_modules moduł, który jest przekształcany z chronionego na niechroniony.

  3. W przypadku Androida 14 i 15 zaktualizuj listę eksportów, które są chronione, tak aby wykluczyć z niej 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 dla 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ć do upstreamu poprawek konwersji modułów. Musisz jednak przestrzegać pozostałych wytycznych, aby przesyłać łatki 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 obowiązującą w przypadku modułów GKI, podczas wczytywania modułów 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 to niepodpisany moduł dostawcy, który podczas wczytywania próbuje rozwiązać wyeksportowany symbol modułu GKI some_kernel_function, nie będąc wymienionym na liście symboli dostawcy.

Rozwiązanie:

Jeśli module.ko nie jest chronionym modułem GKI, zaktualizowanie listy symboli rozwiąże problem, ponieważ some_kernel_function zostanie dodany do listy symboli dostawcy. Możesz też użyć wersji GKI polecenia 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żna wyeksportować tylko za pomocą podpisanego modułu GKI, ładowanie kończy się niepowodzeniem i wyświetla się ten komunikat.

Rozwiązanie:

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