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

В Android 11 представлена ​​концепция универсального образа ядра и загрузочного раздела поставщика. Загрузочный раздел поставщика хранит модули ядра, совместимые с 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 и Virtual A/B device.mk .

AB_OTA_PARTITIONS += vendor_dlkm

fstab

Добавьте следующую запись vendor_dlkm в fstab. Измените флаги в зависимости от устройства. В качестве примера используйте команду CL 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 и Virtual A/B device.mk .

AB_OTA_PARTITIONS += odm_dlkm

fstab

Добавьте следующую запись для odm_dlkm в fstab. Измените флаги в зависимости от устройства. В качестве примера используйте 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 . При необходимости процесс поставщика также может загрузить модули позже.

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