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