Android 8.0'de kullanıma sunulan modül çekirdek koşulları kapsamında, tüm çip üzerinde sistem (SoC) çekirdekleri, yüklenebilir çekirdek modüllerini desteklemelidir.
Çekirdek yapılandırma seçenekleri
Yüklenebilir çekirdek modüllerini desteklemek için tüm yaygın çekirdeklerde android-base.config aşağıdaki çekirdek yapılandırma seçeneklerini (veya çekirdek sürümü eşdeğerlerini) içerir:
CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODVERSIONS=y
Tüm cihaz çekirdekleri bu seçenekleri etkinleştirmelidir. Çekirdek modülleri de mümkün olduğunda kaldırmayı ve yeniden yüklemeyi desteklemelidir.
Modül imzalama
GKI tedarikçi firma modülleri için modül imzalama desteklenmez. Doğrulanmış başlatmayı desteklemesi gereken cihazlarda Android, çekirdek modüllerinin dm-verity'nin etkin olduğu bölümde olmasını gerektirir. Bu sayede, modüllerin özgünlüklerini doğrulamak için ayrı ayrı imzalanmaları gerekmez.
Android 13'te GKI modülleri kavramı tanıtıldı. GKI modülleri, GKI ile diğer modülleri çalışma zamanında ayırt etmek için çekirdeğin derleme zamanında imzalama altyapısını kullanır.
Yalnızca izin verilenler listesinde görünen veya diğer imzasız modüller tarafından sağlanan sembolleri kullandıkları sürece imzasız modüllerin yüklenmesine izin verilir.
GKI çekirdeği yapılandırmasında, çekirdeğin derleme zamanı anahtar çifti kullanılarak GKI derleme sırasında GKI modüllerinin imzalanmasını kolaylaştırmak için CONFIG_MODULE_SIG_ALL=y
etkinleştirildi.
Cihaz çekirdek derlemeleri sırasında GKI dışı modüllerin imzalanmasını önlemek için çekirdek yapılandırma parçalarınızın bir parçası olarak # CONFIG_MODULE_SIG_ALL is not set
eklemeniz gerekir.
Dosya konumları
Android 7.x ve önceki sürümler, çekirdek modüllerini zorunlu tutmasa da (ve insmod
ile rmmod
için destek sunsa da) Android 8.x ve sonraki sürümler, ekosistemde çekirdek modüllerinin kullanılmasını önerir. Aşağıdaki tabloda, üç Android önyükleme modunda gereken, anakarta özel çevre birimi desteği gösterilmektedir.
Başlatma modu | Depolama | Ekran | Tuş takımı | Pil | PMIC | Dokunmatik ekran | NFC, kablosuz ağ, Bluetooth |
Sensörler | Kamera |
---|---|---|---|---|---|---|---|---|---|
Kurtarma | |||||||||
Şarj cihazı | |||||||||
Android |
Çekirdek modülleri, Android önyükleme modlarında kullanılabilirliklerine ek olarak sahipliklerine (SoC tedarikçisi veya ODM) göre de sınıflandırılabilir. Çekirdek modülleri kullanılıyorsa dosya sistemine yerleştirilmeleriyle ilgili şartlar şunlardır:
- Tüm çekirdeklerde, bölüm önyükleme ve bağlama için yerleşik destek olmalıdır.
- Çekirdek modülleri salt okunur bir bölümden yüklenmelidir.
- Doğrulanmış başlatma modunun gerekli olduğu cihazlarda çekirdek modülleri, doğrulanmış bölümlerden yüklenmelidir.
- Çekirdek modülleri
/system
içinde bulunmamalıdır. - Cihaz için gerekli GKI modülleri,
/system_dlkm/lib/modules
için sembolik bir bağlantı olan/system/lib/modules
adresinden yüklenmelidir. - Tam Android veya Şarj modları için gerekli olan SoC tedarikçisinin çekirdek modülleri
/vendor/lib/modules
içinde olmalıdır. - Bir ODM bölümü varsa ODM'den tam Android veya Şarj modları için gereken çekirdek modülleri
/odm/lib/modules
içinde bulunmalıdır. Aksi takdirde bu modüller/vendor/lib/modules
içinde olmalıdır. - SoC tedarikçisinden ve ODM'den gelen, Kurtarma Modu için gereken çekirdek modülleri,
/lib/modules
adresindeki kurtarmaramfs
bölümünde bulunmalıdır. - Hem Kurtarma modu hem de tam Android veya Şarj cihazı modları için gereken çekirdek modülleri hem kurtarma
rootfs
hem de/vendor
veya/odm
bölümlerinde (yukarıda açıklandığı gibi) bulunmalıdır. - Kurtarma modunda kullanılan çekirdek modülleri, bu bölümler Kurtarma modunda monte edilmediğinden yalnızca
/vendor
veya/odm
bölümünde bulunan modüllere bağlı olmamalıdır. - SoC tedarikçisi çekirdek modülleri, ODM çekirdek modüllerine bağlı olmamalıdır.
Android 7.x ve önceki sürümlerde /vendor
ve /odm
bölümlerinin erken bağlantı noktası yoktur. Android 8.x ve sonraki sürümlerde, bu bölümlerden modül yüklemeyi mümkün kılmak için hem A/B olmayan hem de A/B cihazlar için bölümlerin erken bağlanmasına yönelik hükümler getirilmiştir. Bu, bölümlerin hem Android hem de Şarj modunda takılmasını da sağlar.
Android derleme sistemi desteği
BoardConfig.mk
'te Android derlemesi, tedarikçi firma resmi için tasarlanmış çekirdek modüllerinin tam listesini sağlayan bir BOARD_VENDOR_KERNEL_MODULES
değişkeni tanımlar. Bu değişkende listelenen modüller, /lib/modules/
adresindeki tedarikçi firma resmine kopyalanır ve Android'e monte edildikten sonra /vendor/lib/modules
adresinde görünür (yukarıdaki şartlara uygun olarak).
Tedarikçi firma çekirdek modüllerinin örnek yapılandırması:
vendor_lkm_dir := device/$(vendor)/lkm-4.x BOARD_VENDOR_KERNEL_MODULES := \ $(vendor_lkm_dir)/vendor_module_a.ko \ $(vendor_lkm_dir)/vendor_module_b.ko \ $(vendor_lkm_dir)/vendor_module_c.ko
Bu örnekte, bir tedarikçi firma çekirdek modülü önceden oluşturulmuş deposu, yukarıda listelenen konumdaki Android derlemesiyle eşlenir.
Kurtarma resmi, tedarikçi modüllerinin bir alt kümesini içerebilir. Android derlemesi, bu modüller için BOARD_RECOVERY_KERNEL_MODULES
değişkenini tanımlar. Örnek:
vendor_lkm_dir := device/$(vendor)/lkm-4.x BOARD_RECOVERY_KERNEL_MODULES := \ $(vendor_lkm_dir)/vendor_module_a.ko \ $(vendor_lkm_dir)/vendor_module_b.ko
Android derlemesi, /vendor/lib/modules
ve /lib/modules
(recovery ramfs
) dosyalarında gerekli modules.dep
dosyalarını oluşturmak için depmod
'ü çalıştırır.
Modül yükleme ve sürüm oluşturma
modprobe -a
çağrısını yaparak tüm çekirdek modüllerini init.rc*
'ten tek seferde yükleyin. Bu sayede, modprobe
ikili dosyası için C çalışma ortamının tekrar tekrar başlatılması gerekmez. early-init
etkinliği, modprobe
etkinliğini çağıracak şekilde değiştirilebilir:
on early-init exec u:r:vendor_modprobe:s0 -- /vendor/bin/modprobe -a -d \ /vendor/lib/modules module_a module_b module_c ...
Genellikle bir çekirdek modülü, modülün kullanılacağı çekirdekle derlenmelidir (aksi takdirde çekirdek modülü yüklemeyi reddeder).
CONFIG_MODVERSIONS
, uygulama ikili arayüzünde (ABI) kesintileri tespit ederek geçici bir çözüm sunar. Bu özellik, çekirdekteki her bir dışa aktarılan sembolün prototipi için döngüsel fazlalık kontrolü (CRC) değeri hesaplar ve değerleri çekirdeğin bir parçası olarak depolar. Bir çekirdek modülü tarafından kullanılan semboller için değerler de çekirdek modülünde depolanır. Modül yüklendiğinde, modül tarafından kullanılan sembollerin değerleri çekirdektekilerle karşılaştırılır. Değerler eşleşirse modül yüklenir, aksi takdirde yükleme başarısız olur.
Çekirdek resminin satıcı resminden ayrı olarak güncellenmesini etkinleştirmek için CONFIG_MODVERSIONS
seçeneğini etkinleştirin. Bu sayede, tedarikçi firma resmindeki mevcut çekirdek modülleriyle uyumluluk korunurken çekirdekte küçük güncellemeler (ör. LTS'deki hata düzeltmeleri) yapılabilir. Ancak CONFIG_MODVERSIONS
, ABI bozulmasını tek başına düzeltmez. Çekirdekte dışa aktarılan bir sembolün prototipi, kaynakta yapılan bir değişiklik veya çekirdek yapılandırmasının değişmesi nedeniyle değişirse bu sembolü kullanan çekirdek modülleriyle uyumluluk bozulur. Bu gibi durumlarda, çekirdek modülü yeniden derlenmelidir.
Örneğin, çekirdekteki task_struct
yapısı (include/linux/sched.h
içinde tanımlanır), çekirdek yapılandırmasına bağlı olarak koşullu olarak dahil edilen birçok alan içerir. sched_info
alanı yalnızca CONFIG_SCHED_INFO
etkinse (CONFIG_SCHEDSTATS
veya CONFIG_TASK_DELAY_ACCT
etkinleştirildiğinde) mevcuttur. Bu yapılandırma seçeneklerinin durumu değişirse task_struct
yapısının düzeni değişir ve çekirdekten task_struct
kullanan tüm dışa aktarılan arayüzler değiştirilir (örneğin, kernel/sched/core.c
içindeki set_cpus_allowed_ptr
). Bu arayüzleri kullanan daha önce derlenmiş çekirdek modülleriyle uyumluluk bozulur ve bu modüllerin yeni çekirdek yapılandırmasıyla yeniden derlenmesi gerekir.
CONFIG_MODVERSIONS
hakkında daha fazla bilgi için Documentation/kbuild/modules.rst
adresindeki çekirdek ağacındaki dokümanlara bakın.