Обзор модулей ядра

Существует два типа модулей ядра: модули GKI, не зависящие от аппаратного обеспечения, и модули поставщика, зависящие от аппаратного обеспечения. На этой странице приведена общая информация об обоих типах модулей.

Модули GKI

Модули GKI используются для предоставления возможностей ядра, не требуемых для загрузки, отдельно от основного ядра. Модули GKI позволяют выбирать, какие функции ядра использовать, что часто приводит к уменьшению размера образа ядра и потребления памяти во время выполнения. Благодаря уменьшенному размеру GKI хорошо подходит для устройств Android Go и других устройств с ограниченными ресурсами.

Модули GKI также позволяют поставщикам внедрять новые функции после заморозки KMI. Встроенный код нельзя заменить, не создав новое изображение, а код, предоставленный в виде модуля, можно заменить другим модулем.

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

Существует два логических типа модулей GKI: защищенный модуль GKI и незащищенный модуль GKI.

Защищенный модуль GKI

Защищенный модуль GKI поставляется Google, не имеет никаких ограничений и ведет себя так, как будто он был создан с ядром после загрузки. Кроме того, защищенные модули GKI обладают следующими характеристиками:

  • Защищенные модули GKI имеют доступ к символам ядра, не относящимся к KMI, которые недоступны для модулей поставщиков или незащищенных модулей GKI.
  • Защищенные модули GKI могут экспортировать символы, которые становятся частью интерфейса KMI, если эти символы указаны в списке символов.
  • Защищенные модули GKI нельзя переопределить модулями поставщика.

Защищенный модуль GKI – это класс модулей GKI по умолчанию. Все модули GKI считаются защищенными на момент заморозки KMI.

Незащищенный модуль GKI

Модуль GKI без защиты может быть переопределен модулем поставщика. После заморозки KMI защищенный модуль GKI может быть реклассифицирован как незащищенный, если команда GKI решит, что поставщикам необходимо переопределить реализацию по умолчанию версией, включающей новые функции из вышестоящего Linux. В следующем выпуске GKI незащищенные модули будут классифицированы как защищенные после того, как вышестоящий код попадет в Android Common Kernel (ACK). Незащищенные модули GKI имеют следующие характеристики:

  • Незащищенные модули GKI имеют такой же доступ к экспортированным символам, как и модули поставщиков.
  • Незащищенные модули GKI не могут экспортировать символы, экспортированные защищенными модулями GKI.
  • Незащищенные модули GKI должны сохранять все интерфейсы KMI так, как если бы они были частью основного ядра.
  • Модули GKI без защиты могут быть переопределены модулями поставщика.

Модули поставщиков

Модуль поставщика предоставляется партнерами для реализации функций, связанных с SoC и устройством. Любой существующий модуль ядра, который не входит в состав ядра GKI, можно предоставить как модуль поставщика.

Поскольку одна из основных целей проекта GKI – минимизировать в основном ядре код, предназначенный для конкретного оборудования, поставщики могут ожидать, что ядро GKI не будет включать модули, которые явно управляют их собственным оборудованием. Например, поставщик ABC Inc. может быть уверен, что конфигурации, такие как CONFIG_ABC_SOC_SUPPORT, не будут включены ни как встроенные, ни как загружаемые модули GKI без его поддержки.

Если драйвер ядра или фреймворк есть в ACK, но не поставляется в составе ядра GKI, поставщики могут изменить драйвер и поставлять его как модуль поставщика. Такие изменения не рекомендуются для модулей, не зависящих от поставщика, поскольку те же возможности могут быть предоставлены с ядром GKI в будущем выпуске. Если ядро GKI содержит функции, предоставляемые модулем поставщика, модуль поставщика не загружается. Например, в Android 11 для GKI не задан параметр CONFIG_GREYBUS, поэтому поставщики могут предоставлять модули поставщика Greybus. Однако в Android 12 CONFIG_GREYBUS может быть включен как встроенный модуль GKI. В этом случае модули поставщика greybus не будут загружены. Рекомендуется использовать версию драйверов, не относящихся к определенному поставщику, из основного репозитория, если они поставляются как модули поставщика.

Модули поставщика можно передавать в файле vendor или в изображении vendor_boot. Модули, необходимые на ранних этапах загрузки, должны находиться в vendor_boot. Загрузка модулей из vendor_boot увеличивает время загрузки.