Yüklenebilir çekirdek modülleri

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 kurtarma ramfs 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.