Как настроить функции ядра в виде модулей GKI

На этой странице рассказывается, как настроить новую функцию ядра в качестве модуля GKI или настроить существующую встроенную функцию ядра в качестве модуля GKI.

Как настроить новую функцию в качестве модуля GKI

  1. Для новой функции измените gki_defconfig и задайте для обязательного элемента конфигурации функции ядра значение m (=m) вместо n. Укажите это значение в arch/arm64/configs/gki_defconfig и arch/x86/configs/gki_defconfig.

  2. Добавьте файлы KO (.ko), созданные для функции, в раздел _COMMON_GKI_MODULES_LIST следующего файла: Добавляйте файлы в отсортированном порядке. Если вы не уверены, какие файлы были сгенерированы, сборка завершится ошибкой и вы увидите список всех необходимых KO-файлов, которые нужно добавить в список.

    • В версии android17-6.18 и более поздних добавьте объекты в common/bazel/modules_private.bzl.
    • В android16-6.12 и более ранних версиях добавляйте элементы в common/modules.bzl.
  3. Для Android 14 добавьте тот же набор KO-файлов, что и на шаге 2, отсортированных по возрастанию для двоичного поиска во время выполнения, в common/android/gki_{ARCH}_protected_modules, чтобы обозначить модуль как защищенный модуль GKI.

  4. Для Android 14 и 15 обновите список экспортов, чтобы он включал новые экспорты, добавленные в common/android/abi_gki_protected_exports_ARCHITECTURE. Например, чтобы обновить список, выполните команду tools/bazel run //common:kernel_aarch64_abi_update_protected_exports для aarch64.

  5. Убедитесь, что добавленные на шаге 2 файлы KO скопированы в каталоги ядра out/<androidX-Y.Z>/dist/system_dlkm.img и out/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz. Модули в архиве system_dlkm_staging_archive.tar.gz можно использовать в качестве входных данных для создания system_dlkm.img на платформе.

  6. Отправьте изменения на проверку. Модули GKI – это функция ядра, доступная только в Android, поэтому патчи для преобразования модулей не нужно отправлять в основной репозиторий. Однако для отправки исправлений общего ядра Android (ACK) необходимо следовать другим рекомендациям.

Как настроить встроенную функцию ядра в качестве модуля GKI

  1. Для существующей встроенной функции ядра отредактируйте gki_defconfig и установите для элемента конфигурации требуемой функции ядра значение m (=m) вместо y. Задайте эту настройку как в arch/arm64/configs/gki_defconfig, так и в arch/x86/configs/gki_defconfig.

  2. Добавьте файлы KO (.ko), созданные для функции, в раздел _COMMON_GKI_MODULES_LIST следующего файла: Добавьте файлы в отсортированном порядке. Если вы не уверены, что все файлы созданы, сборка завершится с ошибкой и будет показан список всех необходимых файлов KO, которые нужно добавить.

    • В android17-6.18 и более поздних версиях добавьте элементы в common/bazel/modules_private.bzl.
    • В версии android16-6.12 и более ранних добавьте элементы в файл `common/modules.bzl`.
  3. Для Android 14 добавьте тот же набор KO-файлов, что и на шаге 2, отсортированных по возрастанию для двоичного поиска во время выполнения, в common/android/gki_{ARCH}_protected_modules, чтобы обозначить модуль как защищенный модуль GKI.

  4. Для Android 14 и 15 обновите список защищенных экспортируемых данных, добавив в него данные из нового модуля в common/android/abi_gki_protected_exports_{ARCH} с помощью tools/bazel run //common:kernel_aarch64_abi_update_protected_exports для aarch64.

  5. Убедитесь, что новые файлы KO модуля, преобразованные на шаге 2, скопированы в out/<androidX-Y.Z>/dist/system_dlkm.img и out/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz ядра. Модули в архиве system_dlkm_staging_archive.tar.gz можно использовать в качестве входных данных для создания system_dlkm.img на платформе.

  6. Отправьте изменения на проверку. Модули GKI – это функция ядра, доступная только в Android, поэтому патчи для преобразования модулей не нужно отправлять в основной репозиторий. Однако вы должны следовать другим рекомендациям по отправке исправлений для общего ядра Android (ACK).

Как преобразовать защищенный модуль GKI в незащищенный

  1. Для Android 15 и более поздних версий добавьте модуль, который преобразуется из защищенного в незащищенный, в список _COMMON_UNPROTECTED_MODULES_LIST в следующем файле:

    • В версии android17-6.18 и более поздних добавьте объекты в common/bazel/modules_private.bzl.
    • В android16-6.12 и более ранних версиях добавляйте элементы в common/modules.bzl.
  2. В Android 14 удалите модуль, который преобразуется из защищенного в незащищенный, из списка защищенных модулей в common/android/gki_protected_modules.

  3. В Android 14 и 15 обновите список защищенных экспортов, исключив из него экспорты из нового незащищенного модуля в common/android/abi_gki_protected_exports_{ARCH}, используя tools/bazel run //common:kernel_aarch64_abi_update_protected_exports для aarch64.

  4. Отправьте изменения на проверку. Модули GKI – это функция ядра, доступная только в Android, поэтому патчи для преобразования модулей не нужно отправлять в основной репозиторий. Однако вы должны соблюдать другие правила, чтобы отправлять исправления для общего ядра Android (ACK).

Краткое руководство по устранению нарушений символов в модулях GKI

Если неподписанные модули нарушают защиту символов, установленную для модулей GKI, при загрузке модуля могут возникнуть два типа ошибок, которые приведут к сбою.

1. Модуль без подписи, в котором используется защищенный символ

Ошибка

module: Protected symbol: some_kernel_function (err -13)

Причина

Файл module.ko – это неподписанный модуль поставщика, который при загрузке пытается разрешить экспортированный символ модуля GKI some_kernel_function, не будучи указанным в списке символов поставщика.

Разрешение

Если module.ko не является защищенным модулем GKI, обновление списка символов устранит ошибку, добавив some_kernel_function в список символов поставщика. Вы также можете использовать версию GKI module.ko.

2. Модуль без подписи экспортирует защищенный символ

Ошибка

module: exports protected symbol some_kernel_function

Причина

Модуль, экспортирующий some_kernel_function, является защищенным модулем GKI, а module.ko, скорее всего, – неподписанная пользовательская версия этого модуля. Когда module.ko пытается экспортировать some_kernel_function, который можно экспортировать только с помощью подписанного модуля GKI, загрузка завершается неудачно с этим сообщением.

Решение

Если неподписанный модуль является пользовательской версией, это можно исправить, используя версию GKI модуля, который экспортирует some_kernel_function.