核心模組概述

有兩種類型的核心模組:與硬體無關的GKI 模組和特定於硬體的供應商模組。本頁提供了兩種類型模組的概述。

GKI模組

通用核心映像 (GKI) 模組用於提供獨立於通用核心核心的非啟動所需的核心功能。借助 GKI 模組,您可以選擇要使用的特定核心功能,通常可以減少核心映像大小和運行時記憶體消耗。尺寸的減少使得 GKI 非常適合 Android Go 裝置和其他資源受限的裝置。

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

GKI 模組使用核心的建置時簽署基礎設施來在執行時間區分 GKI 和其他模組。只要未簽署的模組僅使用出現在允許清單中或由其他未簽署的模組提供的符號,則允許載入未簽署的模組。

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

受保護的 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 ,因此供應商可能會提供灰色總線供應商模組。但是, CONFIG_GREYBUS可能在 Android 12 中作為 GKI 內建或模組啟用,在這種情況下,將不會載入灰色總線供應商模組。最佳實踐是使用非供應商特定驅動程式的上游版本(如果它們作為供應商模組提供)。

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