Muitos OEMs do Android modificam o driver do kernel ION por vários motivos, como adicionar heaps do fornecedor e personalizar o gerenciamento de cache. Para detalhes sobre essas modificações, consulte Como integrar o alocador de memória ION. Para permitir que os OEMs mantenham essas modificações ao usar a Imagem genérica do kernel (GKI), o Kernel comum do Android v5.4 apresenta um framework para modularizar heaps ION específicos do fornecedor, mantendo o principal driver ION integrado. A figura a seguir mostra o layout da imagem do kernel.
Figura 1. Driver do kernel ION modularizado
As heaps ION modulares têm as seguintes vantagens.
- O driver principal do ION pode fazer parte da imagem GKI, permitindo que todas as otimizações de desempenho e correções de bugs independentes do dispositivo sejam aplicadas a todos os dispositivos.
- O driver do núcleo ION no kernel comum pode processar o registro de heap e gerenciar a interface para clientes do espaço do usuário e 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 do ION (como parte da GKI) pode incluir ganchos para facilitar o rastreamento do uso de memória, o que não era possível quando cada OEM tinha a própria versão do driver do ION.
- Os montões ION modulares do fornecedor devem facilitar as transições futuras para
montões
dmabuf
.
Implementação
Os módulos de heap ION podem registrar as próprias operações dmabuf
para substituir as
registradas pelo driver principal do ION. Uma operação dmabuf
(como get_flags()
)
que não tem suporte do driver principal do ION retorna -EOPNOTSUPP
se a implementação
do 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 de 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 Kernel comum do Android contém implementações modulares do sistema e alocadores de memória contíguos (CMA, na sigla em inglês) para uso como referência para a modularização de heap.
Mudanças no cabeçalho da UAPI do ION
O cabeçalho da API ION do espaço do usuário (UAPI) contém um tipo enumerado ion_heap_id
para
definir um intervalo de IDs de heap para uso pelos heaps do fornecedor.
/**
* 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 do espaço do usuário
a determinar se as pilhas modulares estão sendo usadas.
Como substituir a heap genérica do sistema
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 do dispositivo possa depender da
existência dele. Portanto, não é possível substituir o ID do heap de ION_HEAP_SYSTEM
. Para
criar um heap do sistema personalizado, use um ID de heap no intervalo personalizado
(ION_HEAP_CUSTOM_START
a ION_HEAP_CUSTOM_END
) para realizar alocações.