Utrzymanie stabilnego interfejsu modułu jądra

Ważne jest, aby interfejs modułu jądra (KMI) dla modułów dostawców był stabilny. Rdzeń GKI jest kompilowany i przesyłany w postaci binarnej, a moduły, które można wczytać u dostawcy, są kompilowane w oddzielnym 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 akceptuje pojęcia 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 jest możliwe utrzymanie stabilnego KMI w głównym nurcie. Można jednak utrzymać stabilny współczynnik KMI w środowisku GKI o wysokich ograniczeniach, stosując te ograniczenia:

  • Do utworzenia 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. android13-5.10, android12-5.10 lub android13-5.15.

    • W przypadku android-mainline nie jest utrzymywana stabilność KMI.
  • 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żyj 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 android13-5.15 zawiera narzędzia, skrypty kompilacji i wszystko inne, co jest wymagane do skompilowania obrazu jądra Generic Kernel Image (GKI). Odpowiednie pliki konfiguracji build.config, takie jak konfiguracja kompilacji GKI build.config.gki.aarch64, powinny być prawidłowo używane do generowania spójnych wyników kompilacji.

Zastosowanie hermetycznego procesu kompilacji zapewnia też spójność opisu ABI dla drzewa niezależnie od tego, czy został wygenerowany przez Google (np. abi_gki_aarch64.xml w przypadku android13-5.15) czy w drzewie lokalnym, które zawiera moduły vendora. Narzędzia do tworzenia i porównywania opisu ABI interfejsu Kernel Module Interface (KMI) są też dostępne w ramach repozytorium opisanego w manifeście.

Łańcuch narzędzi użyty do utworzenia jądra GKI musi być w pełni zgodny z łańcuchem narzędzi używanym do tworzenia modułów dostawcy. 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 używanie udostępnionych 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.