Çekirdek modülü desteği

Genel çekirdek resmi (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. RAM diski, genel ve tedarikçi RAM disklerine ayrılır. Tedarikçi çekirdek modülleri, tedarikçi ramdisk'inde depolanır. Çekirdek modüllerinin yüklenme sırası yapılandırılabilir.

Modül konumu

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

  • /lib/modules/ içinde bulunan birinci aşama init tedarikçi çekirdek modülleri.
  • /lib/modules/ konumunda bulunan modprobe yapılandırma dosyaları: modules.dep, modules.softdep, modules.alias, modules.options.
  • İlk aşamada başlatma sırasında hangi modüllerin ve hangi sırayla yükleneceğini belirten bir modules.load dosyası./lib/modules/
  • /lib/modules/'te A/B ve sanal A/B cihazlar için tedarikçi firma kurtarma çekirdek modülleri
  • modules.load.recovery, A/B ve sanal A/B cihazları için yüklenecek modülleri ve bunların yükleneceği sırayı /lib/modules içinde belirtir.

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

İlk aşamalı başlatmada modül yükleme

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

Derleme desteği, ilk aşamada 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 depmod'yi çalıştırır ve ortaya çıkan modprobe yapılandırma dosyalarını tedarikçi firma ramdisk cpio'ya yerleştirir.

Derleme ayrıca bir modules.load dosyası oluşturur ve bunu tedarikçi ramdisk cpio'sunda depolar. Varsayılan olarak BOARD_VENDOR_RAMDISK_KERNEL_MODULES bölümünde listelenen tüm modülleri içerir. Söz konusu 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 önceki sürümlerde olduğu gibi, BOARD_VENDOR_KERNEL_MODULES içinde listelenen çekirdek modülleri, Android platform derlemesi tarafından /vendor/lib/modules adresindeki tedarikçi bölümüne kopyalanır. Platform derlemesi bu modüllerde depmod'ü çalıştırır ve depmod çıkış dosyalarını aynı konumdaki tedarikçi bölümüne kopyalar. /vendor'ten çekirdek modüllerini yükleme mekanizması, Android'in önceki sürümlerinde olduğu gibidir. Bu modülleri nasıl ve ne zaman yükleyeceğinize siz karar verirsiniz. Ancak bu işlem genellikle init.rc komut dosyaları kullanılarak yapılır.

Karıştırıcı karakterler ve entegre çekirdek derlemeleri

Cihaz çekirdek derlemelerini Android platform derlemesiyle birleştiren tedarikçiler, cihaza kopyalanacak çekirdek modüllerini belirtmek için yukarıda belirtilen BOARD makrolarını kullanırken sorunla karşılaşabilir. Tedarikçi, çekirdek modüllerini cihazın platform derleme dosyalarında listelemekten kaçınmak istiyorsa joker karakter ($(wildcard device/vendor/mydevice/*.ko) kullanabilir. Joker karakterin, entegre çekirdek derleme durumunda çalışmadığını unutmayın. Çünkü make çağrıldığında ve makrolar makefile'lerde genişletildiğinde çekirdek modülleri derlenmemiş olur ve bu nedenle makrolar boş olur.

Tedarikçi, bu sorunun üstesinden gelmek için çekirdek derlemesinde, her bölüme kopyalanacak çekirdek modüllerini içeren bir zip arşivi oluşturabilir. BOARD_*_KERNEL_MODULES_ARCHIVE içindeki bu zip arşivinin yolunu 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'ı ç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 çekirdek modülleri, genel ramdisk cpio yerine tedarikçi 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. Yalnızca bu modüllerin bir alt kümesinin yüklenmesini istiyorsanız BOARD_RECOVERY_KERNEL_MODULES_LOAD içinde bu alt kümenin içeriğini belirtin.

Tedarikçi firma önyükleme bölümü (bu sayfada bahsedilen tedarikçi firma ramdisk'ini içerir) oluşturma hakkında bilgi edinmek için Önyükleme bölümleri bölümüne bakın.