Modularizza gli heap ION per GKI

Molti OEM Android modificano il driver del kernel ION per vari motivi, ad esempio per aggiungere heap del fornitore e personalizzare la gestione della cache (per informazioni dettagliate su queste modifiche, consulta Integrare l'allocatore di memoria ION). Per consentire agli OEM di mantenere queste modifiche quando utilizzano l'immagine generica del kernel (GKI), la versione 5.4 del kernel comune di Android introduce un framework per la modularizzazione degli heap ION specifici del fornitore, mantenendo al contempo integrato il driver ION principale. La figura seguente mostra il layout dell'immagine del kernel.

Heap ION modulari

Figura 1. Driver del kernel ION modularizzato

Gli heap ION modulari presentano i seguenti vantaggi.

  • Il driver di base ION può far parte dell'immagine GKI, consentendo a tutte le ottimizzazioni del rendimento e le correzioni di bug indipendenti dal dispositivo di raggiungere tutti i dispositivi.
  • Il driver di base ION nel kernel comune può gestire la registrazione dell'heap e gestire l'interfaccia con i client dello spazio utente e del kernel. I moduli dell'heap del fornitore sono necessari solo per implementare le operazioni dell'heap personalizzate.
  • Il driver principale ION (nell'ambito del GKI) può includere hook per semplificare il monitoraggio dell'utilizzo della memoria, cosa non possibile quando ogni OEM aveva la propria versione del driver ION.
  • I cumuli ION modulari del fornitore dovrebbero semplificare eventuali transizioni future ai cumuli dmabuf.

Implementazione

I moduli dell'heap ION possono registrare le proprie operazioni dmabuf per sostituire quelle registrate dal driver ION principale. Un'operazione dmabuf (ad esempio get_flags()) che non è supportata dal driver ION di base restituisce -EOPNOTSUPP se l'implementazione dell'heap non dispone delle sostituzioni necessarie.

Per migliorare le prestazioni, il driver dmabuf può eseguire la manutenzione parziale della cache (vedi changelist). I client del kernel possono utilizzare le funzioni dma_buf_begin_cpu_access_partial e dma_buf_end_cpu_access_partial per eseguire la manutenzione parziale della cache.

Il kernel comune di Android contiene implementazioni modulari degli heap del sistema e dell'allocatore di memoria contigua (CMA) da utilizzare come riferimento per la modularizzazione degli heap.

Modifiche all'intestazione UAPI di ION

L'intestazione User Space API (UAPI) ION contiene un'enumerazione ion_heap_id da utilizzare per definire un intervallo di ID heap da utilizzare per gli heap dei fornitori.

 /**
 * ion_heap_id - list of heap IDs that Android can use
 *
 * @ION_HEAP_SYSTEM        ID for the ION_HEAP_TYPE_SYSTEM
 * @ION_HEAP_DMA_START     Start of reserved ID range for heaps of type ION_HEAP_TYPE_DMA
 * @ION_HEAP_DMA_END       End of reserved ID range for heaps of type ION_HEAP_TYPE_DMA
 * @ION_HEAP_CUSTOM_START  Start of reserved ID range for heaps of custom type
 * @ION_HEAP_CUSTOM_END    End of reserved ID range for heaps of custom type
 */

enum ion_heap_id {

   ION_HEAP_SYSTEM = (1 << ION_HEAP_TYPE_SYSTEM),

   ION_HEAP_DMA_START = (ION_HEAP_SYSTEM << 1),

   ION_HEAP_DMA_END = (ION_HEAP_DMA_START << 7),
   ION_HEAP_CUSTOM_START = (ION_HEAP_DMA_END << 1),

   ION_HEAP_CUSTOM_END = (ION_HEAP_CUSTOM_START << 22),
};

Inoltre, un nuovo IOCTL (ION_IOC_ABI_VERSION) può aiutare i client dello spazio utente a determinare se vengono utilizzati heap modulari.

Override dell'heap di sistema generico

L'heap di sistema ION è integrato e fa parte dell'immagine GKI per garantire che qualsiasi funzionalità che abbia bisogno di accedere a un heap generico/indipendente dal dispositivo possa dipendere dalla sua esistenza. Di conseguenza, non puoi sostituire l'ID heap di ION_HEAP_SYSTEM. Per creare un heap di sistema personalizzato, utilizza un ID heap nell'intervallo personalizzato (ION_HEAP_CUSTOM_START - ION_HEAP_CUSTOM_END) per eseguire le allocazioni.