Implementacja partycji modułu GKI

Moduły GKI i GKI można aktualizować niezależnie od reszty partycji, ponieważ moduły GKI znajdują się na osobnej partycji dynamicznej w superobrazie o nazwie system_dlkm. Moduły GKI są podpisywane przez Google przy użyciu pary kluczy z czasu kompilacji jądra i są zgodne tylko z GKI, z którym zostały skompilowane. 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.

.

Implementowanie obsługi partycji system_dklm

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

  • moduły jądra podpisane przez Google w czasie kompilacji,
  • artefakty depmod.

Kompilowanie system_dlkm

Kompilowanie system_dlkm jest podobne do kompilowania innych partycji dynamicznych. Aby dodać system_dlkm do kompilacji, wykonaj te czynności:

  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 ten wiersz w pliku device.mk urządzenia:

    AB_OTA_PARTITIONS += system_dlkm
    

Określanie modułów jądra do skopiowania do system_dlkm

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

Android 13

Skieruj BOARD_SYSTEM_DLKM_SRC na folder zawierający wymagane pliki obiektów jądra modułów GKI dla urządzenia jako dane wejściowe do systemu kompilacji, aby wygenerować partycję system_dlkm. Przykład:

Podaj źródło modułów GKI w folderze i skieruj BOARD_SYSTEM_DLKM_SRC na ten folder. Przykład:

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

Podczas kompilacji moduły wymienione w BOARD_SYSTEM_DLKM_SRC są instalowane w $ANDROID_PRODUCT_OUT/system_dlkm.

Android 14

Usprawniliśmy implementację za pomocą makr (BOARD_*_KERNEL_MODULES) używanych w przypadku innych partycji *_dlkm. Lista wymaganych modułów GKI dla urządzenia powinna być przywoływana przez makro BOARD_SYSTEM_KERNEL_MODULES. Podczas kompilacji te moduły są instalowane w $ANDROID_PRODUCT_OUT/system_dlkm. Każdy moduł w partycji vendor_dlkm, który ma zależności od modułów w partycji system_dlkm, generuje prawidłowe odniesienia w pliku modules.dep dla partycji vendor_dlkm. Ze względu na zależności między partycjami reprezentowane przez modules.dep, gdy moduł dostawcy zostanie załadowany, każdy wymagany moduł GKI zostanie załadowany automatycznie.

Aby na przykład zainstalować wszystkie moduły GKI na partycji system_dlkm dla jądra GKI arm64 5.15 z prebuiltów:

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

Podłączanie system_dlkm w czasie działania

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

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

Podłączanie partycji i ładowanie modułów

Podczas first_stage_init partycja system_dlkm jest podłączana w /system_dlkm jako system plików tylko do odczytu. Po pomyślnym podłączeniu dostępne są linki symboliczne w /system/lib/modules wskazujące na /system_dlkm/lib/modules.

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

SELinux

Każdy plik w partycji system_dlkm jest oznaczony kontekstem pliku system_dlkm_file. Aby załadować plik modułów GKI w partycji system_dlkm, proces dostawcy odpowiedzialny za ładowanie modułów potrzebuje sepolicy w domenie dostawcy.

Na przykład dlkm_loader używany przez Cuttlefish do ładowania modułów GKI ma te uprawnienia w pliku zasad w 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;

Weryfikowanie partycji system-dlkm

Google udostępnia test VTS GKI, który służy do weryfikowania partycji system_dlkm. Aby ręcznie wywołać test, użyj tego polecenia atest:

  atest -c vts_dlkm_partition_test