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:
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
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 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