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

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

Модули GKI

Модули образа ядра (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 не будут загружены. Рекомендуется использовать версию upstream для драйверов, не специфичных для поставщика, если они поставляются как модули поставщика.

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