Mantenere un'interfaccia stabile del modulo kernel

È fondamentale mantenere un'interfaccia del modulo del kernel (KMI) stabile per i moduli del fornitore. Il kernel GKI viene compilato e distribuito in formato binario e i moduli caricabili dal fornitore vengono compilati in un albero distinto. Il kernel GKI e i moduli del fornitore risultanti devono funzionare come se fossero stati creati insieme.

In genere, la community di Linux ha disapprovato la nozione di stabilità dell'ABI in-kernel per il kernel mainline. A causa di diverse catena di strumenti, configurazioni e un kernel Linux in continua evoluzione, non è possibile mantenere un KMI stabile nella linea principale. Tuttavia, è possibile mantenere un KMI stabile nell'ambiente GKI altamente vincolato con i seguenti vincoli:

  • È possibile utilizzare una sola configurazione, gki_defconfig, per creare il kernel.

  • Il KMI è stabile solo all'interno della stessa versione LTS e Android di un kernel, come android13-5.10, android12-5.10 o android13-5.15.

    • La stabilità del KMI non viene mantenuta per android-mainline.
  • Per la compilazione del kernel e dei moduli viene utilizzata solo la toolchain Clang specifica fornita in AOSP e definita per il ramo corrispondente.

  • Solo i simboli noti per essere utilizzati dai moduli come specificato in un elenco di simboli vengono monitorati per la stabilità e considerati simboli KMI.

    • Il corollario è che i moduli del fornitore devono utilizzare solo simboli KMI. Questo vincolo viene applicato tramite i caricamenti dei moduli non riusciti se sono richiesti simboli diversi da KMI.
  • Dopo il blocco del ramo KMI, le modifiche sono consentite, ma non possono interrompere il KMI. Queste modifiche includono:

    • Modifiche alla configurazione
    • Modifiche al codice del kernel
    • Modifiche alla toolchain (inclusi gli aggiornamenti)

Utilizzare la procedura di compilazione ermetica e la toolchain LLVM

Il processo di compilazione ermetica garantisce un KMI stabile grazie ai manifest repo in kernel/manifest che descrivono completamente l'ambiente di compilazione. Ad esempio, il manifest per android13-5.15 include la toolchain, gli script di compilazione e tutto il resto necessario per compilare il kernel GKI (Generic Kernel Image). I rispettivi file di configurazione build.config, come la configurazione di build GKI build.config.gki.aarch64, assicurano che gli strumenti inclusi vengano utilizzati correttamente per generare risultati di build coerenti.

L'utilizzo di un processo di compilazione ermetico garantisce inoltre che la descrizione ABI per l'albero sia coerente, a prescindere dal fatto che venga generata da Google (ad esempio, abi_gki_aarch64.xml per android13-5.15) o generata in una struttura locale che include i moduli del fornitore. I strumenti per creare e confrontare la descrizione dell'ABI per l'interfaccia del modulo del kernel (KMI) sono forniti anche come parte del repo descritto dal manifest.

La toolchain utilizzata per compilare il kernel GKI deve essere completamente compatibile con la toolchain utilizzata per compilare i moduli del fornitore. A partire da Android 10, tutti i kernel Android devono essere compilati con una toolchain LLVM. Con GKI, la toolchain LLVM utilizzata per creare i kernel dei prodotti e i moduli del fornitore deve generare la stessa ABI della toolchain LLVM di AOSP e i partner devono garantire che il KMI sia compatibile con il kernel GKI. Ti consigliamo vivamente di utilizzare gli strumenti di creazione forniti, in quanto offrono la migliore compatibilità.

Passaggi successivi