Реализация раздела модуля GKI

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 в сборку:

  1. В 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
    
  2. В списке разделов добавьте system_dlkm : BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm

  3. (Необязательно) Для устройств 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 , при загрузке модуля vendor любой требуемый модуль 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