カーネルモジュールの概要

カーネル モジュールには、ハードウェアに依存しないGKI モジュールとハードウェア固有のベンダー モジュールの 2 種類があります。このページでは、両方のタイプのモジュールの概要を説明します。

GKI モジュール

Generic Kernel Image (GKI) モジュールは、一般的なコア カーネルとは別に、ブートを必要としないカーネル機能を提供するために使用されます。 GKI モジュールを使用すると、使用する特定のカーネル機能を選択できるため、多くの場合、カーネル イメージのサイズとランタイム メモリの消費量が削減されます。サイズの縮小により、GKI は Android Go デバイスやその他のリソースが制限されたフォーム ファクターに適しています。

GKI モジュールは、ベンダーが KMI フリーズ マイルストーンの後に新しいアップストリーム機能を組み込むためのメカニズムも提供します。組み込みコードは、別のイメージをビルドしない限り置き換えることはできませんが、モジュールとして提供されるコードは別のモジュールに置き換えることができます。

GKI モジュールは、カーネルのビルド時の署名インフラストラクチャを使用して、実行時に GKI と他のモジュールを区別します。署名されていないモジュールは、許可リストに表示されているか、他の署名されていないモジュールによって提供されているシンボルのみを使用する限り、ロードできます。

GKI モジュールには、保護された GKI モジュール保護されていない GKI モジュールの 2 つの論理タイプがあります。

保護された GKI モジュール

保護された GKI モジュールは Google によって提供され、まったく制限されず、ロード後にカーネルで構築されたかのように動作します。さらに、保護された GKI モジュールには次の特徴があります。

  • 保護された GKI モジュールは、ベンダー モジュールまたは保護されていない GKI モジュールでは使用できない非 KMI カーネル シンボルにアクセスできます。
  • 保護された GKI モジュールは、シンボルがシンボル リストで引用されている限り、KMI サーフェスの一部になるシンボルをエクスポートできます。
  • 保護された GKI モジュールは、ベンダー モジュールによってオーバーライドできません。

保護された GKI モジュールは、GKI モジュールのデフォルト クラスです。すべての GKI モジュールは、KMI フリーズ時に保護されていると見なされます。

保護されていない GKI モジュール

保護されていない GKI モジュールは、ベンダー モジュールによってオーバーライドされる可能性があります。 KMI フリーズ後、ベンダーがデフォルトの実装をアップストリーム Linux の新機能を含むバージョンでオーバーライドする必要があると GKI チームが判断した場合、保護された GKI モジュールは保護されていないものとして再分類される可能性があります。次の GKI リリースでは、保護されていないモジュールは、アップストリーム コードが Android Common Kernel (ACK) に到着した後、保護されているモジュールとして再分類されます。保護されていない GKI モジュールには、次の特性があります。

  • 保護されていない GKI モジュールは、ベンダー モジュールと同じように、エクスポートされたシンボルにアクセスできます。
  • 保護されていない GKI モジュールは、保護された GKI モジュールによってエクスポートされたシンボルをエクスポートできません。
  • 保護されていない GKI モジュールは、コア カーネルの一部であるかのように、KMI インターフェイスを保持する必要があります。
  • 保護されていない GKI モジュールは、ベンダー モジュールによってオーバーライドされる可能性があります。

ベンダー モジュール

ベンダー モジュールは、SoC およびデバイス固有の機能を実装するためにパートナーによって提供されます。 GKI カーネルの一部として提供されていない既存のカーネル モジュールは、ベンダー モジュールとして提供できます。

GKI プロジェクトの主な目標の 1 つは、コア カーネル内のハードウェア固有のコードを最小限に抑えることであるため、ベンダーは、独自のハードウェアを明確に管理しているモジュールが GKI カーネルに含まれないことを期待できます。たとえば、ベンダー ABC Inc は、 CONFIG_ABC_SOC_SUPPORTなどの構成が、サポートなしでは組み込みまたは読み込み可能な GKI モジュールとして有効にされないことを期待できます。

カーネル ドライバーまたはフレームワークが ACK に存在するが、GKI カーネルの一部として提供されていない場合、ベンダーはドライバーを変更してベンダー モジュールとして提供できます。将来のリリースで同じ機能が GKI カーネルで提供される可能性があるため、このような変更は非ベンダー固有のモジュールにはお勧めできません。 GKI カーネルにベンダー モジュールによって提供される機能が含まれている場合、ベンダー モジュールは読み込まれません。たとえば、 CONFIG_GREYBUSは Android 11 の GKI 用に設定されていないため、ベンダーはグレーバス ベンダー モジュールを提供する場合があります。ただし、Android 12 ではCONFIG_GREYBUSが GKI 組み込みまたはモジュールとして有効になっている可能性があります。その場合、greybus ベンダー モジュールは読み込まれません。ベスト プラクティスは、非ベンダー固有のドライバーがベンダー モジュールとして提供されている場合、それらのアップストリーム バージョンを使用することです。

vendorまたはvendor_bootイメージでベンダー モジュールを配信できます。ブート プロセスの早い段階で必要なモジュールは、 vendor_bootにある必要があります。 vendor_bootからのモジュールのロードに関連する起動時間のコストがあります。