Разделы DLKM поставщика и ODM

В Android 11 появилось понятие общего образа ядра и загрузочного раздела поставщика. В разделе vendor_boot хранятся модули ядра, совместимые с GKI. Они загружаются на первом этапе инициализации. Модули ядра, выпущенные до Android 11, также хранятся в разделах поставщика и ODM и загружаются процессами поставщика.

На устройствах с Android 11 и более поздних версий ядро и все его модули можно обновлять независимо от остальных разделов. Чтобы включить обновления для модулей ядра, хранящихся в разделе поставщика (без обновления раздела поставщика), переместите все модули раздела поставщика в новый раздел под названием Vendor DLKM (динамически загружаемый модуль ядра). После этого вы сможете обновлять этот раздел независимо от других. Аналогичным образом можно перенести все модули ядра, хранящиеся в разделе ODM, в новый раздел ODM DLKM. Этот раздел также можно обновлять независимо.

Местоположение раздела

Разделы vendor_dlkm и odm_dlkm находятся в суперразделе как ещё один динамический раздел.

Содержимое vendor_dlkm в /vendor/lib/modules

  • Модули ядра от поставщика
  • modprobe файлов конфигурации
  • Файл modules.load

Содержимое odm_dlkm в /odm/lib/modules

  • Модули ядра ODM
  • modprobe файла конфигурации
  • Файл modules.load

Подробнее о файлах конфигурации модулей ядра…

Как обеспечить поддержку

Создание vendor_dlkm и odm_dlkm похоже на создание других динамических разделов.

Пример создания vendor_dlkm

Создайте строку vendor_dlkm, как показано в примерах ниже.

BoardConfig.mk

BOARD_USES_VENDOR_DLKMIMAGE := true
BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_VENDOR_DLKM := vendor_dlkm
BOARD_<GROUP_NAME>_PARTITION_LIST += vendor_dlkm

Замените <GROUP_NAME> подходящим названием группы обновлений. Группа обновления должна быть той же, в которой находится раздел поставщика.

Для устройств с разделами A/B и виртуальными разделами A/B: device.mk

AB_OTA_PARTITIONS += vendor_dlkm

fstab

Добавьте в fstab следующую запись для vendor_dlkm: Измените параметры в соответствии с устройством. В качестве примера используйте CL Add vendor_dlkm to CF.

vendor_dlkm /vendor_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

Пример сборки odm_dlkm

Создайте строку odm_dlkm, как показано в примерах ниже.

BoardConfig.mk

BOARD_USES_ODM_DLKIMAGE := true
BOARD_ODM_DLKIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_ODM_DLKM := odm_dlkm
BOARD_<group_name>_PARTITION_LIST += odm_dlkm

Для устройств с поддержкой A/B и виртуальных A/B-обновлений: device.mk

AB_OTA_PARTITIONS += odm_dlkm

fstab

Добавьте в fstab следующую запись для odm_dlkm: Изменяйте флаги в зависимости от устройства. В качестве примера используйте CL Add odm_dlkm to CF.

odm_dlkm /odm_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

Скопируйте модули ядра в раздел

Чтобы выбрать модули ядра, которые нужно скопировать в раздел vendor_dlkm, перечислите их в файле BOARD_VENDOR_KERNEL_MODULES.

Если вы хотите переопределить содержимое поля modules.load, укажите его в поле BOARD_VENDOR_KERNEL_MODULES_LOAD.

Во время сборки модули, перечисленные в BOARD_VENDOR_KERNEL_MODULES, устанавливаются в $ANDROID_PRODUCT_OUT/vendor_dlkm/lib/modules. Символическая ссылка создана в /vendor/lib/modules и ведет к /vendor_dlkm/lib/modules.

Аналогичным образом, чтобы выбрать модули ядра, которые нужно скопировать в раздел odm_dlkm, перечислите их в BOARD_ODM_KERNEL_MODULES. Сборка платформы запускает depmod для модулей и копирует выходные файлы depmod в образ. В результате сборки создается файл modules.load, который сохраняется в образе. В этом файле содержатся все модули, перечисленные в BOARD_ODM_KERNEL_MODULES.

Если вы хотите переопределить содержимое поля modules.load, укажите его в поле BOARD_ODM_KERNEL_MODULES_LOAD.

Во время сборки модули, перечисленные в BOARD_ODM_KERNEL_MODULES, устанавливаются в $ANDROID_PRODUCT_OUT/odm_dlkm/lib/modules. Символическая ссылка создается в /odm/lib/modules и ведет к /odm_dlkm/lib/modules.

Всегда используйте /vendor/lib/modules и /odm/lib/modules для модулей ядра поставщика и ODM.

Никогда не используйте /vendor_dlkm/lib/modules. На устройствах без раздела vendor_dlkm ОС BOARD_VENDOR_KERNEL_MODULES устанавливается непосредственно в раздел /vendor/lib/modules. Это проблема, поскольку /vendor_dlkm/lib/modules не существует.

Не используйте /odm_dlkm/lib/modules. На устройствах без раздела odm_dlkm BOARD_ODM_KERNEL_MODULES устанавливается непосредственно в /odm/lib/modules. Это проблема, поскольку /odm_dlkm/lib/modules не существует.

Монтирование разделов и загрузка модулей

Во время first_stage_init разделы vendor_dlkm и odm_dlkm монтируются в каталоги /vendor_dlkm и /odm_dlkm соответственно. В этом случае становятся доступны символические ссылки в каталогах /vendor/lib/modules и /odm/lib/modules.

Затем процесс поставщика (например, скрипт .rc) может загрузить модули ядра в порядке, указанном в файле modules.load. При необходимости процесс поставщика также может загрузить модули позже.

Документацию по созданию раздела vendor-boot (содержащего RAMDisk поставщика) можно найти в разделе Поддержка модулей ядра.