Utrzymuj stabilny interfejs modułu jądra (KMI)

Utrzymanie stabilnego KMI dla modułów dostawców ma kluczowe znaczenie. Jądro GKI jest budowane i dostarczane w formie binarnej, a moduły ładowalne przez dostawcę są budowane w osobnym drzewie. Wynikowe jądro GKI i moduły dostawcy muszą działać tak, jakby były zbudowane razem.

Ogólnie rzecz biorąc, społeczność Linuksa z dezaprobatą przyjęła koncepcję stabilności ABI w jądrze dla jądra głównego. W obliczu różnych zestawów narzędzi, konfiguracji i stale rozwijającego się głównego jądra Linuksa utrzymanie stabilnego KMI w głównym trybie jest niewykonalne. Jednakże możliwe jest utrzymanie stabilnego KMI w bardzo ograniczonym środowisku GKI z następującymi ograniczeniami:

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

  • KMI jest stabilny tylko w tej samej wersji jądra LTS i Androida, takiej jak android13-5.10 , android12-5.10 lub android13-5.15 .

    • Dla android-mainline nie jest utrzymywana stabilność KMI.
  • Do budowania jądra i modułów używany jest tylko specyficzny zestaw narzędzi Clang dostarczony w AOSP i zdefiniowany dla odpowiedniej gałęzi.

  • Tylko symbole, o których wiadomo, że są używane przez moduły, jak określono na liście symboli, są monitorowane pod kątem stabilności i uznawane za symbole KMI.

    • Konsekwencją tego jest to, że moduły dostawców muszą używać wyłącznie symboli KMI. To ograniczenie jest wymuszane przez nieudane ładowanie modułów, jeśli wymagane są symbole inne niż KMI.
  • Po zamrożeniu gałęzi KMI zmiany są dozwolone, ale nie mogą uszkodzić KMI. Zmiany te obejmują:

    • Zmiany w konfiguracji
    • Zmiany w kodzie jądra
    • Zmiany w zestawie narzędzi (w tym aktualizacje)

Skorzystaj z hermetycznego procesu kompilacji i zestawu narzędzi LLVM

Hermetyczny proces kompilacji zapewnia stabilny KMI, ponieważ manifesty repo w kernel/manifest całkowicie opisują środowisko kompilacji. Na przykład manifest dla android13-5.15 zawiera łańcuch narzędzi, skrypty kompilacji i wszystko inne wymagane do zbudowania jądra ogólnego obrazu jądra (GKI). Odpowiednie pliki konfiguracyjne build.config , takie jak GKI build config build.config.gki.aarch64 , zapewniają prawidłowe użycie dołączonych narzędzi w celu wygenerowania spójnych wyników kompilacji.

Stosowanie hermetycznego procesu kompilacji zapewnia również spójność opisu ABI drzewa, niezależnie od tego, czy jest on wygenerowany przez Google (na przykład abi_gki_aarch64.xml dla android13-5.15 , czy wygenerowany w lokalnym drzewie zawierającym moduły dostawcy. Narzędzia do tworzenia i porównywania Opis ABI dla interfejsu modułu jądra (KMI) jest również udostępniany jako część repozytorium opisanego w manifeście.

Łańcuch narzędzi używany do budowania jądra GKI musi być w pełni kompatybilny z łańcuchem narzędzi używanym do budowania modułów dostawców. Począwszy od Androida 10, wszystkie jądra Androida muszą być zbudowane przy użyciu zestawu narzędzi LLVM. W przypadku GKI łańcuch narzędzi LLVM używany do tworzenia jąder produktów i modułów dostawców musi generować ten sam ABI, co łańcuch narzędzi LLVM z AOSP, a partnerzy muszą upewnić się, że KMI jest kompatybilny z jądrem GKI. Zdecydowanie zaleca się korzystanie z dostarczonych narzędzi do kompilacji, ponieważ zapewniają one gwarancję zgodności.

Co dalej?

  • Aby uzyskać instrukcje dotyczące budowania jądra przy użyciu hermetycznego procesu kompilacji i zestawu narzędzi LLVM, zobacz Kompilacja jąder .

  • Instrukcje dotyczące monitorowania ABI i rozwiązywania problemów można znaleźć w artykule Monitorowanie ABI jądra systemu Android