Yüklenebilir Çekirdek Modülleri

Android 8.0'da tanıtılan modül çekirdeği gereksinimlerinin bir parçası olarak, tüm çip üzerinde sistem (SoC) çekirdeklerinin, yüklenebilir çekirdek modüllerini desteklemesi gerekir.

Çekirdek yapılandırma seçenekleri

Yüklenebilir çekirdek modüllerini desteklemek için tüm yaygın çekirdeklerdeki android-base.config , aşağıdaki çekirdek yapılandırma seçeneklerini (veya bunların çekirdek sürümü eşdeğerini) içerir:

CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODVERSIONS=y

Tüm aygıt çekirdekleri bu seçenekleri etkinleştirmelidir. Çekirdek modülleri ayrıca mümkün olduğunda boşaltma ve yeniden yüklemeyi de desteklemelidir.

Modül imzalama

GKI satıcı modülleri için modül imzalama desteklenmez. Doğrulanmış önyüklemeyi desteklemek için gereken cihazlarda Android, çekirdek modüllerinin dm-verity'nin etkin olduğu bölümlerde olmasını gerektirir. Bu, özgünlükleri için ayrı ayrı modüllerin imzalanması ihtiyacını ortadan kaldırır. Android 13, GKI modülleri konseptini tanıttı. GKI modülleri, çalışma zamanında GKI ile diğer modüller arasında ayrım yapmak için çekirdeğin derleme zamanı imzalama altyapısını kullanır. İmzasız modüllerin, yalnızca izin verilenler listesinde görünen veya diğer imzasız modüller tarafından sağlanan simgeleri kullanması koşuluyla yüklenmesine izin verilir. GKI oluşturma sırasında çekirdeğin oluşturma zamanı anahtar çiftini kullanarak GKI modüllerinin imzalanmasını kolaylaştırmak için GKI çekirdek yapılandırması CONFIG_MODULE_SIG_ALL=y özelliğini etkinleştirmiştir. Cihaz çekirdeği oluşturma sırasında GKI olmayan modüllerin imzalanmasını önlemek için, çekirdek yapılandırma parçalarının bir parçası olarak # CONFIG_MODULE_SIG_ALL is not set eklemelisiniz.

Dosya konumları

Android 7.x ve daha düşük sürümler çekirdek modüllerine karşı zorunlu olmasa da (ve insmod ve rmmod desteğini içerir), Android 8.x ve daha yeni sürümler ekosistemde çekirdek modüllerinin kullanılmasını önerir. Aşağıdaki tabloda, üç Android önyükleme modunda gerekli olan anakarta özel potansiyel çevre birimi desteği gösterilmektedir.

Önyükleme modu Depolamak Görüntülemek Klavye Pil PMIC Dokunmatik ekran NFC, Wi-Fi,
Bluetooth
Sensörler Kamera
İyileşmek
Şarj cihazı
Android

Android önyükleme modlarındaki kullanılabilirliğin yanı sıra çekirdek modülleri, bunların sahibine (SoC satıcısı veya ODM) göre de kategorilere ayrılabilir. Çekirdek modülleri kullanılıyorsa bunların dosya sistemine yerleştirilmesi için gereksinimler aşağıdaki gibidir:

  • Tüm çekirdekler, bölümlerin başlatılması ve montajı için yerleşik desteğe sahip olmalıdır.
  • Çekirdek modülleri salt okunur bir bölümden yüklenmelidir.
  • Doğrulanmış önyüklemeye sahip olması gereken aygıtlar için çekirdek modülleri doğrulanmış bölümlerden yüklenmelidir.
  • Çekirdek modülleri /system konumunda olmamalıdır.
  • Cihaz için gerekli GKI modülleri, /system/lib/modules dosyasına sembolik bir bağlantı olan /system_dlkm/lib/modules adresinden yüklenmelidir.
  • Tam Android veya Şarj Cihazı modları için gerekli olan SoC satıcısının çekirdek modülleri /vendor/lib/modules konumunda bulunmalıdır.
  • Bir ODM bölümü mevcutsa, tam Android veya Şarj Cihazı modları için gereken ODM'deki çekirdek modülleri /odm/lib/modules konumunda bulunmalıdır. Aksi takdirde bu modüller /vendor/lib/modules konumunda bulunmalıdır.
  • Kurtarma modu için gerekli olan SoC satıcısından ve ODM'den alınan çekirdek modülleri /lib/modules adresindeki kurtarma ramfs 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, yalnızca /vendor veya /odm içinde bulunan modüllere bağlı olmamalıdır; çünkü bu bölümler Kurtarma modunda monte edilmemiştir.
  • SoC satıcısının ç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ümleri erken bağlanmaz . Android 8.x ve sonraki sürümlerde, bu bölümlerden modül yüklemeyi mümkün kılmak amacıyla, hem A/B olmayan hem de A/B aygıtları için bölümlerin erken kurulmasına yönelik düzenlemeler yapılmıştır. Bu aynı zamanda bölümlerin hem Android hem de Şarj Cihazı modlarında monte edilmesini sağlar.

Android derleme sistemi desteği

BoardConfig.mk Android yapısı, satıcı görüntüsüne yönelik çekirdek modüllerinin tam listesini sağlayan BOARD_VENDOR_KERNEL_MODULES değişkenini tanımlar. Bu değişkende listelenen modüller /lib/modules/ adresindeki satıcı görüntüsüne kopyalanır ve Android'e bağlandıktan sonra /vendor/lib/modules konumunda görünür (yukarıdaki gereksinimlere uygun olarak). Satıcı ç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, satıcının çekirdek modülü önceden oluşturulmuş deposu, yukarıda listelenen konumdaki Android yapısına eşlenmiştir.

Kurtarma görüntüsü satıcı modüllerinin bir alt kümesini içerebilir. Android yapısı 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 yapısı /vendor/lib/modules ve /lib/modules ( recovery ramfs ) içindeki gerekli modules.dep dosyalarını oluşturmak için depmod çalıştırılmasıyla ilgilenir.

Modül yükleme ve sürüm oluşturma

modprobe -a çağırarak tüm çekirdek modüllerini init.rc* dosyasından tek geçişte yükleyin. Bu, modprobe ikili dosyası için C çalışma zamanı ortamını tekrar tekrar başlatmanın getirdiği ek yükü ortadan kaldırır. early-init olayı modprobe ç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 ...

Tipik olarak, bir çekirdek modülünün, modülün kullanılacağı çekirdekle derlenmesi gerekir (aksi takdirde çekirdek, modülü yüklemeyi reddeder). CONFIG_MODVERSIONS uygulama ikili arayüzündeki (ABI) kesintileri tespit ederek bir geçici çözüm sağlar. Bu özellik, çekirdekte dışa aktarılan her sembolün prototipi için bir döngüsel artıklık denetimi (CRC) değeri hesaplar ve değerleri çekirdeğin bir parçası olarak saklar; Bir çekirdek modülü tarafından kullanılan semboller için değerler aynı zamanda çekirdek modülünde de saklanır. Modül yüklendiğinde modül tarafından kullanılan sembollerin değerleri çekirdekteki değerlerle karşılaştırılır. Değerler eşleşirse modül yüklenir; aksi takdirde yük başarısız olur.

Çekirdek görüntüsünün satıcı görüntüsünden ayrı olarak güncellenmesini etkinleştirmek için CONFIG_MODVERSIONS etkinleştirin. Bunu yapmak, satıcı görüntüsündeki mevcut çekirdek modülleriyle uyumluluğu korurken çekirdeğe küçük güncellemeler (LTS'den gelen hata düzeltmeleri gibi) yapılmasına olanak tanır. Ancak CONFIG_MODVERSIONS , ABI bozulmasını tek başına düzeltmez. Dışa aktarılan bir sembolün çekirdekteki prototipi, kaynağın değiştirilmesi veya çekirdek yapılandırmasının değişmesi nedeniyle değişirse, bu durum, söz konusu sembolü kullanan çekirdek modülleriyle uyumluluğu bozar. Bu gibi durumlarda çekirdek modülünün yeniden derlenmesi gerekir.

Örneğin, çekirdekteki ( include/linux/sched.h dosyasında tanımlanan) task_struct yapısı, ç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 etkinleştirildiğinde mevcuttur ( CONFIG_SCHEDSTATS veya CONFIG_TASK_DELAY_ACCT etkinleştirildiğinde oluşur). 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 dışa aktarılan tüm arayüzler değişir (örneğin, kernel/sched/core.c içindeki set_cpus_allowed_ptr ). Bu arayüzleri kullanan önceden derlenmiş çekirdek modülleriyle uyumluluk bozulur ve bu modüllerin yeni çekirdek yapılandırmasıyla yeniden oluşturulması gerekir.

CONFIG_MODVERSIONS hakkında daha fazla ayrıntı için Documentation/kbuild/modules.rst adresindeki çekirdek ağacındaki belgelere bakın.