Существует два типа модулей ядра: аппаратно-независимые модули GKI и аппаратно-зависимые модули поставщиков . На этой странице представлен обзор обоих типов модулей.
Модули ГКИ
Модули образа ядра Generic kernel image (GKI) используются для предоставления возможностей ядра, не требующих загрузки, отдельно от ядра Generic core. С помощью модулей GKI вы можете выбрать определенные возможности ядра для использования, что часто уменьшает размер образа ядра и потребление памяти во время выполнения. Уменьшение размера делает GKI хорошо подходящим для устройств Android Go и других форм-факторов с ограниченными ресурсами.
Модули GKI также предоставляют механизм, позволяющий поставщикам включать новые функции upstream после этапа заморозки 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 Common Kernel (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
связана с затратами времени загрузки.