Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る
このページは Cloud Translation API によって翻訳されました。
Switch to English

GKI用のIONヒープのモジュール化

多くのAndroidOEMは、ベンダーヒープの追加やキャッシュ管理のカスタマイズなど、さまざまな理由でIONカーネルドライバーを変更します(これらの変更の詳細については、IONメモリアロケーターの統合を参照してください)。ジェネリックカーネルイメージ(GKI)を使用するときにOEMがそのような変更を保持できるようにするために、Android Common Kernel v5.4は、コアIONドライバーを組み込みたまま、ベンダー固有の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_partialdma_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),
};

さらに、新しいIOCTLION_IOC_ABI_VERSION )は、ユーザースペースクライアントがモジュラーヒープが使用されているかどうかを判断するのに役立ちます。

汎用システムヒープのオーバーライド

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