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ł GKI jest podpisywany przez Google za pomocą pary kluczy używanej podczas kompilacji jądra i jest zgodny tylko z modułami GKI, z którymi został skompilowany.
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.
Wdrożenie obsługi partycji system_dklm
Partycja system_dlkm
znajduje się w superpartycji jako inna partycja dynamiczna. Ta partycja może zawierać:
- Modułów jądra podpisanych przez Google w czasie kompilacji
depmod
artefaktu
Kompilacja system_dlkm
Tworzenie system_dlkm
przebiega podobnie jak tworzenie innych dynamicznych partycji. Aby dodać system_dlkm
do kompilacji:
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
Na 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 do pliku
device.mk
z Twojego urządzenia ten wiersz: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, moduły GKI i GKI muszą być skompilowane 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
Wskazywanie BOARD_SYSTEM_DLKM_SRC
do folderu zawierającego wymagane moduły GKI plików obiektów jądra dla urządzenia jako danych wejściowych 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 sekcji $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 na urządzeniu 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
. Każdy moduł w partycji vendor_dlkm
, który zależy od modułów w partycji system_dlkm
, generuje w pliku modules.dep
prawidłowe odwołania dla partycji vendor_dlkm
. Ze względu na zależności między partycjami reprezentowane przez funkcję modules.dep
podczas wczytywania modułu dostawcy każdy wymagany moduł GKI jest ładowany automatycznie.
Aby na przykład zainstalować wszystkie moduły GKI na partycji system_dlkm
dla jądra GKI arm64
5.15
z pakietu wstępnie skompilowanego:
BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)
Podłączanie system_dlkm
w czasie wykonywania
W zależności od systemu plików używanego jako system plików tylko do odczytu dodaj w plikach fstab
te informacje, aby podłączyć 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
Montowanie partycji i wczytywanie modułów
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
, 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 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 na partycji system_dlkm
jest oznaczony kontekstem pliku system_dlkm_file
. Aby można było wczytać plik modułów GKI na partycji system_dlkm
, proces dostawcy odpowiedzialny za wczytywanie modułów wymaga identyfikatora sepolicy
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;
Sprawdzanie partycji system-dlkm
Google udostępnia przypadek testowy VTS GKI do weryfikacji partycji system_dlkm
. Aby wywołać test ręcznie, użyj tego polecenia atest
:
atest -c vts_dlkm_partition_test