Поддерживать стабильный интерфейс модуля ядра (KMI)

Крайне важно поддерживать стабильный KMI для модулей поставщиков. Ядро GKI собирается и поставляется в бинарном виде, а загружаемые поставщиком модули строятся в отдельном дереве. В результате ядро ​​GKI и модули поставщика должны работать так, как если бы они были собраны вместе.

Как правило, Linux-сообщество не одобряет идею стабильности ABI в ядре для основного ядра. Перед лицом различных цепочек инструментов, конфигураций и постоянно развивающегося ядра основной ветки Linux невозможно поддерживать стабильный KMI в основной ветке. Однако можно поддерживать стабильный KMI в среде GKI с жесткими ограничениями при следующих ограничениях:

  • Только одна конфигурация, gki_defconfig , может использоваться для сборки ядра.

  • KMI стабилен только в одной и той же версии ядра LTS и Android, например android13-5.10 , android12-5.10 или android13-5.15 .

    • Для android-mainline не поддерживается стабильность KMI.
  • Для сборки ядра и модулей используется только конкретная цепочка инструментов Clang , поставляемая в AOSP и определенная для соответствующей ветки.

  • Только известные символы, используемые модулями, как указано в списке символов, отслеживаются на предмет стабильности и считаются символами KMI.

    • Следствием этого является то, что модули поставщиков должны использовать только символы KMI. Это ограничение применяется при неудачной загрузке модуля, если требуются символы, отличные от KMI.
  • После того, как ветвь KMI заморожена, изменения разрешены, но не могут нарушить KMI. Эти изменения включают следующее:

    • Изменения конфигурации
    • Изменения кода ядра
    • Изменения цепочки инструментов (включая обновления)

Используйте герметичный процесс сборки и набор инструментов LLVM

Герметичный процесс сборки обеспечивает стабильный KMI, поскольку манифесты repo в kernel/manifest полностью описывают среду сборки. Например, манифест для android13-5.15 включает набор инструментов, сценарии сборки и все остальное, необходимое для сборки ядра Generic Kernel Image (GKI). Соответствующие файлы конфигурации build.config , такие как конфигурация сборки GKI build.config.gki.aarch64 , обеспечивают правильное использование включенных инструментов для получения согласованных результатов сборки.

Использование герметичного процесса сборки также гарантирует согласованность описания ABI для дерева независимо от того, сгенерировано ли оно Google (например, abi_gki_aarch64.xml для android13-5.15 или сгенерировано в локальном дереве, которое включает модули поставщиков. Инструменты для создания и сравнения Описание ABI для интерфейса модуля ядра (KMI) также предоставляется как часть репозитория, описываемого манифестом.

Цепочка инструментов, используемая для сборки ядра GKI, должна быть полностью совместима с цепочкой инструментов, используемой для сборки модулей поставщиков. Начиная с Android 10, все ядра Android должны быть собраны с помощью цепочки инструментов LLVM. При использовании GKI цепочка инструментов LLVM, используемая для создания ядер продуктов и модулей поставщиков, должна генерировать тот же ABI, что и цепочка инструментов LLVM от AOSP, а партнеры должны обеспечить совместимость KMI с ядром GKI. Настоятельно рекомендуется использовать предоставленные инструменты сборки, поскольку они обеспечивают гарантии совместимости.

Что дальше?

  • Инструкции по сборке ядра с использованием герметичного процесса сборки и цепочки инструментов LLVM см. в разделе Сборка ядер .

  • Инструкции по мониторингу ABI и устранению проблем см. в статье Мониторинг ABI ядра Android.