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

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

модули GKI

Модули Generic kernel image (GKI) используются для предоставления возможностей ядра, не требующих загрузки, отдельно от основного ядра. С помощью модулей GKI можно выбирать конкретные возможности ядра для использования, что часто уменьшает размер образа ядра и потребление памяти во время выполнения. Уменьшение размера делает GKI хорошо подходящим для устройств Android Go и других форм-факторов с ограниченными ресурсами.

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

Модули GKI используют инфраструктуру подписи, создаваемую на этапе сборки ядра, для различения модулей 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 (ACK). Незащищенные модули GKI имеют следующие характеристики:

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

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

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

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

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

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