核心模組分為兩種:硬體無關的 GKI 模組和硬體專屬的供應商模組。本頁提供這兩種模組的總覽。
GKI 模組
通用核心映像檔 (GKI) 模組可與一般核心核心分開提供啟動必要核心功能。使用 GKI 模組,您可以選擇要使用的特定核心功能,通常可減少核心映像檔大小和執行階段記憶體用量。由於大小縮減,GKI 非常適合 Android Go 裝置和其他資源受限的板型規格。
GKI 模組也提供機制,可讓廠商在 KMI 凍結里程碑後整合新的上游功能。您必須先建構另一個映像檔,才能取代內建程式碼,但以模組形式提供的程式碼則可由其他模組取代。
GKI 模組使用核心的建構時間簽署基礎架構,在執行期間區分 GKI 和其他模組。只要未簽署的模組只使用許可清單中顯示的符號或其他未簽署模組提供的符號,即可載入。
GKI 模組有兩種邏輯型別:受保護的 GKI 模組和未受保護的 GKI 模組。
受保護的 GKI 模組
Google 提供的受保護 GKI 模組不會受到任何限制,且會在載入後以核心建構的方式運作。此外,受保護的 GKI 模組具有下列特性:
- 受保護的 GKI 模組可存取非 KMI 核心符號,供應商模組或未受保護的 GKI 模組則無法存取這些符號。
- 只要符號清單中引用了這些符號,受保護的 GKI 模組就能匯出成為 KMI 途徑的符號。
- 供應商模組無法覆寫受保護的 GKI 模組。
受保護的 GKI 模組是 GKI 模組的預設類別。KMI 凍結時,所有 GKI 模組都受到保護。
未受保護的 GKI 模組
未受保護的 GKI 模組可由供應商模組覆寫。如果 GKI 團隊決定供應商需要使用包含上游 Linux 新功能的版本覆寫預設實作項目,則在 KMI 凍結後,受保護的 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 內建或模組,在這種情況下,系統不會載入 greybus 供應商模組。如果非供應商專屬的驅動程式是以供應商模組的形式提供,最佳做法是使用上游版本。
您可以在 vendor
或 vendor_boot
映像檔中提供供應商模組。在啟動程序初期所需的模組必須位於 vendor_boot
中。從 vendor_boot
載入模組會產生相關的啟動時間費用。