Implementacja 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ły GKI są podpisane przez Google za pomocą jądra. i są zgodne tylko z GKI, z którymi zostały utworzone. Nie ma stabilności ABI między modułami GKI i GKI. aby moduły zostały załadowane w czasie działania modułów GKI i GKI muszą być kompilowane i aktualizowane. razem.

Wdróż obsługę partycji system_dklm

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

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

Kompilacja system_dlkm

Budynek system_dlkm przebiega podobnie do tworzenia innych elementów dynamicznych partycji. 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 w device.mk plik na Twoje urządzenie:

    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, muszą być skompilowane moduły GKI i GKI razem. W związku z tym w kompilacji GKI musisz zidentyfikować moduły jądra systemu docelową architekturę i udostępnić ją jako źródło partycji system_dlkm. podczas budowania platformy.

Android 13

Wskazywanie BOARD_SYSTEM_DLKM_SRC do folderu zawierającego wymagane pliki obiektów jądra GKI dla urządzenia jako dane wejściowe 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 $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 dla urządzenia 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. Dowolny moduł w języku: Partycja vendor_dlkm, która ma zależności od modułów w: system_dlkm partycja generuje w pliku modules.dep prawidłowe odwołania dla vendor_dlkm partycja. Ze względu na zależności między partycjami reprezentowane przez modules.dep, gdy wczytuje się moduł dostawcy, wszystkie wymagane moduły GKI są wczytywane automatycznie.

Na przykład: aby zainstalować wszystkie moduły GKI na partycji system_dlkm dla GKI Jądro arm64 5.15 z gotowych wersji:

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

Podłącz system_dlkm w czasie działania

W zależności od używanego systemu plików jako systemu plików tylko do odczytu dodaj Wykonaj te czynności w 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

Mocowanie partycji i wczytywanie modułów

W czasie first_stage_init partycja system_dlkm jest podłączona w interfejsie /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 wykorzystywać użyj łącza symbolicznego /system/lib/modules, aby wczytać moduły. W razie potrzeby proces dostawcy może też załadować moduły w późniejszym czasie.

SELinux

Każdy plik w partycji system_dlkm ma etykietę z kontekstem pliku system_dlkm_file Aby wczytać plik modułów GKI w partycji system_dlkm: proces dostawcy odpowiedzialny za wczytanie modułów wymaga tagu sepolicy w 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;

Zweryfikuj partycję system-dlkm

Google udostępnia przypadek testowy GKI VTS do zweryfikowania partycji system_dlkm. Do ręcznie wywołaj test, użyj tego polecenia atest:

  atest -c vts_dlkm_partition_test