多くのAndroidOEMは、ベンダーヒープの追加やキャッシュ管理のカスタマイズなど、さまざまな理由でIONカーネルドライバーを変更します(これらの変更の詳細については、IONメモリアロケーターの統合を参照してください)。ジェネリックカーネルイメージ(GKI)を使用するときにOEMがそのような変更を保持できるようにするために、Android Common Kernel v5.4は、コアIONドライバーを組み込みたまま、ベンダー固有のIONヒープをモジュール化するためのフレームワークを導入します。次の図はカーネルイメージのレイアウトを示しています。
図1.モジュール化されたIONカーネルドライバー
モジュラーIONヒープには、次の利点があります。
- IONコアドライバーはGKIイメージの一部にすることができ、デバイスに依存しないすべてのパフォーマンスの最適化とバグ修正をすべてのデバイスに到達させることができます。
- 共通カーネルのIONコアドライバーは、ヒープ登録を処理し、ユーザースペースおよびカーネルクライアントへのインターフェイスを管理できます。ベンダーヒープモジュールは、カスタムヒープ操作を実装するためにのみ必要です。
- IONコアドライバー(GKIの一部として)には、メモリ使用量の追跡を容易にするためのフックを含めることができます。これは、各OEMが独自のバージョンのIONドライバーを持っている場合には不可能でした。
- モジュラーベンダーのIONヒープは、将来の
dmabuf
ヒープへの移行を容易にするdmabuf
です。
実装
IONヒープモジュールは、独自のdmabuf
操作を登録して、コアIONドライバーによって登録された操作をオーバーライドできます。コアIONドライバーでサポートされていないdmabuf
操作( get_flags()
)は、ヒープ実装に必要なオーバーライドがない場合、 -EOPNOTSUPP
返します。
パフォーマンスを向上させるために、 dmabuf
ドライバーは部分的なキャッシュメンテナンスを実行できます(チェンジリストを参照)。カーネルクライアントが使用することができますdma_buf_begin_cpu_access_partial
とdma_buf_end_cpu_access_partial
部分キャッシュメンテナンスを行うための機能を。
Android Common Kernelには、システムのモジュラー実装と、ヒープのモジュール化のリファレンスとして使用するための連続メモリアロケーター(CMA)ヒープが含まれています。
IONUAPIヘッダーの変更
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を使用して割り当てを実行します。