GKI modülü bölümünü uygulama

GKI ve GKI modülleri, bölümün geri kalanından bağımsız olarak güncellenebilir. Bunun nedeni, GKI modüllerinin süper görüntüdeki system_dlkm adlı ayrı bir dinamik bölümde bulunmasıdır. GKI modülleri, Google tarafından çekirdek derleme zamanı anahtar çifti kullanılarak imzalanır ve yalnızca oluşturuldukları GKI ile uyumludur. GKI ile GKI modülleri arasında ABI kararlılığı yoktur. Modüllerin çalışma zamanında doğru şekilde yüklenmesi için GKI ve GKI modüllerinin birlikte oluşturulup güncellenmesi gerekir.

system_dklm bölüm desteğini uygulama

system_dlkm bölümü, süper bölüm içinde başka bir dinamik bölüm olarak yer alır. Bu bölüm şunları içerebilir:

  • Google'ın derleme zamanında imzalanmış çekirdek modülleri
  • depmod yapı

Derleme: system_dlkm

system_dlkm oluşturma, diğer dinamik bölümleri oluşturmaya benzer bir süreçtir. Derlemenize system_dlkm eklemek için aşağıdaki adımları uygulayın:

  1. BoardConfig.mk bölümüne aşağıdaki girişleri ekleyin:

    BOARD_USES_SYSTEM_DLKMIMAGE := true
    BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)
    TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm
    
  2. Bölüm listesine system_dlkm ekleyin: BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm

  3. (İsteğe bağlı) A/B ve sanal A/B cihazlar için cihazınızın device.mk dosyasına aşağıdaki satırı ekleyin:

    AB_OTA_PARTITIONS += system_dlkm
    

system_dlkm içine kopyalanacak çekirdek modüllerini belirleyin

Modüllerin çalışma zamanında başarıyla yüklenmesi için GKI ve GKI modüllerinin birlikte oluşturulması gerekir. Bu nedenle, hedef mimari için GKI derlemesindeki çekirdek modüllerini tanımlamanız ve bunu platform derlemesi sırasında system_dlkm bölümünün kaynağı olarak sağlamanız gerekir.

Android 13 için

BOARD_SYSTEM_DLKM_SRC, system_dlkm bölümünü oluşturmak için derleme sistemine giriş olarak cihaz için gerekli GKI modüllerini içeren bir klasöre (çekirdek nesne dosyaları) işaret eder. Örneğin:

GKI modüllerinin kaynağını bir klasörde sağlayın ve BOARD_SYSTEM_DLKM_SRC işaretini bu klasöre yönlendirin. Örneğin:

  BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging

Derleme sırasında, BOARD_SYSTEM_DLKM_SRC içinde listelenen modüller $ANDROID_PRODUCT_OUT/system_dlkm'ye yüklenir.

Android 14 için

Diğer *_dlkm bölümleri için kullanılan makrolarla (BOARD_*_KERNEL_MODULES) uygulamayı kolaylaştırdık. Cihaz için gerekli GKI modüllerinin listesi, BOARD_SYSTEM_KERNEL_MODULES makrosuyla referans verilmelidir. Bu modüller, derleme sırasında $ANDROID_PRODUCT_OUT/system_dlkm içine yüklenir. vendor_dlkm bölümündeki modüllere bağımlılıkları olan system_dlkm bölümündeki tüm modüller, vendor_dlkm bölümü için modules.dep dosyasında doğru referanslar oluşturur. modules.dep ile gösterilen bölümler arası bağımlılıklar nedeniyle, bir satıcı modülü yüklendiğinde gerekli GKI modülleri otomatik olarak yüklenir.

Örneğin, önceden oluşturulmuş dosyalardan system_dlkm bölümüne 5.15 çekirdeği için tüm GKI modüllerini yüklemek üzere:arm64

 BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)

Çalışma zamanında system_dlkm bağlama

Salt okunur dosya sistemi olarak kullanılan dosya sistemine bağlı olarak, fstab dosyanıza aşağıdakileri ekleyerek system_dlkm bölümünü çalışma zamanında bağlayın:

ext4 salt okunur dosya sistemi olarak

  system_dlkm /system_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

erofs salt okunur dosya sistemi olarak

  system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb

Bölüm montajı ve modül yükleme

first_stage_init sırasında system_dlkm bölümü, /system_dlkm içinde salt okunur dosya sistemi olarak bağlanır. Başarılı bir bağlama işleminde, /system/lib/modules konumundaki /system_dlkm/lib/modules konumunu işaret eden sembolik bağlantılar kullanılabilir.

Daha sonra .rc gibi bir satıcı süreci, modules.load içinde belirtilen sıraya göre çekirdek modüllerini yükleyebilir. Tedarikçi süreci, modülleri yüklemek için /system/lib/modules sembolik bağlantısını kullanmalıdır. Gerekirse tedarikçi süreci, modülleri daha sonra da yükleyebilir.

SELinux

system_dlkm bölümündeki her dosya, system_dlkm_file dosya bağlamıyla etiketlenir. GKI modülleri dosyasını system_dlkm bölümüne yüklemek için modüllerin yüklenmesinden sorumlu satıcı sürecinin satıcı alanında sepolicy olması gerekir.

Örneğin, Cuttlefish tarafından GKI modüllerini yüklemek için kullanılan dlkm_loader, shared/sepolicy/vendor/dlkm_loader.te konumundaki politika dosyasında aşağıdaki izinlere sahiptir:

allow dlkm_loader self:capability sys_module;
allow dlkm_loader system_dlkm_file:dir r_dir_perms;
allow dlkm_loader system_dlkm_file:file r_file_perms;
allow dlkm_loader system_dlkm_file:system module_load;

system-dlkm bölümünü doğrulama

Google, system_dlkm bölümünü doğrulamak için bir GKI VTS test durumu sağlar. Testi manuel olarak çağırmak için aşağıdaki atest komutunu kullanın:

  atest -c vts_dlkm_partition_test