Существует два типа модулей ядра: аппаратно-независимые модули 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 не будут загружены. Лучшей практикой является использование исходной версии драйверов, не зависящих от поставщика, если они поставляются в виде модулей поставщика.
Вы можете доставлять модули поставщика в образе vendor
или в vendor_boot
. Модули, необходимые на ранних этапах процесса загрузки, должны находиться в vendor_boot
. Загрузка модулей vendor_boot
связана с затратами времени загрузки.