Образ ядра Generic (GKI) может не содержать необходимой поддержки драйверов для монтирования разделов устройством. Чтобы устройство могло монтировать разделы и продолжить загрузку, на первом этапе init
загружаются модули ядра, находящиеся на RAM-диске. RAM-диск разделён на RAM-диски Generic и Vendor. Модули ядра Vendor хранятся в RAM-диске Vendor. Порядок загрузки модулей ядра можно настраивать.
Расположение модуля
RAM-диск — это файловая система для первой стадии init,
и образа recovery/fastbootd на устройствах A/B и виртуальных устройствах A/B. Это initramfs
состоящий из двух cpio-архивов, которые объединяются загрузчиком. Первый cpio-архив, хранящийся как RAM-диск поставщика в разделе vendor-boot, содержит следующие компоненты:
- Модули ядра поставщика первой ступени
init
, расположенные в/lib/modules/
. - Файлы конфигурации
modprobe
, расположенные в/lib/modules/
:modules.dep
,modules.softdep
,modules.alias
,modules.options
. - Файл
modules.load
, который указывает, какие модули следует загрузить на первом этапе и в каком порядке, в/lib/modules/
. - Модули ядра восстановления поставщика для устройств A/B и виртуальных устройств A/B в
/lib/modules/
-
modules.load.recovery
, который указывает модули для загрузки и порядок их загрузки для устройств A/B и виртуальных устройств A/B в/lib/modules
.
Второй архив cpio, который поставляется вместе с GKI как ramdisk boot.img и применяется поверх первого, содержит first_stage_init
и библиотеки, от которых он зависит.
Загрузка модуля на первом этапе инициализации
Первый этап init
начинается со чтения файлов конфигурации modprobe из каталога /lib/modules/
на RAM-диске. Затем он считывает список модулей, указанный в файле /lib/modules/modules.load
(или, в случае восстановления, /lib/modules/modules.load.recovery
), и пытается загрузить каждый из этих модулей по порядку, следуя конфигурации, указанной в ранее загруженных файлах. Запрошенный порядок может быть изменён для удовлетворения жёстких или мягких зависимостей.
Поддержка сборки, инициализация первого этапа
Чтобы указать модули ядра, которые необходимо скопировать в RAM-диск поставщика cpio, перечислите их в BOARD_VENDOR_RAMDISK_KERNEL_MODULES
. Сборка запускает depmod
для этих модулей и помещает полученные файлы конфигурации modprobe в RAM-диск поставщика cpio.
Сборка также создаёт файл modules.load
и сохраняет его в RAM-диске поставщика cpio. По умолчанию он содержит все модули, перечисленные в BOARD_VENDOR_RAMDISK_KERNEL_MODULES
. Чтобы переопределить содержимое этого файла, используйте BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD
, как показано в этом примере:
BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := \ device/vendor/mydevice-kernel/first.ko \ device/vendor/mydevice-kernel/second.ko \ device/vendor/mydevice-kernel/third.ko
Поддержка сборки, полная поддержка Android
Как и в Android 10 и более ранних версиях, модули ядра, перечисленные в BOARD_VENDOR_KERNEL_MODULES
, копируются сборкой платформы Android в раздел поставщика по адресу /vendor/lib/modules
. Сборка платформы запускает depmod
для этих модулей и копирует выходные файлы depmod
в раздел поставщика по тому же адресу. Механизм загрузки модулей ядра из /vendor
остаётся таким же, как и в предыдущих версиях Android. Вы сами решаете, как и когда загружать эти модули, хотя обычно это делается с помощью скриптов init.rc
Подстановочные знаки и интегрированные сборки ядра
Поставщики, объединяющие сборку ядра своего устройства со сборкой платформы Android, могут столкнуться с проблемой при использовании вышеупомянутых макросов BOARD
для указания модулей ядра, которые необходимо скопировать на устройство. Если поставщик не хочет перечислять модули ядра в файлах сборки платформы устройства, он может использовать подстановочный знак ( $(wildcard device/vendor/mydevice/*.ko
). Обратите внимание, что подстановочный знак не работает в случае интегрированной сборки ядра, поскольку при вызове make и раскрытии макросов в make-файлах модули ядра ещё не собраны, поэтому макросы пусты.
Чтобы обойти эту проблему, поставщик может заставить сборку ядра создать ZIP-архив, содержащий модули ядра, которые нужно скопировать в каждый раздел. Укажите путь к этому ZIP-архиву в BOARD_*_KERNEL_MODULES_ARCHIVE
где *
— имя раздела (например, BOARD_VENDOR_KERNEL_MODULES_ARCHIVE
). Сборка для платформы Android распаковывает этот ZIP-архив в соответствующее место и запускает depmod
для модулей.
ZIP-архив модуля ядра должен иметь правило make, которое гарантирует, что сборка платформы сможет сгенерировать архив при необходимости.
Восстановление
В предыдущих версиях Android модули ядра, необходимые для восстановления, указывались в макросе BOARD_RECOVERY_KERNEL_MODULES
. В Android 12 модули ядра, необходимые для восстановления, по-прежнему указываются с помощью этого макроса. Однако модули ядра для восстановления копируются в RAM-диск поставщика cpio, а не в универсальный RAM-диск cpio. По умолчанию все модули ядра, перечисленные в BOARD_RECOVERY_KERNEL_MODULES
, загружаются на первом этапе init
. Если требуется загрузить только подмножество этих модулей, укажите содержимое этого подмножества в BOARD_RECOVERY_KERNEL_MODULES_LOAD
.
Сопутствующая документация
Информацию о создании загрузочного раздела поставщика (содержащего виртуальный диск поставщика, упомянутый на этой странице) см. в разделе Загрузочные разделы .