Wdrażanie partycji modułu GKI

Moduł GKI i moduły GKI można aktualizować niezależnie od reszty partycji, ponieważ moduły GKI znajdują się w oddzielnej dynamicznej partycji w super obrazie o nazwie system_dlkm. Moduł GKI jest podpisywany przez Google za pomocą pary kluczy używanej podczas kompilacji jądra i jest zgodny tylko z modułami GKI, z którymi został skompilowany. Między modułami GKI i GKI nie ma stabilności ABI. Aby moduły ładowały się prawidłowo w czasie działania, moduły GKI i GKI muszą być kompilowane i aktualizowane razem.

Wdrożenie obsługi partycji system_dklm

Partycja system_dlkm znajduje się w superpartycji jako inna partycja dynamiczna. Ta partycja może zawierać:

  • Modułów jądra podpisanych przez Google w czasie kompilacji
  • depmod artefaktu

Kompilacja system_dlkm

Tworzenie system_dlkm przebiega podobnie jak tworzenie innych dynamicznych partycji. Aby dodać system_dlkm do kompilacji:

  1. W pliku BoardConfig.mk dodaj te wpisy:

    BOARD_USES_SYSTEM_DLKMIMAGE := true
    BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)
    TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm
    
  2. Na liście partycji dodaj system_dlkm: BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm

  3. (Opcjonalnie) W przypadku urządzeń A/B i wirtualnych A/B dodaj do pliku device.mk z Twojego urządzenia ten wiersz:

    AB_OTA_PARTITIONS += system_dlkm
    

Określ moduły jądra do skopiowania do system_dlkm

Aby moduły ładowały się w czasie działania, moduły GKI i GKI muszą być skompilowane razem. Dlatego musisz zidentyfikować moduły jądra w kompilacji GKI dla architektury docelowej i podać je jako źródło dla partycji system_dlkm podczas kompilacji platformy.

Android 13

Wskazywanie BOARD_SYSTEM_DLKM_SRC do folderu zawierającego wymagane moduły GKI plików obiektów jądra dla urządzenia jako danych wejściowych dla systemu kompilacji w celu wygenerowania partycji system_dlkm. Na przykład:

Podaj źródło modułów GKI w folderze i wskaż BOARD_SYSTEM_DLKM_SRC do tego folderu. Na przykład:

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

W momencie kompilacji moduły wymienione w sekcji BOARD_SYSTEM_DLKM_SRC są instalowane w sekcji $ANDROID_PRODUCT_OUT/system_dlkm.

Android 14

Uprościliśmy implementację za pomocą makr (BOARD_*_KERNEL_MODULES) używanych w przypadku innych partycji (*_dlkm). Lista wymaganych modułów GKI na urządzeniu powinna być wywoływana za pomocą makra BOARD_SYSTEM_KERNEL_MODULES. W momencie kompilacji te moduły są instalowane w $ANDROID_PRODUCT_OUT/system_dlkm. Każdy moduł w partycji vendor_dlkm, który zależy od modułów w partycji system_dlkm, generuje w pliku modules.dep prawidłowe odwołania dla partycji vendor_dlkm. Ze względu na zależności między partycjami reprezentowane przez funkcję modules.dep podczas wczytywania modułu dostawcy każdy wymagany moduł GKI jest ładowany automatycznie.

Aby na przykład zainstalować wszystkie moduły GKI na partycji system_dlkm dla jądra GKI arm64 5.15 z pakietu wstępnie skompilowanego:

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

Podłączanie system_dlkm w czasie wykonywania

W zależności od systemu plików używanego jako system plików tylko do odczytu dodaj w plikach fstab te informacje, aby podłączyć partycję system_dlkm w czasie wykonywania:

ext4 jako system plików tylko do odczytu

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

erofs jako system plików tylko do odczytu

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

Montowanie partycji i wczytywanie modułów

Podczas first_stage_init partycja system_dlkm jest montowana w /system_dlkm jako system plików tylko do odczytu. Po pomyślnym zamontowaniu dostępne są linki symboliczne w /system/lib/modules, które wskazują na /system_dlkm/lib/modules.

Proces dostawcy, np. skrypt .rc, może następnie wczytywać moduły jądra na podstawie kolejności określonej w modules.load. Proces dostawcy musi używać linku symbolicznego /system/lib/modules do wczytywania modułów. W razie potrzeby proces dostawcy może też wczytać moduły w późniejszym czasie.

SELinux

Każdy plik na partycji system_dlkm jest oznaczony kontekstem pliku system_dlkm_file. Aby można było wczytać plik modułów GKI na partycji system_dlkm, proces dostawcy odpowiedzialny za wczytywanie modułów wymaga identyfikatora sepolicy w domenie dostawcy.

Na przykład usługa dlkm_loader używana przez Cuttlefish do wczytywania modułów GKI ma te uprawnienia w pliku zasad w folderze shared/sepolicy/vendor/dlkm_loader.te:

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;

Sprawdzanie partycji system-dlkm

Google udostępnia przypadek testowy VTS GKI do weryfikacji partycji system_dlkm. Aby wywołać test ręcznie, użyj tego polecenia atest:

  atest -c vts_dlkm_partition_test