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 kurtarmaramfs
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.