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

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