Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Modularización de montones de ION para GKI

Muchos fabricantes de equipos originales Android modificar conductor del ION del núcleo, por diversas razones, tales como la adición de un montón de proveedores y personalización de gestión de la caché (para más detalles sobre estas modificaciones, consulte Integración del asignador de memoria ION ). Para permitir que los fabricantes de equipos para retener dichas modificaciones cuando se utiliza el núcleo genérico de imagen (GKI) , Android V5.4 Común del núcleo presenta un marco para la modularización montones ION de proveedores específicos, manteniendo el conductor central ion incorporada. La siguiente figura muestra el diseño de la imagen del kernel .

Montones modulares de ION

Controlador del núcleo Figura 1. modularizado ION

Los montones modulares de ION tienen las siguientes ventajas.

  • El controlador principal de ION puede ser parte de la imagen GKI, lo que permite que todas las optimizaciones de rendimiento independientes del dispositivo y las correcciones de errores lleguen a todos los dispositivos.
  • El controlador principal de ION en el kernel común puede manejar el registro del montón y administrar la interfaz para el espacio de usuario y los clientes del kernel. Los módulos de almacenamiento dinámico del proveedor solo son necesarios para implementar las operaciones de almacenamiento dinámico personalizadas.
  • El controlador principal de ION (como parte del GKI) puede incluir ganchos para facilitar el seguimiento del uso de la memoria, lo que no era posible cuando cada OEM tenía su propia versión del controlador ION.
  • Modulares montones ION vendedor debe realizar ningún transiciones futuras para dmabuf montones más fácil.

Implementar

Módulos ION montón pueden registrar sus propios dmabuf operaciones para anular las registradas por el conductor de núcleo ION. A dmabuf operación (como get_flags() ) que no está soportada por el núcleo ION vuelve conductor -EOPNOTSUPP si la implementación montón carece de las sustituciones necesarias.

Para mejorar el rendimiento, la dmabuf conductor puede realizar el mantenimiento de memoria caché parcial (véase la lista de cambios ). Clientes del kernel pueden utilizar los dma_buf_begin_cpu_access_partial y dma_buf_end_cpu_access_partial funciones para realizar el mantenimiento caché parcial.

El núcleo común de Android contiene implementaciones modulares del sistema y montones de asignadores de memoria contigua (CMA) para usar como referencia para la modularización del montón.

Cambios en el encabezado ION UAPI

El espacio de usuario ION API (UAPI) encabezado contiene un ion_heap_id enum para su uso en la definición de un intervalo de identificadores de montón para su uso por montones de 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 clientes de espacio de usuario a determinar si se están utilizando montones modulares.

Anulación del montón del sistema genérico

El montón del sistema ION está integrado y es parte de la imagen GKI para garantizar que cualquier función que necesite acceso a un montón genérico / independiente del dispositivo pueda depender de su existencia. Como tal, no se puede anular el ID montón de ION_HEAP_SYSTEM . Para crear un montón sistema personalizado, utilizar un ID de montón en el rango personalizado ( ION_HEAP_CUSTOM_START a ION_HEAP_CUSTOM_END ) para realizar asignaciones.