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

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

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

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

  • KMI стабильно работает только в рамках одной и той же версии ядра LTS и Android, например, android14-6.1 , android15-6.6 или android16-6.12 .

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

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

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

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

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

Герметичный процесс сборки обеспечивает стабильность KMI за счет того, что манифесты repo в kernel/manifest полностью описывают среду сборки. Например, манифест для android16-6.12 включает в себя цепочку инструментов, систему сборки и все остальное, необходимое для сборки ядра Generic Kernel Image (GKI). Конфигурация сборки, в первую очередь BUILD.bazel , гарантирует правильное использование включенных инструментов для получения согласованных результатов сборки.

Использование герметичного процесса сборки также гарантирует согласованность описания ABI для дерева независимо от того, сгенерировано ли оно Google (например, gki/aarch64/abi.stg для android16-6.12 ) или в локальном дереве, включающем модули поставщика. Инструменты для создания и сравнения описания ABI для интерфейса модулей ядра (KMI) также предоставляются в рамках репозитория, описанного в манифесте.

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

Что дальше?

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

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