Modularizando ION Heaps para GKI

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 .

Heaps de Íons Modulares

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.