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