多くの 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 システムヒープは GKI イメージの一部として組み込まれています。そのため、ION_HEAP_SYSTEM
のヒープ ID をオーバーライドすることはできません。カスタマイズされたシステムヒープを作成するには、カスタム範囲(ION_HEAP_CUSTOM_START
~ION_HEAP_CUSTOM_END
)のヒープ ID を使用して割り当てを行います。