Модуляция ION Heaps для GKI

Многие OEM-производители Android модифицируют драйвер ядра ION по разным причинам, например, добавляя кучи поставщиков и настраивая управление кэшем (подробнее об этих модификациях см. в разделе «Интеграция распределителя памяти ION »). Чтобы OEM-производители могли сохранять такие изменения при использовании общего образа ядра (GKI) , в Android Common Kernel v5.4 представлена ​​платформа для модульной организации куч ION, зависящих от конкретного поставщика, при сохранении встроенного основного драйвера ION. На следующем рисунке показан макет образа ядра. .

Модульные ИОННЫЕ Кучи

Рис. 1. Модульный драйвер ядра ION.

Модульные кучи ION имеют следующие преимущества.

  • Драйвер ядра ION может быть частью образа GKI, обеспечивая возможность оптимизации производительности и исправлений ошибок, не зависящих от устройства, для всех устройств.
  • Драйвер ядра ION в общем ядре может обрабатывать регистрацию кучи и управлять интерфейсом с пользовательским пространством и клиентами ядра. Модули кучи поставщика необходимы только для реализации пользовательских операций с кучей.
  • Драйвер ядра ION (как часть GKI) может включать в себя перехватчики для упрощения отслеживания использования памяти, что было невозможно, когда у каждого OEM-производителя была своя собственная версия драйвера ION.
  • Модульные кучи ION от поставщиков должны упростить любые будущие переходы к кучам dmabuf .

Реализация

Модули кучи ION могут регистрировать свои собственные операции dmabuf , чтобы переопределить операции, зарегистрированные основным драйвером ION. Операция dmabuf (например, get_flags() ), которая не поддерживается основным драйвером ION, возвращает -EOPNOTSUPP , если в реализации кучи отсутствуют необходимые переопределения.

Для повышения производительности драйвер dmabuf может выполнять частичное обслуживание кэша (см. список изменений ). Клиенты ядра могут использовать функции dma_buf_begin_cpu_access_partial и dma_buf_end_cpu_access_partial для частичного обслуживания кэша.

Общее ядро ​​Android содержит модульные реализации кучи системы и непрерывного распределителя памяти (CMA) для использования в качестве эталона для модуляризации кучи.

Изменения в заголовке ION UAPI

Заголовок API пользовательского пространства ION (UAPI) содержит перечисление ion_heap_id для использования при определении диапазона идентификаторов кучи для использования кучами поставщиков.

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

Кроме того, новый IOCTL ( ION_IOC_ABI_VERSION ) может помочь клиентам пользовательского пространства определить, используются ли модульные кучи.

Переопределение общей системной кучи

Системная куча ION встроена и является частью образа GKI, чтобы гарантировать, что любая функция, которой требуется доступ к общей/независимой от устройства куче, может зависеть от ее существования. Таким образом, вы не можете переопределить идентификатор кучи ION_HEAP_SYSTEM . Чтобы создать настраиваемую системную кучу, используйте идентификатор кучи в настраиваемом диапазоне (от ION_HEAP_CUSTOM_START до ION_HEAP_CUSTOM_END ) для выполнения выделения.