Zaimplementuj partycję 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 super obrazie o nazwie system_dlkm . Moduły GKI są podpisane przez Google przy użyciu pary kluczy potrzebnych do budowy jądra i są kompatybilne tylko z GKI, z którego są zbudowane. Nie ma stabilności ABI pomiędzy modułami GKI i GKI; aby moduły ładowały się poprawnie w czasie wykonywania, moduły GKI i GKI muszą być budowane i aktualizowane razem.

Zaimplementuj obsługę partycji system_dklm

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

  • Moduły jądra Google podpisane w czasie kompilacji
  • Artefakty depmod

Zbuduj system_dlkm

Budowanie system_dlkm jest procesem podobnym do budowania innych partycji dynamicznych. Wykonaj następujące kroki, aby dodać system_dlkm do swojej kompilacji:

  1. W BoardConfig.mk dodaj następujące 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 następujący wiersz w pliku device.mk swojego urządzenia:

    AB_OTA_PARTITIONS += system_dlkm
    

Zidentyfikuj moduły jądra do skopiowania do system_dlkm

Aby moduły mogły zostać pomyślnie załadowane w czasie wykonywania, moduły GKI i GKI muszą zostać zbudowane razem. Dlatego musisz zidentyfikować moduły jądra w kompilacji GKI dla docelowej architektury i podać je jako źródło partycji system_dlkm podczas budowania platformy.

Dla Androida 13

Wskaż BOARD_SYSTEM_DLKM_SRC folder zawierający wymagane pliki obiektów jądra modułów GKI dla urządzenia jako dane wejściowe do 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 czasie kompilacji moduły wymienione w BOARD_SYSTEM_DLKM_SRC są instalowane w $ANDROID_PRODUCT_OUT/system_dlkm .

Dla Androida 14

Usprawniliśmy implementację, dodając makra ( BOARD_*_KERNEL_MODULES ) używane dla innych partycji *_dlkm . Listę wymaganych modułów GKI dla urządzenia powinno odwoływać się makro BOARD_SYSTEM_KERNEL_MODULES . W czasie kompilacji moduły te są instalowane w pliku $ANDROID_PRODUCT_OUT/system_dlkm . Dowolny moduł w partycji vendor_dlkm , który ma zależności od modułów w partycji system_dlkm , generuje poprawne odniesienia w pliku modules.dep dla partycji vendor_dlkm . Ze względu na zależności między partycjami reprezentowane przez modules.dep , gdy ładowany jest moduł dostawcy, automatycznie ładowany jest każdy wymagany moduł GKI.

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

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

Zamontuj system_dlkm w czasie wykonywania

W zależności od systemu plików używanego jako system plików tylko do odczytu, dodaj następujące polecenie do fstab , aby zamontować 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

Montaż partycji i ładowanie modułów

Podczas first_stage_init partycja system_dlkm jest montowana w katalogu /system_dlkm jako system plików tylko do odczytu. Po pomyślnym zamontowaniu dostępne są dowiązania symboliczne w /system/lib/modules wskazujące na /system_dlkm/lib/modules .

Proces dostawcy, taki jak skrypt .rc , może następnie załadować moduły jądra w oparciu o kolejność określoną w modules.load . Proces dostawcy musi użyć dowiązania symbolicznego /system/lib/modules aby załadować moduły. Jeśli to konieczne, proces dostawcy może również załadować moduły w późniejszym czasie.

SELinux

Każdy plik w partycji system_dlkm jest oznaczony etykietą kontekstu pliku system_dlkm_file . Aby załadować plik modułów GKI do 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 następujące uprawnienia w pliku zasad pod 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;

Sprawdź poprawność partycji system-dlkm

Google udostępnia przypadek testowy GKI VTS w celu sprawdzenia partycji system_dlkm . Aby ręcznie wywołać test, użyj następującego polecenia atest :

  atest -c vts_dlkm_partition_test