Yüklenebilir çekirdek modülleri

Android 8.0'da kullanıma sunulan modül çekirdeği gereksinimleri kapsamında ç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 android-base.config, yaygın olarak kullanılan tüm çekirdeklerde yer alır. aşağıdaki çekirdek yapılandırma seçeneklerini (veya çekirdek sürümü eşdeğerlerini) inceleyin:

CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODVERSIONS=y

Tüm cihaz çekirdeklerinde bu seçenekler etkinleştirilmelidir. Çekirdek modüllerinde kaldırma ve mümkün olduğunda yeniden yüklemeyi desteklemelidir.

Modül imzalama

Modül imzalama, GKI tedarikçi modülleri için desteklenmez. Şu cihazlarda gereken cihazlarda: doğrulanmış önyüklemeyi desteklemesi durumunda, Android, çekirdek modüllerinin bölümlerde olmasını gerektirir. dm-verity özelliği etkinleştirilmiş olmalıdır. Bu sayede, oturum açma gerekliliği ortadan kalkar. modüllerini test etmelisiniz. Android 13, GKI modüllerini tanıttı. GKI modülleri, çekirdeğin derleme süresini kullanır çalışma zamanında GKI ile diğer modüller arasında ayrım yapmak için altyapı imzalama sistemi. İmzalanmamış modüllerin, yalnızca izin verilenler listesinde görünen sembolleri kullandıkları sürece yüklenmesine izin verilir imzalanmamış başka modüller tarafından sunulabilir. GKI derleme sırasında, çekirdeğin derleme zamanı anahtar çiftini kullanarak GKI modüllerinin imzalanmasını kolaylaştırmak için GKI çekirdek yapılandırması CONFIG_MODULE_SIG_ALL=y etkinleştirildi. Cihaz çekirdeği derlemeleri sırasında GKI olmayan modülleri imzalamamak için Çekirdek yapılandırmanızın bir parçası olarak # CONFIG_MODULE_SIG_ALL is not set parçalar.

Dosya konumları

Android 7.x ve önceki sürümler çekirdek modüllerini zorunlu kılmaz (ve insmod ve rmmod için destek), Android 8.x ve ekosistemde çekirdek modüllerinin kullanılmasını öneriyoruz. Aşağıdakiler tabloda, üç cihaz için gereken, karta özgü potansiyel çevre birimi desteği gösteriliyor. Android başlatma modları.

Başlatma modu Depolama Ekran Tuş takımı Pil PMIC Dokunmatik ekran NFC, Kablosuz,
Bluetooth
Sensörler Kamera
Kurtarma
Şarj cihazı
Android

Android başlatma modlarındaki kullanılabilirliğin yanı sıra çekirdek modüllerini de Sahibine (SoC tedarikçisi veya ODM) göre kategorize edilir. Çekirdek modüllerinde dosya sistemindeki yerleşimlerine ilişkin gereksinimler şu şekildedir: şöyle olur:

  • Tüm çekirdeklerde başlatma ve ekleme için yerleşik destek bulunmalıdır her bölüm için geçerlidir.
  • Çekirdek modülleri, salt okunur bir bölümden yüklenmelidir.
  • Doğrulanmış önyüklemenin olması gereken cihazlarda çekirdek modülleri Doğrulanmış bölümlerden yüklendi.
  • Çekirdek modülleri /system içinde yer almamalıdır.
  • Cihaz için gereken GKI modülleri şuradan yüklenmelidir: Bu, şuna sembolik bir bağlantıdır: /system/lib/modules /system_dlkm/lib/modules.
  • Tam Android veya iOS cihazlar için gerekli olan SoC sağlayıcısından alınan çekirdek modülleri Şarj cihazı modları /vendor/lib/modules konumunda bulunmalıdır.
  • Bir ODM bölümü varsa ODM'deki gerekli olan çekirdek modülleri tam Android veya Şarj cihazı modları için /odm/lib/modules Aksi takdirde, bu modüller /vendor/lib/modules
  • Kurtarma için gerekli olan SoC tedarikçisinin ve ODM'nin çekirdek modülleri modu şu konumdaki kurtarma ramfs bölümünde yer almalıdır: /lib/modules.
  • Hem Kurtarma modu hem de tam Android veya Şarj cihazı modları hem kurtarma rootfs hem de kurtarma bölümünde bulunmalıdır /vendor veya /odm bölümlerini (açıklandığı şekilde) bölümüne bakın).
  • Kurtarma modunda kullanılan çekirdek modülleri, bu bölümler aynı olmadığı için yalnızca /vendor veya /odm içinde eklenir.
  • SoC tedarikçisinin ç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ümler erken eklenmez. Android 8.x ve sonraki sürümlerde Bu bölümlerden modül yüklemeyi mümkün kılmak için bölümlerin her ikisi için de erkenden eklenmesi için A/B olmayan ve A/B olmayan cihazlar. Bu ayrıca Bölümlerin hem Android hem de Şarj Cihazı modlarında eklenmesini sağlar.

Android derleme sistemi desteği

BoardConfig.mk ürününde Android derlemesi bir Tam liste sağlayan BOARD_VENDOR_KERNEL_MODULES değişkeni çekirdek modüllerinin doğruluğunu kontrol edin. Şurada listelenen modüller: bu değişken /lib/modules/ adresindeki tedarikçi firma resmine kopyalanır. ve Android'e eklendikten sonra /vendor/lib/modules (yukarıdaki şartlara uygun olarak). Tedarikçi ç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, önceden oluşturulmuş bir tedarikçi çekirdek modülü olan depo yukarıda listelenen konumdaki Android derlemesi.

Kurtarma görüntüsü, satıcı modüllerinin bir alt kümesini içerebilir. Android derlemesi şunun için BOARD_RECOVERY_KERNEL_MODULES değişkenini tanımlar: birlikte çalışır. Ö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, depmod çalıştırmayla /vendor/lib/modules içinde modules.dep dosya gerekiyor ve /lib/modules (recovery ramfs).

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

Şu komutu çağırarak tüm çekirdek modüllerini init.rc* uygulamasından tek bir kartta yükleyin: modprobe -a. Böylece, sürekli olarak başlatma işlemi modprobe ikili programı için C çalışma zamanı ortamını kullanır. İlgili içeriği oluşturmak için kullanılan early-init etkinliği, modprobe yöntemini çağırmak için 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, çekirdek modüllerinin, modülün birlikte kullanılması (aksi takdirde çekirdek, modülü yüklemeyi reddeder). CONFIG_MODVERSIONS, kesintileri algılayarak geçici bir çözüm sunar API'yi kullanabilirsiniz. Bu özellik, döngüsel bir değer hesaplar dışa aktarılan her sembolün prototipine ait artıklık kontrolü (CRC) kernel'e ekler ve değerleri çekirdeğin bir parçası olarak depolar; a çekirdek modülünde, değerler ayrıca çekirdek modülünde de saklanır. modülü yüklendiğinde, modülün kullandığı simgelerin izin verir. Değerler eşleşirse modül yüklenir; aksi takdirde yükleme başarısız olur.

Çekirdek görüntüsünün tedarikçi firma görüntüsünden ayrı olarak güncellenmesini sağlamak için CONFIG_MODVERSIONS etkinleştirilsin mi? Bu, uyumluluğun sürdürülmesi sırasında yapılacak çekirdek (ör. LTS'deki hata düzeltmeleri) tedarikçi görüntüsündeki mevcut çekirdek modüllerini içermelidir. Ancak, CONFIG_MODVERSIONS, ABI arızalarını kendi başına düzeltmez. Öğe dışa aktarılmış bir simgenin prototipidir. Bunun nedeni, değiştirildiği için veya çekirdek yapılandırması değiştiğinden bu simgeyi kullanan çekirdek modülleriyle uyumluluğu bozar. Böyle durumlarda çekirdek modülünün yeniden derlenmesi gerekiyor.

Örneğin, çekirdekteki task_struct yapısı ( include/linux/sched.h), koşullu olarak birçok alanı içerir dahil edilir. sched_info alanı, yalnızca CONFIG_SCHED_INFO etkinse mevcuttur ( CONFIG_SCHEDSTATS veya CONFIG_TASK_DELAY_ACCT etkindir). Bu yapılandırmalar seçenekler durumu değiştirir, task_struct yapısının düzeni kullanan çekirdekten dışa aktarılan arayüzleri ve tüm değişiklikleri task_struct değiştirilmiş (örneğin, kernel/sched/core.c içinde set_cpus_allowed_ptr). Aşağıdakileri kullanan daha önce derlenmiş çekirdek modülleriyle uyumluluk arayüzler bozulur ve bu modüllerin yeni çekirdekle yeniden oluşturulması gerekir. yapılandırma.

CONFIG_MODVERSIONS hakkında daha fazla bilgi için referans noktasındaki çekirdek ağacında, Documentation/kbuild/modules.rst.