Un'immagine del kernel generica (GKI) potrebbe non contenere il supporto del driver necessario per consentire a un dispositivo di montare le partizioni. Per consentire a un dispositivo di montare le partizioni e continuare l'avvio, la fase 1 init
viene migliorata per caricare i moduli del kernel presenti su una ramdisk. Il ramdisk è suddiviso in ramdisk generici e del fornitore. I moduli del kernel del fornitore sono archiviati nella ramdisk del fornitore. L'ordine in cui vengono caricati i moduli del kernel è configurabile.
Posizione del modulo
Il ramdisk è il file system per la prima fase init,
e per l'immagine recovery/fastbootd sui dispositivi A/B e A/B virtuali. Si tratta di un
initramfs
composto da due archivi cpio concatenati dal bootloader. Il primo archivio cpio, archiviato come ramdisk del fornitore
nella partizione vendor-boot, contiene i seguenti componenti:
- Moduli del kernel del fornitore
init
di primo livello, situati in/lib/modules/
. - File di configurazione
modprobe
, che si trovano in/lib/modules/
:modules.dep
,modules.softdep
,modules.alias
,modules.options
. - Un file
modules.load
che indica quali moduli caricare durante l'inizializzazione della prima fase e in quale ordine in/lib/modules/
. - Moduli del kernel di recupero del fornitore, per i dispositivi A/B e virtuali A/B, in
/lib/modules/
modules.load.recovery
che indica i moduli da caricare e in quale ordine per i dispositivi A/B e A/B virtuali in/lib/modules
.
Il secondo archivio cpio, fornito con il GKI come ramdisk del file boot.img e applicato sopra il primo, contiene first_stage_init
e le librerie da cui dipende.
Caricamento del modulo nell'inizializzazione di primo livello
La prima fase di init
inizia leggendo i file di configurazione di modprobe da /lib/modules/
sulla ramdisk. Successivamente, legge l'elenco
di moduli specificati in /lib/modules/modules.load
(o, nel caso
di recupero, /lib/modules/modules.load.recovery
) e tenta di caricare ciascuno di questi moduli in ordine, seguendo la configurazione specificata
nei file caricati in precedenza. È possibile che venga deviato dall'ordine richiesto per soddisfare dipendenze rigide o flessibili.
Supporto per la compilazione, inizializzazione di primo livello
Per specificare i moduli del kernel da copiare nel file cpio del ramdisk del fornitore, elencali in BOARD_VENDOR_RAMDISK_KERNEL_MODULES
. La compilazione viene eseguita
depmod
su questi moduli e inserisce i file di configurazione
modprobe risultanti nel file cpio del ramdisk del fornitore.
La compilazione crea anche un file modules.load
e lo memorizza nel file cpio del ramdisk del fornitore. Per impostazione predefinita, contiene tutti i moduli elencati in
BOARD_VENDOR_RAMDISK_KERNEL_MODULES
. Per sostituire i contenuti di quel file, utilizza BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD
, come mostrato in questo esempio:
BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := \ device/vendor/mydevice-kernel/first.ko \ device/vendor/mydevice-kernel/second.ko \ device/vendor/mydevice-kernel/third.ko
Supporto per la compilazione, Android completo
Come per le release di Android 10 e versioni precedenti, i moduli del kernel elencati in
BOARD_VENDOR_KERNEL_MODULES
vengono copiati dalla compilazione della piattaforma Android
nella partizione del fornitore in /vendor/lib/modules
. La compilazione della piattaforma esegue depmod
su questi moduli e copia i file di output di depmod
nella partizione del fornitore nella stessa posizione. Il meccanismo di caricamento dei moduli del kernel da /vendor
rimane invariato rispetto alle release precedenti di Android. Sta a te decidere come e quando caricare questi moduli, anche se in genere questa operazione viene eseguita utilizzando script init.rc
.
Segnaposto e build del kernel integrate
I fornitori che combinano la build del kernel del dispositivo con la build della piattaforma Android
potrebbero riscontrare un problema con l'utilizzo delle macro BOARD
sopra menzionate per
specificare i moduli del kernel da copiare sul dispositivo. Se il fornitore vuole evitare di elencare i moduli del kernel nei file di compilazione della piattaforma del dispositivo, può utilizzare un carattere jolly ($(wildcard device/vendor/mydevice/*.ko
). Tieni presente che il carattere jolly non funziona nel caso di una compilazione del kernel integrata, perché quando viene richiamato make e le macro vengono espanse nei file make, i moduli del kernel non sono stati compilati, quindi le macro sono vuote.
Per aggirare questo problema, il fornitore potrebbe creare con la build del kernel un'archiviazione zip contenente i moduli del kernel da copiare su ogni partizione.
Imposta il percorso dell'archivio ZIP in BOARD_*_KERNEL_MODULES_ARCHIVE
dove *
è il nome della partizione (ad esempio
BOARD_VENDOR_KERNEL_MODULES_ARCHIVE
). La compilazione della piattaforma Android
estrae questo archivio ZIP nella posizione appropriata ed esegue depmod
sui moduli.
L'archivio ZIP del modulo del kernel deve avere una regola make che garantisca che la compilazione della piattaforma possa generare l'archivio quando necessario.
Ripristino
Nelle release Android precedenti, i moduli del kernel necessari per il recupero erano
specificati in BOARD_RECOVERY_KERNEL_MODULES
. In Android 12,
i moduli del kernel necessari per il recupero sono ancora
specificati utilizzando questa macro. Tuttavia, i moduli del kernel di recupero vengono copiati nel file cpio ramdisk del fornitore anziché nel file cpio ramdisk generico. Per impostazione predefinita, tutti i moduli del kernel elencati in BOARD_RECOVERY_KERNEL_MODULES
vengono caricati durante la prima fase init
. Se vuoi che venga caricato solo un sottoinsieme di questi moduli, specifica i contenuti del sottoinsieme in BOARD_RECOVERY_KERNEL_MODULES_LOAD
.
Documentazione correlata
Per informazioni sulla creazione di una partizione di avvio del fornitore (che contiene il ramdisk del fornitore menzionato in questa pagina), consulta Partizioni di avvio.