Esistono due tipi di moduli kernel: indipendenti dall'hardware moduli GKI e specifici per l'hardware moduli fornitore. Questa pagina fornisce una panoramica di entrambi i tipi di moduli.
Moduli GKI
I moduli Generic Kernel Image (GKI) vengono utilizzati per fornire funzionalità del kernel non richieste per l'avvio separate dal kernel core generico. Con i moduli GKI, puoi scegliere funzionalità specifiche del kernel da utilizzare, riducendo spesso le dimensioni dell'immagine del kernel e il consumo di memoria di runtime. La riduzione delle dimensioni rende GKI ideale per dispositivi Android Go e altri fattori di forma con risorse limitate.
I moduli GKI forniscono anche un meccanismo per consentire ai fornitori di incorporare nuove funzionalità upstream dopo il traguardo del blocco KMI. Il codice integrato non può essere sostituito senza creare un'altra immagine, mentre il codice fornito come modulo può essere sostituito da un altro modulo.
I moduli GKI utilizzano l'infrastruttura di firma in fase di compilazione del kernel per distinguere tra GKI e altri moduli in fase di runtime. Il caricamento dei moduli non firmati è consentito a condizione che utilizzino solo simboli presenti nella lista consentita o forniti da altri moduli non firmati.
Esistono due tipi logici di moduli GKI: modulo GKI protetto e modulo GKI non protetto.
Modulo GKI protetto
Un modulo GKI protetto viene fornito da Google, non è soggetto ad alcuna limitazione e si comporta come se fosse integrato nel kernel dopo il caricamento. Inoltre, i moduli GKI protetti hanno le seguenti caratteristiche:
- I moduli GKI protetti hanno accesso a simboli del kernel non KMI che non sono disponibili per i moduli del fornitore o per i moduli GKI non protetti.
- I moduli GKI protetti possono esportare simboli che diventano parte della superficie KMI a condizione che questi simboli siano citati in un elenco di simboli.
- I moduli GKI protetti non possono essere sovrascritti dai moduli del fornitore.
Un modulo GKI protetto è la classe predefinita dei moduli GKI. Tutti i moduli GKI sono considerati protetti al momento del blocco dell'interfaccia KMI.
Modulo GKI non protetto
Un modulo GKI non protetto può essere sostituito da un modulo fornitore. Dopo il blocco dell'interfaccia KMI, un modulo GKI protetto potrebbe essere riclassificato come non protetto se il team GKI decide che i fornitori devono eseguire l'override dell'implementazione predefinita con una versione che include nuove funzionalità di Linux upstream. Nella prossima release di GKI, i moduli non protetti vengono riclassificati come protetti dopo che il codice upstream viene inserito in un kernel comune Android (ACK). I moduli GKI non protetti hanno le seguenti caratteristiche:
- I moduli GKI non protetti hanno lo stesso accesso ai simboli esportati dei moduli del fornitore.
- I moduli GKI non protetti non possono esportare i simboli esportati dai moduli GKI protetti.
- I moduli GKI non protetti devono conservare le interfacce KMI come se facessero parte del kernel principale.
- I moduli GKI non protetti possono essere sostituiti dai moduli del fornitore.
Moduli del fornitore
Un modulo fornitore viene fornito dai partner per implementare funzionalità specifiche del SoC e del dispositivo. Qualsiasi modulo kernel esistente che non viene fornito come parte del kernel GKI può essere fornito come modulo fornitore.
Poiché uno degli obiettivi principali del progetto GKI è ridurre al minimo
il codice specifico dell'hardware nel kernel principale, i fornitori possono aspettarsi che il kernel GKI
non includa moduli che gestiscono chiaramente il proprio hardware. Ad esempio, il fornitore ABC Inc. può prevedere che le configurazioni come
CONFIG_ABC_SOC_SUPPORT
non verranno attivate come moduli GKI
integrati o caricabili senza il loro supporto.
Se in ACK esiste un driver o un framework del kernel, ma non viene fornito come parte
del kernel GKI, i fornitori possono modificare il driver e fornirlo come modulo
del fornitore. Queste modifiche sono sconsigliate per i moduli non specifici del fornitore
perché le stesse funzionalità potrebbero essere fornite con il kernel GKI in una
versione futura. Quando il kernel GKI contiene funzionalità fornite da un modulo fornitore, il modulo fornitore non viene caricato. Ad esempio,
CONFIG_GREYBUS
non è impostato per GKI in Android 11, quindi
i fornitori possono fornire moduli del fornitore greybus. Tuttavia, CONFIG_GREYBUS
potrebbe essere
attivato come modulo o GKI integrato in Android 12, nel
qual caso i moduli fornitore greybus non verranno caricati. Una best practice è utilizzare
la versione upstream dei driver non specifici del fornitore se vengono forniti come
moduli del fornitore.
Puoi pubblicare i moduli del fornitore nell'immagine vendor
o
vendor_boot
. I moduli richiesti all'inizio della procedura di avvio devono trovarsi in vendor_boot
.
Il caricamento dei moduli da vendor_boot
comporta un costo di avvio.