Modularizza gli heap ION per GKI

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.

Heap ION modulari

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.
di Gemini Advanced.

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.