Modularizar montón de ION para GKI

Muchos OEM de Android modifican el controlador del kernel ION por varias razones, como las siguientes: agregar montones de proveedores y personalizar la administración de la caché (para obtener detalles sobre estas modificaciones, consulta Integra la memoria ION asignador). Para permitir que los OEM conservar esas modificaciones cuando uses la imagen genérica del kernel (GKI), Android Kernel v5.4 común presenta un framework para modularizar ION específica del proveedor y mantener el controlador ION principal integrado. En la siguiente figura, se muestra diseño de la imagen de kernel.

Montones de ION modulares

Figura 1: Controlador de kernel ION modularizado

Los montón de ION modulares tienen las siguientes ventajas.

  • El controlador del núcleo de ION puede ser parte de la imagen de GKI, lo que permite y correcciones de errores independientes del dispositivo para llegar a todos dispositivos.
  • El controlador principal de ION en el kernel común puede controlar el registro de montón y administrar la interfaz para el espacio de usuario y los clientes de kernel. Los módulos de montón de los proveedores solo se necesitan para implementar operaciones de montón personalizadas.
  • El controlador del núcleo de ION (como parte de GKI) puede incluir hooks para facilitar la memoria. de uso, lo que no era posible si cada OEM tenía su propia versión de el controlador ION.
  • Los montones de ION modulares de proveedores deben realizar cualquier transición futura a montón dmabuf. y fácil de usar.

Implementación

Los módulos de montón de ION pueden registrar sus propias operaciones dmabuf para anular las que que registra el controlador principal de ION. Una operación dmabuf (como get_flags()) que no es compatible con el controlador principal de ION, muestra -EOPNOTSUPP si el montón no tiene las anulaciones necesarias.

Para mejorar el rendimiento, el controlador dmabuf puede realizar una caché parcial mantenimiento (consulta lista de cambios). Los clientes kernel pueden usar dma_buf_begin_cpu_access_partial y Funciones dma_buf_end_cpu_access_partial para realizar el mantenimiento parcial de la caché.

El kernel común de Android contiene implementaciones modulares del sistema y Montones de asignadores de memoria contiguos (CMA) para usar como referencia modularización.

Cambios en el encabezado de UAPI de ION

El encabezado de la API de espacio de usuario (UAPI) de ION contiene una enumeración ion_heap_id para usar en definir un rango de IDs de montón para que los usen los montón de los proveedores.

 /**
 * 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),
};

Además, un nuevo IOCTL (ION_IOC_ABI_VERSION) puede ayudar a los usuarios del espacio de clientes determinar si se están usando montones modulares.

Anula el montón genérico del sistema

El montón del sistema de ION está integrado y forma parte de la imagen de GKI para garantizar que cualquier que necesita acceso a un montón genérico o independiente del dispositivo puede depender de su existencia. Por lo tanto, no puedes anular el ID de montón de ION_HEAP_SYSTEM. Para crear un montón de sistema personalizado, usar un ID de montón en el rango personalizado (de ION_HEAP_CUSTOM_START a ION_HEAP_CUSTOM_END) para realizar asignaciones.