Omówienie modułów jądra

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

Moduły GKI

Moduły ogólnego obrazu jądra (GKI) są używane do dostarczania funkcji jądra, które nie są wymagane do uruchamiania, oddzielnie od ogólnego jądra rdzenia. Dzięki modułom GKI możesz wybrać konkretne możliwości jądra, które chcesz wykorzystać, co często powoduje zmniejszenie rozmiaru obrazu jądra i zużycia pamięci w czasie działania. Zmniejszenie rozmiaru sprawia, że GKI doskonale nadaje się do urządzeń z Androidem Go i innych form czynników ograniczonych zasobami.

Moduły GKI zapewniają też mechanizm, który pozwala dostawcom wdrażać nowe funkcje upstream po etapie zamrożenia KMI. Wbudowany kod nie może zostać zastąpiony bez utworzenia innego obrazu, natomiast kod dostarczony jako moduł może zostać zastąpiony przez inny moduł.

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

Istnieją 2 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 został skompilowany z jądrem. 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 dostawców ani niezabezpieczonych 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.
  • Chronionego modułu GKI nie można zastąpić modułem dostawcy.

Chroniony moduł GKI należy do domyślnej klasy modułów GKI. Wszystkie moduły GKI są uważane za chronione w momencie zamrożenia KMI.

Niechroniony moduł GKI

Niezabezpieczony moduł GKI można zastąpić modułem dostawcy. Po zamrożeniu KMI chroniony moduł GKI może zostać przeklasyfikowany jako niezabezpieczony, jeśli zespół GKI zdecyduje, że dostawcy muszą zastąpić domyślną implementację wersją, która zawiera nowe funkcje z upstreamowego systemu Linux. W następnej wersji GKI niezabezpieczone moduły zostaną zaklasyfikowane jako chronione, gdy kod źródłowy z wyższego poziomu 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 wyeksportowanych symboli jak moduły dostawców.
  • Niechronione moduły GKI nie mogą eksportować symboli wyeksportowanych przez chronione moduły GKI.
  • Niechronione moduły GKI muszą zachowywać wszystkie interfejsy KMI jako część podstawowego jądra.
  • Niechronione moduły GKI mogą być zastępowane przez moduły dostawców.

Moduły dostawców

Moduł dostawcy jest dostarczany przez partnerów w celu implementacji funkcji związanych z procesorem i urządzeniem. Każdy istniejący moduł jądra, który nie jest dostarczany jako część jądra GKI, może być dostarczany jako moduł dostawcy.

Ponieważ jednym z głównych celów projektu GKI jest zminimalizowanie kodu sprzętowego w rdzeniu jądra systemu, dostawcy mogą oczekiwać, że jądro GKI nie będzie zawierać 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 będą włączone jako wbudowane lub ładowalne moduły GKI bez ich obsługi.

Jeśli sterownik lub platforma jądra istnieje w potwierdzeniu potwierdzenia, ale nie jest częścią jądra GKI, dostawcy mogą zmodyfikować sterownik i dostarczyć go jako moduł dostawcy. Nie zalecamy wprowadzania takich modyfikacji w przypadku modułów niebędących modułami konkretnego dostawcy, ponieważ w przyszłej wersji jądra GKI mogą być dostępne te same funkcje. Jeśli jądro GKI zawiera funkcje udostępnione przez moduł dostawcy, moduł dostawcy nie zostanie załadowany. Na przykład w Androidzie 11 nie jest ustawiana wartość CONFIG_GREYBUS dla GKI, więc dostawcy mogą dostarczać moduły dostawcy w ramach usługi Greybus. Jednak CONFIG_GREYBUS może być włączony jako wbudowany moduł GKI lub moduł GKI w Androidzie 12. W takim przypadku moduły dostawcy Greybus nie zostaną wczytane. Sprawdzoną metodą jest używanie wersji upstream sterowników niewymagających instalacji, jeśli są one dostarczane jako moduły dostawcy.

Moduły dostawcy możesz przesyłać w ramach vendor lub obrazu 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 uruchamiania.