Muitos OEMs do Android modificam o driver do kernel ION por vários motivos, como adicionar heaps de fornecedores e personalizar o gerenciamento de cache (para obter detalhes sobre essas modificações, consulte Integrando o alocador de memória ION ). Para permitir que os OEMs retenham essas modificações ao usar o Generic Kernel Image (GKI) , o Android Common Kernel v5.4 apresenta uma estrutura para modularizar heaps ION específicos do fornecedor, mantendo o driver ION principal integrado. A figura a seguir mostra o layout da imagem do kernel .

Figura 1. Driver de kernel ION modularizado
Os heaps modulares de ION têm as seguintes vantagens.
- O driver principal ION pode fazer parte da imagem GKI, permitindo que todas as otimizações de desempenho independentes de dispositivo e correções de bugs alcancem todos os dispositivos.
- O driver principal ION no kernel comum pode manipular o registro de heap e gerenciar a interface para o espaço do usuário e clientes do kernel. Os módulos de heap do fornecedor são necessários apenas para implementar as operações de heap personalizadas.
- O driver principal ION (como parte do GKI) pode incluir ganchos para facilitar o rastreamento do uso de memória, o que não era possível quando cada OEM tinha sua própria versão do driver ION.
- Os heaps ION de fornecedores modulares devem facilitar quaisquer transições futuras para heaps
dmabuf.
Implementação
Os módulos de heap ION podem registrar suas próprias operações dmabuf para substituir as registradas pelo driver ION principal. Uma operação dmabuf (como get_flags() ) que não é suportada pelo driver ION principal retorna -EOPNOTSUPP se a implementação de heap não tiver as substituições necessárias.
Para melhorar o desempenho, o driver dmabuf pode realizar manutenção parcial do cache (consulte a lista de alterações ). Os clientes do kernel podem usar as funções dma_buf_begin_cpu_access_partial e dma_buf_end_cpu_access_partial para realizar a manutenção parcial do cache.
O Android Common Kernel contém implementações modulares do sistema e heaps do alocador de memória contígua (CMA) para uso como referência para modularização de heap.
Alterações no cabeçalho ION UAPI
O cabeçalho ION user space API (UAPI) contém uma enumeração ion_heap_id para uso na definição de um intervalo de IDs de heap para uso por heaps de fornecedores.
/**
* 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),
};
Além disso, um novo IOCTL ( ION_IOC_ABI_VERSION ) pode ajudar os clientes de espaço do usuário a determinar se os heaps modulares estão sendo usados.
Substituindo o heap do sistema genérico
O heap do sistema ION é integrado e faz parte da imagem GKI para garantir que qualquer recurso que precise de acesso a um heap genérico/independente de dispositivo possa depender de sua existência. Como tal, você não pode substituir o ID de heap de ION_HEAP_SYSTEM . Para criar um heap de sistema personalizado, use um ID de heap no intervalo personalizado ( ION_HEAP_CUSTOM_START a ION_HEAP_CUSTOM_END ) para realizar alocações.