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