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:
W pliku
BoardConfig.mkdodaj te wpisy:BOARD_USES_SYSTEM_DLKMIMAGE := true BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE) TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkmNa liście partycji dodaj
system_dlkm:BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm(Opcjonalnie) W przypadku urządzeń A/B i wirtualnych A/B dodaj ten wiersz w pliku
device.mkurzą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