Modularizar heaps ION para GKI

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.

Heaps ION modulares

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.