Modularizzazione degli heap ION per GKI

Molti OEM Android modificano il driver del kernel ION per vari motivi, come l'aggiunta di heap del fornitore e la personalizzazione della gestione della cache (per dettagli su queste modifiche, fare riferimento a Integrazione dell'allocatore di memoria ION ). Per consentire agli OEM di conservare tali modifiche quando utilizzano Generic Kernel Image (GKI) , Android Common Kernel v5.4 introduce un framework per la modularizzazione degli heap ION specifici del fornitore mantenendo integrato il driver ION principale. La figura seguente mostra il layout dell'immagine del kernel .

Cumuli di IONI modulari

Figura 1. Driver del kernel ION modularizzato

Gli heap ION modulari presentano i seguenti vantaggi.

  • Il driver core ION può far parte dell'immagine GKI, consentendo a tutte le ottimizzazioni delle prestazioni indipendenti dal dispositivo e alle correzioni di bug di raggiungere tutti i dispositivi.
  • Il driver principale ION nel kernel comune può gestire la registrazione dell'heap e gestire l'interfaccia con lo spazio utente e i client del kernel. I moduli heap del fornitore sono necessari solo per implementare le operazioni heap personalizzate.
  • Il driver principale ION (come parte della GKI) può includere hook per un monitoraggio più semplice dell'utilizzo della memoria, cosa che non era possibile quando ogni OEM aveva la propria versione del driver ION.
  • Gli heap ION del fornitore modulare dovrebbero rendere più semplice qualsiasi futura transizione agli heap dmabuf .

Implementazione

I moduli heap ION possono registrare le proprie operazioni dmabuf per sovrascrivere quelle registrate dal driver ION principale. Un'operazione dmabuf (come get_flags() ) che non è supportata dal driver ION principale restituisce -EOPNOTSUPP se nell'implementazione dell'heap mancano le sovrascritture necessarie.

Per migliorare le prestazioni, il driver dmabuf può eseguire una manutenzione parziale della cache (vedi changelist ). I client 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 Android contiene implementazioni modulari del sistema e heap CMA (Contiguous Memory Allocator) da utilizzare come riferimento per la modularizzazione degli heap.

Modifiche all'intestazione ION UAPI

L'intestazione ION User Space API (UAPI) contiene un'enumerazione ion_heap_id da utilizzare per definire un intervallo di ID heap da utilizzare da parte degli heap del fornitore.

 /**
 * 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.

Sostituire l'heap di sistema generico

L'heap del sistema ION è integrato e fa parte dell'immagine GKI per garantire che qualsiasi funzionalità che necessita dell'accesso a un heap generico/indipendente dal dispositivo possa dipendere dalla sua esistenza. Pertanto, non è possibile sovrascrivere l'ID heap di ION_HEAP_SYSTEM . Per creare un heap di sistema personalizzato, utilizzare un ID heap nell'intervallo personalizzato (da ION_HEAP_CUSTOM_START a ION_HEAP_CUSTOM_END ) per eseguire le allocazioni.