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