Istnieją dwa typy modułów jądra: moduły GKI niezależne od sprzętu i moduły dostawcy specyficzne dla sprzętu. Ta strona zawiera przegląd obu typów modułów.
moduły GKI
Moduły Generic Kernel Image (GKI) są używane do dostarczania funkcji jądra niewymaganych do rozruchu, niezależnie od ogólnego jądra podstawowego. Dzięki modułom GKI możesz wybrać konkretną funkcjonalność jądra do użycia, często zmniejszając rozmiar obrazu jądra i zużycie pamięci w czasie wykonywania. Zmniejszenie rozmiaru sprawia, że GKI doskonale nadaje się do urządzeń z systemem Android Go i innych urządzeń o ograniczonych zasobach.
Moduły GKI zapewniają również mechanizm umożliwiający dostawcom wprowadzanie nowych funkcji nadrzędnych po zamrożeniu kamienia milowego KMI. Wbudowanego kodu nie można zastąpić bez zbudowania innego obrazu, natomiast kod dostarczony jako moduł można zastąpić innym modułem.
Moduły GKI wykorzystują infrastrukturę podpisywania czasu kompilacji jądra, aby odróżnić GKI od innych modułów w czasie wykonywania. Niepodpisane moduły mogą się ładować, o ile 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 mają 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 dostawcy 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.
- Chronionych modułów GKI nie można zastąpić modułami 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.
Niechroniony moduł GKI
Niechroniony moduł GKI może zostać zastąpiony przez moduł dostawcy. Po zamrożeniu KMI chroniony moduł GKI może zostać ponownie sklasyfikowany jako niechroniony, jeśli zespół GKI zdecyduje, że dostawcy muszą zastąpić domyślną implementację wersją, która zawiera nowe funkcje z wcześniejszego systemu Linux. W następnej wersji GKI niechronione moduły zostaną ponownie sklasyfikowane jako chronione po wylądowaniu kodu źródłowego 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 wyeksportowanych symboli jak moduły dostawcy.
- Niechronione moduły GKI nie mogą eksportować symboli wyeksportowanych przez chronione moduły GKI.
- Niechronione moduły GKI muszą zachowywać wszelkie interfejsy KMI jako część jądra rdzenia.
- Niechronione moduły GKI mogą zostać nadpisane 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 zminimalizowanie kodu specyficznego dla sprzętu w rdzeniu jądra, dostawcy mogą oczekiwać, że jądro GKI nie będzie zawierało modułów, które wyraźnie zarządzają własnym sprzętem. Na przykład dostawca ABC Inc może oczekiwać, że konfiguracje takie jak CONFIG_ABC_SOC_SUPPORT
nie zostaną włączone ani jako wbudowane, ani ładowalne moduły GKI bez ich obsługi.
Jeśli sterownik lub struktura jądra istnieje w ACK, ale nie jest dostarczana jako część jądra GKI, dostawcy mogą zmodyfikować sterownik i dostarczyć go jako moduł dostawcy. Takie modyfikacje są odradzane w przypadku modułów innych niż dostawcy, ponieważ ta sama funkcjonalność może zostać dostarczona z jądrem GKI w przyszłej wersji. Gdy jądro GKI zawiera funkcje zapewniane przez moduł dostawcy, moduł dostawcy nie zostanie załadowany. Na przykład CONFIG_GREYBUS
nie jest ustawiony dla GKI w Androidzie 11, więc dostawcy mogą dostarczać moduły dostawców greybus. Jednak CONFIG_GREYBUS
może być włączony jako wbudowany lub moduł GKI w systemie Android 12, w takim przypadku moduły dostawcy greybus nie zostaną załadowane. Najlepszą praktyką jest korzystanie z wcześniejszych wersji sterowników niezwiązanych z konkretnym dostawcą, 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 wczesnym etapie procesu rozruchu muszą znajdować się w vendor_boot
. Z ładowaniem modułów z vendor_boot
wiąże się koszt czasu rozruchu.