Модули GKI и GKI можно обновлять независимо от остальной части раздела, поскольку модули GKI находятся в отдельном динамическом разделе суперобраза, называемом system_dlkm
. Модули GKI подписываются Google с использованием пары ключей времени сборки ядра и совместимы только с GKI, с помощью которого они созданы. Между GKI и модулями GKI нет стабильности ABI; для правильной загрузки модулей во время выполнения модули GKI и GKI должны создаваться и обновляться вместе.
Реализовать поддержку разделов system_dklm.
Раздел system_dlkm
расположен в суперразделе как еще один динамический раздел. Этот раздел может содержать:
- Модули ядра, подписанные Google во время сборки
- артефакты
depmod
Сборка system_dlkm
Создание system_dlkm
аналогично созданию других динамических разделов. Выполните следующие шаги, чтобы добавить system_dlkm
в вашу сборку:
В
BoardConfig.mk
добавьте следующие записи:BOARD_USES_SYSTEM_DLKMIMAGE := true BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE) TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm
В списке разделов добавьте
system_dlkm
:BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm
(Необязательно) Для устройств A/B и виртуальных устройств A/B добавьте следующую строку в файл
device.mk
для вашего устройства:AB_OTA_PARTITIONS += system_dlkm
Определите модули ядра для копирования в system_dlkm
Чтобы модули успешно загружались во время выполнения, модули GKI и GKI должны быть собраны вместе. Поэтому вы должны определить модули ядра в сборке GKI для целевой архитектуры и предоставить их в качестве источника для раздела system_dlkm
во время сборки платформы.
Для Андроид 13
Укажите BOARD_SYSTEM_DLKM_SRC
на папку, содержащую необходимые объектные файлы ядра модулей GKI для устройства, в качестве входных данных для системы сборки для создания раздела system_dlkm
. Например:
Укажите исходный код модулей GKI в папке и укажите BOARD_SYSTEM_DLKM_SRC
на эту папку. Например:
BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging
Во время сборки модули, перечисленные в BOARD_SYSTEM_DLKM_SRC
устанавливаются в $ANDROID_PRODUCT_OUT/system_dlkm
.
Для Андроид 14
Мы упростили реализацию с помощью макросов ( BOARD_*_KERNEL_MODULES
), используемых для других разделов *_dlkm
. Список необходимых модулей GKI для устройства должен быть указан в макросе BOARD_SYSTEM_KERNEL_MODULES
. Во время сборки эти модули устанавливаются в $ANDROID_PRODUCT_OUT/system_dlkm
. Любой модуль в vendor_dlkm
, который зависит от модулей в разделе system_dlkm
генерирует правильные ссылки в файле modules.dep
для vendor_dlkm
. Из-за межраздельных зависимостей, представленных в файле modules.dep
, при загрузке модуля поставщика любой необходимый модуль GKI загружается автоматически.
Например, чтобы установить все модули GKI в раздел system_dlkm
для ядра GKI arm64
5.15
из готовых сборок:
BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)
Монтировать system_dlkm
во время выполнения
В зависимости от файловой системы, используемой в качестве файловой системы только для чтения, добавьте в fstab
следующее, чтобы смонтировать раздел system_dlkm
во время выполнения:
ext4
как файловая система только для чтения
system_dlkm /system_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
erofs
как файловая система только для чтения
system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb
Монтаж раздела и загрузка модулей
Во время first_stage_init
раздел system_dlkm
монтируется в /system_dlkm
как файловая система, доступная только для чтения. При успешном монтировании доступны символические ссылки в /system/lib/modules
указывающие на /system_dlkm/lib/modules
.
Затем процесс поставщика, например сценарий .rc
, может загружать модули ядра в порядке, указанном в modules.load
. Процесс поставщика должен использовать символическую ссылку /system/lib/modules
для загрузки модулей. При необходимости процесс поставщика также может загрузить модули позднее.
SELinux
Каждый файл в разделе system_dlkm
помечен файловым контекстом system_dlkm_file
. Чтобы загрузить файл модулей GKI в раздел system_dlkm
, процессу поставщика, ответственному за загрузку модулей, необходима sepolicy
в домене поставщика.
Например, dlkm_loader
используемый Cuttlefish для загрузки модулей GKI, имеет следующие разрешения в файле политики по 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;
Проверьте раздел system-dlkm
Google предоставляет тестовый пример GKI VTS для проверки раздела system_dlkm
. Чтобы запустить тест вручную, используйте следующую команду atest
:
atest -c vts_dlkm_partition_test
Модули GKI и GKI можно обновлять независимо от остальной части раздела, поскольку модули GKI находятся в отдельном динамическом разделе суперобраза, называемом system_dlkm
. Модули GKI подписываются Google с использованием пары ключей времени сборки ядра и совместимы только с GKI, с помощью которого они созданы. Между GKI и модулями GKI нет стабильности ABI; Для правильной загрузки модулей во время выполнения модули GKI и GKI должны создаваться и обновляться вместе.
Реализовать поддержку разделов system_dklm.
Раздел system_dlkm
расположен в суперразделе как еще один динамический раздел. Этот раздел может содержать:
- Модули ядра, подписанные Google во время сборки
- артефакты
depmod
Сборка system_dlkm
Создание system_dlkm
аналогично созданию других динамических разделов. Выполните следующие шаги, чтобы добавить system_dlkm
в вашу сборку:
В
BoardConfig.mk
добавьте следующие записи:BOARD_USES_SYSTEM_DLKMIMAGE := true BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE) TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm
В списке разделов добавьте
system_dlkm
:BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm
(Необязательно) Для устройств A/B и виртуальных устройств A/B добавьте следующую строку в файл
device.mk
для вашего устройства:AB_OTA_PARTITIONS += system_dlkm
Определите модули ядра для копирования в system_dlkm
Чтобы модули успешно загружались во время выполнения, модули GKI и GKI должны быть собраны вместе. Поэтому вы должны определить модули ядра в сборке GKI для целевой архитектуры и предоставить их в качестве источника для раздела system_dlkm
во время сборки платформы.
Для Андроид 13
Укажите BOARD_SYSTEM_DLKM_SRC
на папку, содержащую необходимые объектные файлы ядра модулей GKI для устройства, в качестве входных данных для системы сборки для создания раздела system_dlkm
. Например:
Укажите исходный код модулей GKI в папке и укажите BOARD_SYSTEM_DLKM_SRC
на эту папку. Например:
BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging
Во время сборки модули, перечисленные в BOARD_SYSTEM_DLKM_SRC
устанавливаются в $ANDROID_PRODUCT_OUT/system_dlkm
.
Для Андроид 14
Мы упростили реализацию с помощью макросов ( BOARD_*_KERNEL_MODULES
), используемых для других разделов *_dlkm
. Список необходимых модулей GKI для устройства должен быть указан в макросе BOARD_SYSTEM_KERNEL_MODULES
. Во время сборки эти модули устанавливаются в $ANDROID_PRODUCT_OUT/system_dlkm
. Любой модуль в vendor_dlkm
, который зависит от модулей в разделе system_dlkm
генерирует правильные ссылки в файле modules.dep
для vendor_dlkm
. Из-за межраздельных зависимостей, представленных в файле modules.dep
, при загрузке модуля поставщика любой необходимый модуль GKI загружается автоматически.
Например, чтобы установить все модули GKI в раздел system_dlkm
для ядра GKI arm64
5.15
из готовых сборок:
BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)
Монтировать system_dlkm
во время выполнения
В зависимости от файловой системы, используемой в качестве файловой системы только для чтения, добавьте в fstab
следующее, чтобы смонтировать раздел system_dlkm
во время выполнения:
ext4
как файловая система только для чтения
system_dlkm /system_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
erofs
как файловая система только для чтения
system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb
Монтаж раздела и загрузка модулей
Во время first_stage_init
раздел system_dlkm
монтируется в /system_dlkm
как файловая система, доступная только для чтения. При успешном монтировании доступны символические ссылки в /system/lib/modules
указывающие на /system_dlkm/lib/modules
.
Затем процесс поставщика, например сценарий .rc
, может загружать модули ядра в порядке, указанном в modules.load
. Процесс поставщика должен использовать символическую ссылку /system/lib/modules
для загрузки модулей. При необходимости процесс поставщика также может загрузить модули позднее.
SELinux
Каждый файл в разделе system_dlkm
помечен файловым контекстом system_dlkm_file
. Чтобы загрузить файл модулей GKI в раздел system_dlkm
, процессу поставщика, ответственному за загрузку модулей, необходима sepolicy
в домене поставщика.
Например, dlkm_loader
используемый Cuttlefish для загрузки модулей GKI, имеет следующие разрешения в файле политики по 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;
Проверьте раздел system-dlkm
Google предоставляет тестовый пример GKI VTS для проверки раздела system_dlkm
. Чтобы запустить тест вручную, используйте следующую команду atest
:
atest -c vts_dlkm_partition_test