다수의 Android OEM은 공급업체 힙 추가, 캐시 관리 맞춤설정과 같은 다양한 이유로 ION 커널 드라이버를 수정합니다(그러한 수정사항에 관한 세부정보는 ION 메모리 할당자 통합 참고). 일반 커널 이미지(GKI)를 사용할 때 OEM이 이러한 수정사항을 유지할 수 있도록 Android 일반 커널 v5.4는 코어 ION 드라이버를 그대로 내장하면서도 공급업체별 ION 힙을 모듈화하는 프레임워크를 도입했습니다. 다음 그림은 커널 이미지 레이아웃을 보여줍니다.
그림 1. 모듈화된 ION 커널 드라이버
모듈식 ION 힙은 다음과 같은 이점을 제공합니다.
- ION 코어 드라이버를 GKI 이미지에 포함할 수 있기 때문에 기기에 독립적인 성능 최적화 및 버그 수정을 모든 기기에 빠짐없이 적용할 수 있습니다.
- 일반 커널의 ION 코어 드라이버가 힙 등록을 처리하고 사용자 공간 및 커널 클라이언트의 인터페이스를 관리할 수 있습니다. 공급업체 힙 모듈은 맞춤 힙 작업을 구현하는 작업에만 필요합니다.
- ION 코어 드라이버(GKI에 포함됨)에 보다 쉬운 메모리 사용 추적을 위한 후크를 포함할 수 있습니다. 이는 각 OEM이 고유한 ION 드라이버 버전을 사용할 때는 불가능한 일이었습니다.
- 모듈식 공급업체 ION 힙은 향후에 더 쉽게
dmabuf
힙으로 전환될 것입니다.
구현
ION 힙 모듈은 자체 dmabuf
작업을 등록하여, 코어 ION 드라이버에 의해 등록된 작업을 재정의할 수 있습니다. 코어 ION 드라이버에서 지원하지 않는 dmabuf
작업(예: get_flags()
)은 힙 구현에 필요한 재정의가 없는 경우 -EOPNOTSUPP
를 반환합니다.
성능 개선을 위해 dmabuf
드라이버는 부분 캐시 유지관리를 진행할 수 있습니다(변경목록 참고).
커널 클라이언트는 dma_buf_begin_cpu_access_partial
및 dma_buf_end_cpu_access_partial
함수를 사용하여 부분 캐시 유지관리를 진행할 수 있습니다.
Android 일반 커널에는 힙 모듈화에 관한 참조로 사용할 수 있도록 시스템 및 연속 메모리 할당자(CMA) 힙의 모듈식 구현이 포함되어 있습니다.
ION UAPI 헤더의 변경사항
ION 사용자 공간 API(UAPI) 헤더에는 공급업체 힙에 사용할 힙 ID 범위를 정의하는 데 사용할 수 있는 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 시스템 힙에 의존할 수 있도록 ION 시스템 힙은 내장형이며 GKI 이미지에 포함되어 있습니다. 따라서 ION_HEAP_SYSTEM
의 힙 ID를 재정의할 수 없습니다. 시스템 힙을 맞춤설정하려면 맞춤 범위(ION_HEAP_CUSTOM_START
~ION_HEAP_CUSTOM_END
)에 있는 힙 ID를 사용하여 할당을 진행합니다.