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 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. .

Pilhas ION Modulares

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.