Поддерживать стабильный интерфейс модуля ядра (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 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.