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

Существует два типа модулей ядра: аппаратно-независимые модули 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 связана с затратами времени загрузки.