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
.