Модули GKI и GKI можно обновлять независимо от остальной части раздела, поскольку модули GKI находятся в отдельном динамическом разделе в суперобразе, называемом system_dlkm . Модули GKI подписываются Google с использованием пары ключей, используемых во время сборки ядра, и совместимы только с той версией GKI, с которой они были собраны. Между модулями GKI и GKI отсутствует стабильность ABI; для корректной загрузки модулей во время выполнения необходимо, чтобы модули GKI и GKI собирались и обновлялись одновременно.
Реализовать поддержку разделов system_dklm
Раздел system_dlkm расположен в суперразделе как еще один динамический раздел. Этот раздел может содержать:
- Модули ядра, подписанные во время сборки Google
- артефакты
depmod
Build 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 во время сборки платформы.
Для Android 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 .
Для Android 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 в домене поставщика.
Например, для загрузки модулей GKI компонентом dlkm_loader , используемым Cuttlefish, в файле политики по адресу 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