Utrzymywanie stabilnego interfejsu modułu jądra

Ważne jest, aby zapewnić stabilny interfejs modułu jądra (KMI) dla modułów dostawców. Rdzeń GKI jest tworzony i dostarczany w postaci binarnej, a moduły ładowane przez dostawcę są tworzone w osobnym drzewie. Powstałe moduły rdzenia i moduły dostawców GKI muszą działać tak, jakby zostały utworzone razem.

Ogólnie społeczność Linuksa nie zgadza się z koncepcją stabilności ABI w jądrze w przypadku głównego jądra. Ze względu na różne zestawy narzędzi, konfiguracje i stale rozwijane jądro główne Linuksa nie da się utrzymać stabilnego KMI w głównym nurcie. Można jednak utrzymać stabilny współczynnik KMI w wyjątkowo ograniczonym środowisku GKI, stosując te ograniczenia:

  • Do kompilacji jądra można użyć tylko jednej konfiguracji, gki_defconfig.

  • KMI jest stabilny tylko w przypadku tej samej wersji jądra LTS i Androida, np. android14-6.1, android15-6.6 lub android16-6.12.

    • Stabilność KMI nie jest utrzymywana w przypadku android-mainline.
  • Do kompilowania jądra i modułów służy tylko określona łańcuch narzędzi Clang dostarczony w AOSP i zdefiniowany dla odpowiedniej gałęzi.

  • Stabilność i oznaczenie jako symboli KMI podlegają tylko te symbole, które są używane przez moduły zgodnie z listą symboli.

    • Oznacza to, że moduły dostawców mogą używać tylko symboli KMI. To ograniczenie jest egzekwowane przez nieudane wczytywanie modułów, jeśli wymagane są symbole inne niż KMI.
  • Po zamrożeniu gałęzi KMI można wprowadzić zmiany, ale nie mogą one naruszać KMI. Te zmiany obejmują:

    • Zmiany w konfiguracji
    • Zmiany w kodzie jądra
    • zmiany w ekosystemie narzędzi (w tym aktualizacje);

Używanie hermetycznego procesu kompilacji i łańcucha narzędzi LLVM

Proces hermetycznego kompilowania zapewnia stabilność KMI dzięki temu, że pliki manifestu repo w kernel/manifest dokładnie opisują środowisko kompilacji. Na przykład plik manifestu dla android16-6.12 zawiera zestaw narzędzi, system kompilacji i wszystko inne, co jest wymagane do skompilowania obrazu Generic Kernel Image (GKI). Konfiguracja kompilacji, głównie BUILD.bazel, zapewnia prawidłowe używanie dołączonych narzędzi w celu generowania spójnych wyników kompilacji.

Korzystanie z hermetycznego procesu kompilacji zapewnia też spójność opisu ABI dla drzewa niezależnie od tego, czy został wygenerowany przez Google (np. gki/aarch64/abi.stg w przypadku android16-6.12) czy w drzewie lokalnym, które zawiera moduły dostawcy. Narzędzia do tworzenia i porównywania opisu ABI interfejsu Kernel Module Interface (KMI) są również dostępne w repozytorium opisanym w pliku manifestu.

Zestaw narzędzi używany do kompilowania rdzenia GKI musi być w pełni zgodny z zestawem narzędzi używanym do kompilowania modułów dostawców. Od Androida 10 wszystkie jądra Androida muszą być kompilowane za pomocą zestawu narzędzi LLVM. W przypadku GKI łańcuch narzędzi LLVM używany do kompilowania jąder produktów i modułów dostawców musi generować ten sam interfejs ABI co łańcuch narzędzi LLVM z AOSP, a partnerzy muszą zadbać o to, aby KMI był zgodny z jądrem GKI. Zalecamy korzystanie z dostępnych narzędzi do kompilacji, ponieważ zapewniają one najlepszą zgodność.

Co dalej?

  • Instrukcje dotyczące kompilowania jądra za pomocą hermetycznego procesu kompilacji i zestawu narzędzi LLVM znajdziesz w artykule Kompilowanie jąder.

  • Instrukcje monitorowania ABI i rozwiązywania problemów znajdziesz w artykule Monitorowanie ABI jądra Androida.