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_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),
};

また、新しい IOCTLION_IOC_ABI_VERSION)により、モジュール ヒープが使用されているかどうかをユーザー空間のクライアントが特定できます。

汎用システムヒープをオーバーライドする

汎用のヒープまたはデバイスに依存しないヒープにアクセスする必要がある機能が依存できるよう、ION システムヒープは GKI イメージの一部として組み込まれています。そのため、ION_HEAP_SYSTEM のヒープ ID をオーバーライドすることはできません。カスタマイズされたシステムヒープを作成するには、カスタム範囲(ION_HEAP_CUSTOM_STARTION_HEAP_CUSTOM_END)のヒープ ID を使用して割り当てを行います。