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

Крайне важно поддерживать стабильный интерфейс модулей ядра (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). The respective build.config configuration files, such as the GKI build config build.config.gki.aarch64 , ensure that the included tools are used correctly to generate consistent build results.

Использование процесса герметической сборки также гарантирует, что описание 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.