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:
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
Na liście partycji dodaj
system_dlkm
:BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm
(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