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

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

GKI モジュール

汎用カーネル イメージ(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 フリーズ後、GKI チームがベンダーがデフォルトの実装をアップストリーム Linux の新機能を含むバージョンでオーバーライドする必要があると判断した場合、保護された GKI モジュールは保護されていないものとして再分類される場合があります。次の GKI リリースで、保護されていないモジュールは、アップストリーム コードが Android 共通カーネル(ACK)に到着した後、保護されたものとして再分類されます。保護されていない GKI モジュールには次の特性があります。

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

ベンダー モジュール

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

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

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

ベンダー モジュールは、vendor または vendor_boot イメージで配信できます。起動プロセスの早い段階で必要なモジュールは、vendor_boot に存在する必要があります。起動時には、vendor_boot からのモジュールの読み込みに伴うコストが発生します。