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 Integração do alocador de memória ION ). Para permitir que os OEMs mantenham tais modificações ao usar a imagem genérica do kernel (GKI) , o Android Common Kernel v5.4 introduz uma estrutura para modularizar heaps ION específicos do fornecedor, mantendo o driver ION principal integrado. .
Figura 1. Driver de kernel ION modularizado
Os heaps ION modulares 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 cheguem a todos os dispositivos.
- O driver principal ION no kernel comum pode lidar com 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 customizadas.
- 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 do fornecedor modular devem facilitar quaisquer transições futuras para os heaps
dmabuf
.
Implementando
Os módulos de heap ION podem registrar suas próprias operações dmabuf
para substituir aquelas 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 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 changelist ). Os clientes do kernel podem usar as funções dma_buf_begin_cpu_access_partial
e dma_buf_end_cpu_access_partial
para realizar manutenção parcial do cache.
O Android Common Kernel contém implementações modulares do sistema e heaps de alocador de memória contíguo (CMA) para uso como referência para modularização de heap.
Mudanças 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 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 heaps modulares estão sendo usados.
Substituindo o heap genérico 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 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 customizado, use um ID de heap no intervalo customizado ( ION_HEAP_CUSTOM_START
a ION_HEAP_CUSTOM_END
) para executar alocações.