Çekirdek Modül Desteği

Genel bir çekirdek görüntüsü (GKI), bir aygıtın bölümleri bağlamasını sağlamak için gerekli sürücü desteğini içermeyebilir. Bir aygıtın bölümleri monte etmesini ve önyüklemeye devam etmesini sağlamak için, birinci aşama init bir ramdisk üzerinde bulunan çekirdek modüllerini yükleyecek şekilde geliştirildi. Ramdisk genel ve satıcı ramdisklerine bölünmüştür. Satıcı çekirdek modülleri satıcının ramdiskinde saklanır. Çekirdek modüllerinin yüklenme sırası yapılandırılabilir.

Modül konumu

Ramdisk, birinci aşama init, ve A/B ve sanal A/B aygıtlarındaki kurtarma/hızlı önyükleme görüntüsüne yönelik dosya sistemidir. Önyükleyici tarafından birleştirilen iki cpio arşivinden oluşan bir initramfs . Satıcı-önyükleme bölümünde satıcının ramdiski olarak saklanan ilk cpio arşivi şu bileşenleri içerir:

  • /lib/modules/ konumunda bulunan birinci aşama init satıcı çekirdek modülleri.
  • /lib/modules/ konumunda bulunan modprobe yapılandırma dosyaları: modules.dep , modules.softdep , modules.alias , modules.options .
  • İlk aşama başlatma sırasında hangi modüllerin yükleneceğini ve /lib/modules/ dizininde belirten bir modules.load dosyası.
  • /lib/modules/ dizininde, A/B ve Sanal A/B aygıtları için satıcı kurtarma çekirdeği modülleri
  • /lib/modules dosyasında, A/B ve Sanal A/B aygıtları için modüllerin hangi sırayla yükleneceğini belirten modules.load.recovery .

Boot.img dosyasının ramdiski olarak GKI ile birlikte sağlanan ve birincinin üstüne uygulanan ikinci cpio arşivi, first_stage_init ve bağlı olduğu kütüphaneleri içerir.

Birinci aşama başlangıçta modül yükleme

İlk aşama init modprobe yapılandırma dosyalarının ramdisk üzerindeki /lib/modules/ adresinden okunmasıyla başlar. Daha sonra, /lib/modules/modules.load (veya kurtarma durumunda /lib/modules/modules.load.recovery ) içinde belirtilen modüllerin listesini okur ve aşağıdakileri izleyerek bu modüllerin her birini sırayla yüklemeye çalışır: önceden yüklenen dosyalarda belirtilen yapılandırma. Talep edilen sipariş, donanım veya yazılım bağımlılıklarını karşılamak için farklı olabilir.

Derleme desteği, ilk aşama başlatma

Satıcının ramdisk cpio'suna kopyalanacak çekirdek modüllerini belirtmek için bunları BOARD_VENDOR_RAMDISK_KERNEL_MODULES içinde listeleyin. Derleme, bu modüllerde depmod çalıştırır ve elde edilen modprobe yapılandırma dosyalarını satıcının ramdisk cpio'suna yerleştirir.

Derleme ayrıca bir modules.load dosyası oluşturur ve bunu satıcının ramdisk cpio'sunda saklar. Varsayılan olarak BOARD_VENDOR_RAMDISK_KERNEL_MODULES listelenen tüm modülleri içerir. Bu dosyanın içeriğini geçersiz kılmak için bu örnekte gösterildiği gibi BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD kullanın:

BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := \
    device/vendor/mydevice-kernel/first.ko \
    device/vendor/mydevice-kernel/second.ko \
    device/vendor/mydevice-kernel/third.ko

Derleme desteği, tam Android

Android 10 ve daha düşük sürümlerde olduğu gibi, BOARD_VENDOR_KERNEL_MODULES listelenen çekirdek modülleri, Android platformu yapısı tarafından /vendor/lib/modules adresindeki satıcı bölümüne kopyalanır. Platform yapısı, depmod bu modüller üzerinde çalıştırır ve depmod çıktı dosyalarını aynı konumdaki satıcı bölümüne kopyalar. Çekirdek modüllerini /vendor yükleme mekanizması, Android'in önceki sürümlerinde olduğu gibi aynı kalır. Bu modüllerin nasıl ve ne zaman yükleneceği sizin kararınızdır, ancak bu genellikle init.rc komut dosyaları kullanılarak yapılır.

Joker karakterler ve entegre çekirdek yapıları

Cihaz çekirdek yapısını Android platformu yapısıyla birleştiren satıcılar, cihaza kopyalanacak çekirdek modüllerini belirtmek için yukarıda belirtilen BOARD makrolarını kullanırken bir sorunla karşılaşabilirler. Satıcı, cihazın platform derleme dosyalarında çekirdek modüllerini listelemekten kaçınmak isterse, bir joker karakter ( $(wildcard device/vendor/mydevice/*.ko ) kullanabilir. Tümleşik bir durumda joker karakterin çalışmadığını unutmayın. çekirdek yapısı, çünkü make çağrıldığında ve makrolar makefile dosyalarında genişletildiğinde, çekirdek modülleri oluşturulmamıştır, dolayısıyla makrolar boştur.

Bu sorunu aşmak için satıcı, çekirdek yapısının, her bölüme kopyalanacak çekirdek modüllerini içeren bir zip arşivi oluşturmasını sağlayabilir. Bu zip arşivinin yolunu BOARD_*_KERNEL_MODULES_ARCHIVE içinde ayarlayın; burada * bölümün adıdır ( BOARD_VENDOR_KERNEL_MODULES_ARCHIVE gibi). Android platformu yapısı bu zip arşivini uygun konuma çıkarır ve modüller üzerinde depmod çalıştırır.

Çekirdek modülü zip arşivi, platform yapısının gerektiğinde arşivi oluşturabilmesini sağlayan bir make kuralına sahip olmalıdır.

İyileşmek

Önceki Android sürümlerinde, kurtarma için gereken çekirdek modülleri BOARD_RECOVERY_KERNEL_MODULES içinde belirtilmişti. Android 11'de kurtarma için gereken çekirdek modülleri hâlâ bu makro kullanılarak belirtiliyor. Ancak kurtarma çekirdeği modülleri, genel ramdisk cpio'su yerine satıcının ramdisk cpio'suna kopyalanır. Varsayılan olarak BOARD_RECOVERY_KERNEL_MODULES listelenen tüm çekirdek modülleri ilk aşama init sırasında yüklenir. Bu modüllerin yalnızca bir alt kümesinin yüklenmesini istiyorsanız, bu alt kümenin içeriğini BOARD_RECOVERY_KERNEL_MODULES_LOAD içinde belirtin.

Satıcı önyükleme bölümü (bu sayfada belirtilen satıcı ramdiskini içeren) oluşturma hakkında bilgi edinmek için bkz . Önyükleme Bölümleri .