Многие 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
) для выполнения выделений.