Omówienie modułów jądra

Istnieją 2 rodzaje modułów jądra: niezależne od sprzętu moduły GKI i zależne od sprzętu moduły dostawcy. Na tej stronie znajdziesz omówienie obu typów modułów.

Moduły GKI

Moduły ogólnego obrazu jądra (GKI) służą do dostarczania funkcji jądra, które nie są wymagane do uruchomienia, oddzielnie od ogólnego jądra podstawowego. Moduły GKI umożliwiają wybieranie konkretnych funkcji jądra, co często zmniejsza rozmiar obrazu jądra i zużycie pamięci w czasie działania. Dzięki zmniejszeniu rozmiaru GKI doskonale nadaje się na urządzenia z Androidem Go i inne urządzenia o ograniczonych zasobach.

Moduły GKI zapewniają też dostawcom mechanizm umożliwiający włączenie nowych funkcji upstream po osiągnięciu etapu zamrożenia KMI. Wbudowanego kodu nie można zastąpić bez tworzenia kolejnego obrazu, natomiast kod dostarczany jako moduł można zastąpić innym modułem.

Moduły GKI korzystają z infrastruktury podpisywania w czasie kompilacji jądra, aby odróżniać moduły GKI od innych modułów w czasie działania. Niepodpisane moduły mogą się wczytywać, o ile używają tylko symboli znajdujących się na liście dozwolonych lub dostarczonych przez inne niepodpisane moduły.

Istnieją 2 rodzaje logiczne modułów GKI: chroniony moduł GKIniechroniony moduł GKI.

Chroniony moduł GKI

Chroniony moduł GKI jest dostarczany przez Google, nie jest w żaden sposób ograniczony i po załadowaniu zachowuje się tak, jakby był wbudowany w jądro. Dodatkowo chronione moduły GKI mają te cechy:

  • Chronione moduły GKI mają dostęp do symboli jądra innych niż KMI, które nie są dostępne dla modułów dostawcy ani niechronionych modułów GKI.
  • Chronione moduły GKI mogą eksportować symbole, które stają się częścią interfejsu KMI, o ile są one wymienione na liście symboli.
  • Modułów GKI chronionych nie można zastąpić modułami dostawcy.

Chroniony moduł GKI to domyślna klasa modułów GKI. Wszystkie moduły GKI są uznawane za chronione w momencie zamrożenia interfejsu KMI.

Niechroniony moduł GKI

Moduł GKI bez ochrony może zostać zastąpiony przez moduł dostawcy. Po zamrożeniu interfejsu KMI chroniony moduł GKI może zostać ponownie sklasyfikowany jako niechroniony, jeśli zespół GKI uzna, że dostawcy muszą zastąpić domyślną implementację wersją zawierającą nowe funkcje z upstreamu systemu Linux. W następnej wersji GKI moduły niechronione zostaną ponownie sklasyfikowane jako chronione po tym, jak kod upstream trafi do wspólnego jądra Androida (ACK). Niechronione moduły GKI mają te cechy:

  • Niechronione moduły GKI mają taki sam dostęp do eksportowanych symboli jak moduły dostawcy.
  • Niechronione moduły GKI nie mogą eksportować symboli eksportowanych przez chronione moduły GKI.
  • Niechronione moduły GKI muszą zachowywać wszystkie interfejsy KMI tak, jakby były częścią podstawowego jądra.
  • Moduły GKI bez ochrony mogą być zastępowane przez moduły dostawcy.

Moduły dostawców

Moduł dostawcy jest dostarczany przez partnerów w celu wdrożenia funkcji specyficznych dla SoC i urządzenia. Każdy istniejący moduł jądra, który nie jest dostarczany w ramach jądra GKI, może być dostarczany jako moduł dostawcy.

Jednym z głównych celów projektu GKI jest zminimalizowanie w podstawowym jądrze kodu specyficznego dla sprzętu, więc dostawcy mogą oczekiwać, że jądro GKI nie będzie zawierać modułów, które wyraźnie zarządzają ich własnym sprzętem. Na przykład dostawca ABC Inc. może oczekiwać, że konfiguracje takie jak CONFIG_ABC_SOC_SUPPORT nie będą włączone jako wbudowane ani ładowalne moduły GKI bez jego wsparcia.

Jeśli sterownik lub platforma jądra istnieje w ACK, ale nie jest dostarczana w ramach jądra GKI, dostawcy mogą zmodyfikować sterownik i dostarczyć go jako moduł dostawcy. Takie modyfikacje są odradzane w przypadku modułów niezależnych od dostawcy, ponieważ te same funkcje mogą być dostępne w jądrze GKI w przyszłej wersji. Jeśli jądro GKI zawiera funkcje dostarczone przez moduł dostawcy, moduł dostawcy nie zostanie wczytany. Na przykład w przypadku GKI w Androidzie 11 nie jest ustawiona wartość CONFIG_GREYBUS, więc dostawcy mogą dostarczać moduły dostawców Greybus. Jednak w Androidzie 12 CONFIG_GREYBUS może być włączony jako wbudowany element GKI lub moduł. W takim przypadku moduły dostawcy greybus nie będą ładowane. Zalecamy używanie wersji sterowników niezależnych od dostawcy, jeśli są one dostarczane jako moduły dostawcy.

Moduły dostawcy możesz przesyłać w formacie vendor lub vendor_boot. Moduły wymagane na wczesnym etapie procesu uruchamiania muszą znajdować się w vendor_boot. Ładowanie modułów z vendor_boot wiąże się z kosztem czasu rozruchu.