GKI용 ION 힙 모듈화

다수의 Android OEM은 공급업체 힙 추가, 캐시 관리 맞춤설정과 같은 다양한 이유로 ION 커널 드라이버를 수정합니다(그러한 수정사항에 관한 세부정보는 ION 메모리 할당자 통합 참고). 일반 커널 이미지(GKI)를 사용할 때 OEM이 이러한 수정사항을 유지할 수 있도록 Android 일반 커널 v5.4는 코어 ION 드라이버를 그대로 내장하면서도 공급업체별 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_partialdma_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를 사용하여 할당을 진행합니다.