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 consulte Como integrar a memória ION allocator). Para permitir que OEMs reter essas modificações ao usar a imagem genérica do Kernel (GKI), Android O Common Kernel v5.4 apresenta um framework para modularizar o ION específico do fornecedor heaps, mantendo o driver ION principal integrado. A figura a seguir mostra layout de imagem do kernel.
Figura 1. Driver de kernel ION modularizado
As heaps ION modulares têm as seguintes vantagens.
- O driver principal ION pode fazer parte da imagem GKI, permitindo que todos otimizações de desempenho independentes de dispositivo e correções de bug para atingir todos dispositivos.
- O driver principal ION no kernel comum pode lidar com registro de heap e gerenciar a interface para o espaço do usuário e os clientes kernel. Os módulos de heap do fornecedor são necessárias apenas para implementar as operações personalizadas de heap.
- O driver principal ION, como parte da GKI, pode incluir ganchos para facilitar a memória. rastreamento de uso, o que não era possível quando cada OEM tinha sua própria versão do do driver ION.
- Os heaps ION modulares do fornecedor precisam fazer todas as transições futuras para heaps
dmabuf
mais fácil.
Implementação
Os módulos de heap ION podem registrar as próprias operações dmabuf
para substituir as
registrados pelo driver ION principal. Uma operação dmabuf
(como get_flags()
)
incompatível com o driver ION principal retornará -EOPNOTSUPP
se o heap
implementação não tem as substituições necessárias.
Para melhorar o desempenho, o driver dmabuf
pode executar o cache parcial
manutenção (consulte
lista de mudanças).
Os clientes de kernel podem usar as APIs dma_buf_begin_cpu_access_partial
e
dma_buf_end_cpu_access_partial
para executar a manutenção parcial do cache.
O kernel comum do Android contém implementações modulares do sistema e heaps de alocação de memória contígua (CMA, na sigla em inglês) para uso como referência para heap modularização.
Mudanças no cabeçalho ION UAPI
O cabeçalho da API ION User Space (UAPI) contém um tipo enumerado ion_heap_id
para uso no
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
determinar se heaps modulares estão sendo usados.
Como substituir a heap genérica do sistema
O heap do sistema ION é integrado e faz parte da imagem GKI para garantir que
que precisa de acesso a uma heap genérica/independente de dispositivo pode depender
da existência deles. Dessa forma, não é possível substituir o ID de heap de ION_HEAP_SYSTEM
. Para
criar uma heap do sistema personalizada, usar um ID de heap no intervalo personalizado
(de ION_HEAP_CUSTOM_START
a ION_HEAP_CUSTOM_END
) para executar alocações.