Przegląd modułów jądra

Istnieją dwa typy modułów jądra: moduły GKI niezależne od sprzętu i moduły dostawców specyficzne dla sprzętu. Na tej stronie znajduje się przegląd obu typów modułów.

Moduły GKI

Moduły Generic Kernel Image (GKI) służą do dostarczania funkcji jądra niewymagających rozruchu, niezależnie od ogólnego jądra rdzenia. Dzięki modułom GKI możesz wybrać konkretną funkcjonalność jądra, której chcesz używać, często zmniejszając rozmiar obrazu jądra i zużycie pamięci w czasie wykonywania. Zmniejszenie rozmiaru sprawia, że ​​GKI dobrze nadaje się do urządzeń z systemem Android Go i innych urządzeń o ograniczonych zasobach.

Moduły GKI zapewniają także mechanizm umożliwiający dostawcom włączenie nowych funkcji wyższego szczebla po osiągnięciu kamienia milowego w postaci zamrożenia KMI. Wbudowanego kodu nie da się zastąpić bez zbudowania kolejnego obrazu, natomiast kod dostarczony jako moduł można zastąpić innym modułem.

Moduły GKI korzystają z infrastruktury podpisywania czasu kompilacji jądra, aby odróżnić GKI od innych modułów w czasie wykonywania. Niepodpisane moduły mogą być ładowane pod warunkiem, że używają tylko symboli znajdujących się na liście dozwolonych lub dostarczonych przez inne niepodpisane moduły.

Istnieją dwa logiczne typy modułów GKI: chroniony moduł GKI i niechroniony 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ł zbudowany z jądra. Dodatkowo chronione moduły GKI posiadają następujące cechy:

  • Chronione moduły GKI mają dostęp do symboli jądra innych niż KMI, które nie są dostępne dla modułów dostawców lub niechronionych modułów GKI.
  • Chronione moduły GKI mogą eksportować symbole, które stają się częścią powierzchni KMI, o ile te symbole są cytowane na liście symboli.
  • Chronione moduły GKI nie mogą zostać zastąpione przez moduły dostawcy.

Chroniony moduł GKI jest domyślną klasą modułów GKI. Wszystkie moduły GKI są uważane za chronione w momencie zamrożenia KMI.

Niezabezpieczony moduł GKI

Niezabezpieczony moduł GKI może zostać zastąpiony przez moduł dostawcy. Po zamrożeniu KMI chroniony moduł GKI może zostać przeklasyfikowany na niechroniony, jeśli zespół GKI zdecyduje, że dostawcy muszą zastąpić domyślną implementację wersją zawierającą nowe funkcje z wcześniejszego systemu Linux. W następnej wersji GKI niechronione moduły zostaną przeklasyfikowane na chronione po tym, jak kod źródłowy wyląduje we wspólnym jądrze systemu Android (ACK). Niezabezpieczone moduły GKI mają następujące cechy:

  • Niechronione moduły GKI mają taki sam dostęp do eksportowanych symboli jak moduły dostawców.
  • Niechronione moduły GKI nie mogą eksportować symboli eksportowanych przez chronione moduły GKI.
  • Niezabezpieczone moduły GKI muszą zachować wszelkie interfejsy KMI tak, jakby były częścią jądra rdzenia.
  • Niezabezpieczone moduły GKI mogą zostać zastąpione przez moduły dostawcy.

Moduły dostawcy

Moduł dostawcy jest dostarczany przez partnerów w celu wdrożenia SoC i funkcjonalności specyficznych dla urządzenia. Każdy istniejący moduł jądra, który nie jest dostarczany jako część jądra GKI, może zostać dostarczony jako moduł dostawcy.

Ponieważ jednym z głównych celów projektu GKI jest minimalizacja kodu specyficznego dla sprzętu w jądrze jądra, dostawcy mogą spodziewać się, że jądro GKI nie będzie zawierało modułów, które wyraźnie zarządzają ich własnym sprzętem. Na przykład dostawca ABC Inc może spodziewać się, że konfiguracje takie jak CONFIG_ABC_SOC_SUPPORT nie zostaną włączone ani jako wbudowane, ani ładowalne moduły GKI bez ich wsparcia.

Jeśli sterownik jądra lub struktura istnieje w ACK, ale nie jest dostarczany jako część jądra GKI, dostawcy mogą zmodyfikować sterownik i dostarczyć go jako moduł dostawcy. Odradza się takie modyfikacje w przypadku modułów innych niż specyficzne dla dostawcy, ponieważ ta sama funkcjonalność może zostać dostarczona z jądrem GKI w przyszłej wersji. Gdy jądro GKI zawiera funkcjonalność zapewnianą przez moduł dostawcy, moduł dostawcy nie zostanie załadowany. Na przykład CONFIG_GREYBUS nie jest ustawiony dla GKI w systemie Android 11, więc dostawcy mogą dostarczać moduły dostawców Greybus. Jednak CONFIG_GREYBUS może być włączony jako wbudowany GKI lub moduł w systemie Android 12, w takim przypadku moduły dostawcy Greybus nie zostaną załadowane. Najlepszą praktyką jest użycie wcześniejszej wersji sterowników innych niż specyficzne dla dostawcy, jeśli są one dostarczane jako moduły dostawcy.

Możesz dostarczyć moduły dostawcy w obrazie vendor lub vendor_boot . Moduły wymagane na początku procesu rozruchu muszą znajdować się w vendor_boot . Ładowanie modułów z vendor_boot wiąże się z kosztem czasu rozruchu.