Implementacja partycji modułu GKI

GKI i moduły GKI można aktualizować niezależnie od pozostałej części partycji, ponieważ moduły GKI znajdują się na oddzielnej 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 wersją GKI, z którą zostały skompilowane. Nie ma stabilności interfejsu ABI między GKI a modułami GKI. Aby moduły ładowały się prawidłowo w czasie działania, GKI i moduły GKI muszą być kompilowane i aktualizowane razem.

Wdrażanie 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
  • depmod artefaktu

Kompilacja system_dlkm

Tworzenie system_dlkm przebiega podobnie jak tworzenie innych dynamicznych podziałów. Aby dodać system_dlkm do kompilacji, wykonaj te czynności:

  1. W polu 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ń z testami A/B i wirtualnymi testami A/B dodaj ten wiersz do pliku device.mk na urządzeniu:

    AB_OTA_PARTITIONS += system_dlkm
    

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

Aby moduły mogły się prawidłowo wczytywać w czasie działania, GKI i moduły 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 dla partycji system_dlkm podczas kompilacji platformy.

Android 13

Wskaż BOARD_SYSTEM_DLKM_SRC folder zawierający wymagane moduły GKI pliki obiektów jądra dla urządzenia jako dane wejściowe systemu kompilacji, aby wygenerować partycję system_dlkm. Na przykład:

Podaj źródło modułów GKI w folderze i wskaż BOARD_SYSTEM_DLKM_SRC ten folder. Na 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

Uprościliśmy implementację, używając makr (BOARD_*_KERNEL_MODULES) 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 vendor_dlkm, który jest zależny od modułów w system_dlkm, generuje prawidłowe odwołania w pliku modules.dep dla vendor_dlkm. Ze względu na zależności między partycjami reprezentowane przez symbol modules.dep, gdy moduł dostawcy zostanie wczytany, każdy wymagany moduł GKI zostanie wczytany automatycznie.

Na przykład aby zainstalować wszystkie moduły GKI na partycji system_dlkm dla jądra GKIarm64 5.15 z wstępnie skompilowanych plikó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 w fstab ten kod, 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

Montaż partycji i ładowanie modułu

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 wskazujące /system_dlkm/lib/modules.

Proces dostawcy, np. .rc skrypt, 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 wczytywania modułów. W razie potrzeby proces dostawcy może też wczytać moduły w późniejszym czasie.

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 wczytywania 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;

Sprawdzanie partycji system-dlkm

Google udostępnia test VTS GKI, aby zweryfikować partycję system_dlkm. Aby ręcznie wywołać test, użyj tego polecenia: atest

  atest -c vts_dlkm_partition_test