Çekirdek modülü desteği

Genel çekirdek görüntüsü (GKI), bir cihazın bölümleri bağlamasını sağlamak için gerekli sürücü desteğini içermeyebilir. Bir cihazın bölümleri bağlamasını ve önyüklemeye devam etmesini sağlamak için birinci aşama init, bir ramdisk'te bulunan çekirdek modüllerini yükleyecek şekilde geliştirilmiştir. Ramdisk, genel ve satıcı ramdiskleri olarak ikiye ayrılır. Tedarikçi çekirdek modülleri, tedarikçi ramdisk'inde depolanır. Çekirdek modüllerinin yüklendiği sıra yapılandırılabilir.

Modül konumu

Ramdisk, A/B ve sanal A/B cihazlarda birinci aşama init, ve kurtarma/fastbootd görüntüsü için dosya sistemidir. Bu, bootloader tarafından birleştirilen iki cpio arşivinden oluşan bir initramfs. vendor-boot bölümünde vendor ramdisk olarak depolanan ilk cpio arşivi şu bileşenleri içerir:

  • init konumundaki birinci aşama /lib/modules/ satıcı çekirdek modülleri.
  • modprobe yapılandırma dosyaları, /lib/modules/ konumunda bulunur: modules.dep, modules.softdep, modules.alias, modules.options.
  • modules.load içinde, ilk aşama başlatma sırasında hangi modüllerin hangi sırayla yükleneceğini belirten bir modules.load dosyası./lib/modules/
  • A/B ve Virtual A/B cihazlar için /lib/modules/ konumundaki tedarikçi kurtarma çekirdeği modülleri
  • modules.load.recovery, A/B ve sanal A/B cihazlarda yüklenecek modülleri ve yükleme sırasını gösterir./lib/modules

GKI ile birlikte boot.img'nin ramdiski olarak sağlanan ve birincinin üzerine uygulanan ikinci cpio arşivi, first_stage_init ve bağımlı olduğu kitaplıkları içerir.

İlk aşama başlatma sırasında modül yükleme

Birinci aşama init, ramdisk'teki /lib/modules/ konumundan modprobe yapılandırma dosyalarını okuyarak başlar. Ardından, /lib/modules/modules.load içinde belirtilen modüllerin listesini (veya kurtarma durumunda /lib/modules/modules.load.recovery) okur ve daha önce yüklenen dosyalarda belirtilen yapılandırmaya göre bu modüllerin her birini sırayla yüklemeye çalışır. İstenen sıra, zorunlu veya isteğe bağlı bağımlılıkları karşılamak için değiştirilebilir.

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

Tedarikçi ramdisk cpio'ya kopyalanacak çekirdek modüllerini belirtmek için bunları BOARD_VENDOR_RAMDISK_KERNEL_MODULES içinde listeleyin. Derleme, bu modüllerde çalışır ve ortaya çıkan modprobe yapılandırma dosyalarını vendor ramdisk cpio'ya yerleştirir.depmod

Derleme ayrıca bir modules.load dosyası oluşturur ve bunu vendor ramdisk cpio'da saklar. Varsayılan olarak, BOARD_VENDOR_RAMDISK_KERNEL_MODULES bölümünde 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

Build desteği, tam Android

Android 10 ve önceki sürümlerde olduğu gibi, BOARD_VENDOR_KERNEL_MODULES içinde listelenen çekirdek modülleri, Android platformu tarafından /vendor/lib/modules konumundaki satıcı bölümüne kopyalanır. Platform derlemesi bu modüllerde depmod çalışır ve depmod çıkış dosyalarını aynı konumda tedarikçi bölümüne kopyalar. /vendor konumundan çekirdek modüllerini 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ğine siz karar verirsiniz. Ancak bu işlem genellikle init.rc komut dosyaları kullanılarak yapılır.

Joker karakterler ve entegre çekirdek derlemeleri

Cihaz çekirdek derlemelerini Android platform derlemesiyle birleştiren satıcılar, cihaza kopyalanacak çekirdek modüllerini belirtmek için yukarıda bahsedilen BOARD makrolarını kullanırken sorun yaşayabilir. Sağlayıcı, çekirdek modüllerini cihazın platform derleme dosyalarında listelemek istemiyorsa joker karakter ($(wildcard device/vendor/mydevice/*.ko) kullanabilir. Joker karakterin, entegre çekirdek derlemesi durumunda çalışmadığını unutmayın. Bunun nedeni, make çağrıldığında ve makrolar makefile'larda genişletildiğinde çekirdek modüllerinin oluşturulmamış olmasıdır. Bu nedenle makrolar boştur.

Tedarikçi, bu sorunu çözmek için çekirdek modüllerini içeren ve her bölüme kopyalanacak bir zip arşivi oluşturabilir. Bu zip arşivinin yolunu BOARD_*_KERNEL_MODULES_ARCHIVE olarak ayarlayın. Burada *, bölümün adıdır (ör. BOARD_VENDOR_KERNEL_MODULES_ARCHIVE). Android platform derlemesi, bu zip arşivini uygun konuma çıkarır ve modüllerde depmod komutunu çalıştırır.

Çekirdek modülü zip arşivinde, platform derlemesinin gerektiğinde arşivi oluşturmasını sağlayan bir make kuralı olmalıdır.

Kurtarma

Önceki Android sürümlerinde, kurtarma için gereken çekirdek modülleri BOARD_RECOVERY_KERNEL_MODULES içinde belirtiliyordu. Android 12'de kurtarma için gereken çekirdek modülleri bu makro kullanılarak belirtilmeye devam eder. Ancak kurtarma çekirdeği modülleri, genel ramdisk cpio yerine satıcı ramdisk cpio'ya kopyalanır. Varsayılan olarak, BOARD_RECOVERY_KERNEL_MODULES içinde 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.

Tedarikçi önyükleme bölümü (bu sayfada bahsedilen tedarikçi ramdiski içerir) oluşturma hakkında bilgi edinmek için Önyükleme bölümleri başlıklı makaleyi inceleyin.