內核模塊概述

有兩種類型的內核模塊:與硬件無關的GKI 模塊和特定於硬件的供應商模塊。此頁面提供了兩種類型的模塊的概述。

GKI模塊

通用內核映像 (GKI) 模塊用於提供獨立於通用核心內核的非啟動所需的內核功能。使用 GKI 模塊,您可以選擇要使用的特定內核功能,通常可以減少內核映像大小和運行時內存消耗。尺寸的減小使 GKI 非常適合 Android Go 設備和其他資源受限的外形規格。

GKI 模塊還提供了一種機制,允許供應商在 KMI 凍結里程碑之後合併新的上游功能。如果不構建另一個圖像,則無法替換內置代碼,而作為模塊交付的代碼可以由另一個模塊替換。

GKI 模塊使用內核的構建時簽名基礎結構在運行時區分 GKI 和其他模塊。允許加載未簽名模塊,只要它們僅使用出現在白名單上或由其他未簽名模塊提供的符號。

GKI模塊有兩種邏輯類型: protected GKI moduleunprotected GKI module

受保護的 GKI 模塊

受保護的 GKI 模塊由 Google 提供,不受任何限制,並且在加載後就像使用內核構建一樣。此外,受保護的 GKI 模塊具有以下特徵:

  • 受保護的 GKI 模塊可以訪問供應商模塊或未受保護的 GKI 模塊無法使用的非 KMI 內核符號。
  • 受保護的 GKI 模塊可以導出成為 KMI 表面一部分的符號,只要這些符號在符號列表中被引用即可。
  • 受保護的 GKI 模塊不能被供應商模塊覆蓋。

受保護的 GKI 模塊是 GKI 模塊的默認類別。在 KMI 凍結時,所有 GKI 模塊都被認為是受保護的。

未受保護的 GKI 模塊

未受保護的 GKI 模塊可以被供應商模塊覆蓋。在 KMI 凍結後,如果 GKI 團隊決定供應商需要使用包含來自上游 Linux 的新功能的版本覆蓋默認實現,則受保護的 GKI 模塊可能會被重新分類為不受保護。在下一個 GKI 版本中,未受保護的模塊在上游代碼登陸 Android 通用內核 (ACK) 後被重新分類為受保護。未受保護的 GKI 模塊具有以下特點:

  • 未受保護的 GKI 模塊與供應商模塊具有相同的導出符號訪問權限。
  • 未受保護的 GKI 模塊無法導出受保護的 GKI 模塊導出的符號。
  • 未受保護的 GKI 模塊必須保留任何 KMI 接口,就像核心內核的一部分一樣。
  • 未受保護的 GKI 模塊可以被供應商模塊覆蓋。

供應商模塊

供應商模塊由合作夥伴提供,以實現 SoC 和特定於設備的功能。任何未作為 GKI 內核的一部分提供的現有內核模塊都可以作為供應商模塊提供。

由於 GKI 項目的主要目標之一是盡量減少核心內核中特定於硬件的代碼,供應商可以預期 GKI 內核不會包含明確管理自己硬件的模塊。例如,供應商 ABC Inc 可以預期,如果沒有它們的支持, CONFIG_ABC_SOC_SUPPORT之類的配置將不會作為內置或可加載的 GKI 模塊啟用。

如果內核驅動程序或框架存在於 ACK 中,但未作為 GKI 內核的一部分提供,供應商可以修改驅動程序並將其作為供應商模塊提供。不鼓勵對非特定於供應商的模塊進行此類修改,因為在未來的版本中 GKI 內核可能會提供相同的功能。當 GKI 內核包含供應商模塊提供的功能時,供應商模塊將不會加載。例如,Android 11 中沒有為 GKI 設置CONFIG_GREYBUS ,因此供應商可能會提供 greybus 供應商模塊。但是, CONFIG_GREYBUS可能作為 GKI 內置模塊或 Android 12 中的模塊啟用,在這種情況下,不會加載 greybus 供應商模塊。最佳做法是使用非供應商特定驅動程序的上游版本(如果它們作為供應商模塊提供)。

您可以在vendorvendor_boot映像中提供供應商模塊。引導過程早期所需的模塊必須在vendor_boot中。從vendor_boot加載模塊會產生啟動時間成本。