Ç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. Ramdisk, genel ve satıcı ramdisk'lere bölünmüştü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/ konumunda bulunan ilk 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.
  • /lib/modules/ konumunda ilk aşamanın başlatılması sırasında hangi modüllerin, hangi sırayla yükleneceğini gösteren modules.load dosyası.
  • /lib/modules/ bölgesinde A/B ve sanal A/B cihazları için tedarikçi kurtarma çekirdek modülleri
  • modules.load.recovery, A/B ve Sanal A/B cihazları için /lib/modules içinde hangi modüllerin, hangi sırayla yükleneceğini gösterir.

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şamada modül yükleme

İlk aşama init, ramdisk'teki /lib/modules/ 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'suna 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 simgesini 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 firma bölümüne kopyalar. /vendor platformundaki çekirdek modüllerini yükleme mekanizması, Android'in önceki sürümleriyle aynıdır. 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.

Joker 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 derlemesi 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 sorunu çözmek için çekirdek derlemesini, her bölüme kopyalanacak çekirdek modüllerini içeren bir zip arşivi oluşturmasını sağlayabilir. 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 başlatma bölümü (bu sayfada bahsedilen tedarikçi firma RAM'ini içerir) oluşturma hakkında bilgi edinmek için Önyükleme bölümleri'ni inceleyin.