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

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

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

GKI モジュール

一部の GKI カーネル機能はモジュールで配信されるため、この機能を必要としないデバイスの GKI カーネルのメモリ フットプリントを削減できます。このアーキテクチャには、ベンダーが KMI フリーズ マイルストーンの後に新しいアップストリーム機能を組み込めるメカニズムも用意されています。GKI モジュールは、カーネルビルド時間の鍵ペアを使用して Google によって署名され、ビルドされた GKI とのみ互換性があります。GKI カーネルと GKI モジュールの間には ABI の安定性がないため、実行時にモジュールを正しく読み込むには、カーネル モジュールと 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 からのモジュールの読み込みに伴うコストが発生します。