Molti OEM Android modificano il driver del kernel ION per vari motivi, ad esempio: l'aggiunta di heap dei fornitori e la personalizzazione della gestione della cache (per maggiori dettagli modifiche, fai riferimento all'articolo Integrazione della memoria ION allocatore). Per consentire agli OEM di conservano queste modifiche quando si usa la classe Generic Kernel Image (GKI), Android Common Kernel v5.4 introduce un framework per la modularizzazione di ION specifici del fornitore heap mantenendo integrato il driver ION principale. La figura seguente mostra layout dell'immagine kernel.
Figura 1. Driver kernel ION modularizzato
Gli heap ION modulari hanno i seguenti vantaggi.
- Il driver principale ION può far parte dell'immagine GKI, abilitando tutti ottimizzazioni delle prestazioni e correzioni di bug indipendenti dal dispositivo per dispositivi mobili.
- Il driver principale ION nel kernel comune può gestire la registrazione dell'heap e gestire l'interfaccia con lo spazio utente e i client kernel. I moduli heap del fornitore sono richieste solo per implementare le operazioni heap personalizzate.
- Il driver principale ION (come parte di GKI) può includere hook per facilitare la memoria del monitoraggio dell'utilizzo, cosa non possibile quando ogni OEM aveva la propria versione il driver ION.
- Gli heap ION del fornitore modulare dovrebbero eseguire eventuali transizioni future agli heap
dmabuf
è più facile.
Implementazione
I moduli heap ION possono registrare le proprie operazioni dmabuf
per sostituire quelle
registrati dal driver ION principale. Un'operazione dmabuf
(ad esempio get_flags()
)
non supportato dal driver ION principale restituisce -EOPNOTSUPP
se l'heap
non richiede gli override necessari.
Per migliorare le prestazioni, il driver dmabuf
può eseguire la cache parziale
manutenzione (vedi
elenco modifiche).
I client del kernel possono utilizzare dma_buf_begin_cpu_access_partial
e
Funzioni dma_buf_end_cpu_access_partial
per eseguire la manutenzione parziale della cache.
Il kernel comune di Android contiene implementazioni modulari del sistema e heap contigui allocator di memoria (CMA) da utilizzare come riferimento per gli heap modularizzazione.
Modifiche all'intestazione UAPI ION
L'intestazione User Space API (UAPI) ION contiene un'enumerazione ion_heap_id
da utilizzare in
la definizione di un intervallo di ID heap da usare 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 clienti dello spazio utente
determinare se vengono utilizzati heap modulari.
Override dell'heap di sistema generico
L'heap del sistema ION è integrato e fa parte dell'immagine GKI per garantire
la funzionalità che richiede l'accesso a un heap generico/indipendente dal dispositivo può dipendere
la loro esistenza. Di conseguenza, non puoi sostituire l'ID heap di ION_HEAP_SYSTEM
. A
crea un heap di sistema personalizzato, utilizza un ID heap nell'intervallo personalizzato
(da ION_HEAP_CUSTOM_START
a ION_HEAP_CUSTOM_END
) per eseguire le allocazioni.