核心模組總覽

核心模組分為兩種:與硬體無關的 GKI 模組,以及與硬體相關的供應商模組。本頁面提供這兩種類型模組的總覽。

GKI 模組

通用核心映像檔 (GKI) 模組用於提供非啟動必要的核心功能,與通用核心分開。使用 GKI 模組時,您可以選擇要使用的特定核心功能,通常會縮減核心映像檔大小和執行階段記憶體用量。GKI 縮減大小後,非常適合 Android Go 裝置和其他資源受限的板型規格。

GKI 模組也提供機制,讓供應商在 KMI 凍結里程碑後納入新的上游功能。如果沒有建構其他映像檔,就無法取代內建程式碼,但以模組形式提供的程式碼則可由其他模組取代。

GKI 模組會使用核心的建構時間簽署基礎架構,在執行階段區分 GKI 和其他模組。只要未簽署的模組僅使用許可清單中顯示的符號,或由其他未簽署的模組提供,即可載入。

GKI 模組有兩種邏輯類型:受保護的 GKI 模組不受保護的 GKI 模組

受保護的 GKI 模組

受保護的 GKI 模組由 Google 提供,不會受到任何限制,載入後行為與使用核心建構的模組相同。此外,受保護的 GKI 模組具有下列特性:

  • 受保護的 GKI 模組可存取非 KMI 的核心符號,這些符號不適用於供應商模組或未受保護的 GKI 模組。
  • 只要受保護的 GKI 模組在符號清單中引用符號,即可匯出符號,成為 KMI 介面的一部分。
  • 受保護的 GKI 模組無法由供應商模組覆寫。

受保護的 GKI 模組是 GKI 模組的預設類別。KMI 凍結時,所有 GKI 模組都會受到保護。

未受保護的 GKI 模組

供應商模組可以覆寫未受保護的 GKI 模組。KMI 凍結後,如果 GKI 團隊決定供應商需要使用包含上游 Linux 新功能的版本,覆寫預設實作項目,受保護的 GKI 模組可能會重新分類為不受保護。在下一個 GKI 版本中,上游程式碼進入 Android Common Kernel (ACK) 後,未受保護的模組會重新分類為受保護的模組。未受保護的 GKI 模組具有下列特徵:

  • 未受保護的 GKI 模組與供應商模組一樣,可存取匯出的符號。
  • 未受保護的 GKI 模組無法匯出受保護 GKI 模組匯出的符號。
  • 未受保護的 GKI 模組必須保留所有 KMI 介面,如同核心核心的一部分。
  • 供應商模組可以覆寫未受保護的 GKI 模組。

供應商模組

合作夥伴會提供供應商模組,用於實作 SoC 和裝置專屬功能。任何未隨 GKI 核心提供的現有核心模組,都可以做為供應商模組提供。

GKI 專案的主要目標之一,是盡量減少核心核心中的硬體專屬程式碼,因此供應商可預期 GKI 核心不會納入明顯管理自家硬體的模組。舉例來說,如果供應商 ABC Inc. 不支援 CONFIG_ABC_SOC_SUPPORT,則可預期 CONFIG_ABC_SOC_SUPPORT 等設定不會啟用為內建或可載入的 GKI 模組。

如果 ACK 中有核心驅動程式或架構,但未以 GKI 核心的一部分形式提供,供應商可以修改驅動程式,並以供應商模組的形式提供。建議不要修改非供應商專屬的模組,因為在日後的版本中,GKI 核心可能會提供相同功能。如果 GKI 核心包含供應商模組提供的功能,系統就不會載入供應商模組。舉例來說,Android 11 中未針對 GKI 設定 CONFIG_GREYBUS,因此供應商可能會提供 Greybus 供應商模組。不過,CONFIG_GREYBUS 可能已在 Android 12 中啟用,做為 GKI 內建或模組,在這種情況下,系統不會載入 greybus 供應商模組。如果非廠商專屬驅動程式是以廠商模組的形式提供,最佳做法是使用上游版本。

您可以透過 vendorvendor_boot 圖片提供供應商模組。開機程序初期所需的模組必須位於 vendor_boot。 從 vendor_boot 載入模組會產生啟動時間費用。