Модульность ION Heaps для GKI

Многие OEM-производители Android модифицируют драйвер ядра ION по разным причинам, например, добавляют кучи поставщиков и настраивают управление кэшем (подробности об этих модификациях см. в разделе Интеграция распределителя памяти ION ). Чтобы позволить OEM-производителям сохранять такие модификации при использовании Generic Kernel Image (GKI) , Android Common Kernel v5.4 представляет структуру для модуляции куч ION, зависящих от поставщика, при сохранении встроенного основного драйвера 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 ) для выполнения выделений.