В 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 поставщика) можно найти в разделе Поддержка модулей ядра.