Конфигурация ядра

Используйте следующие параметры конфигурации в качестве основы для конфигурации ядра Android. Настройки организованы в файлы .cfg для android-base , android-base- ARCH и android-recommended :

  • android-base включают основные функции Android и должны быть настроены, как указано на всех устройствах.
  • android-base- ARCH включают основные функции Android и должны быть настроены в соответствии со спецификациями всех устройств с архитектурой ARCH . Не для всех архитектур есть соответствующий файл с требуемыми параметрами для конкретной архитектуры. Если в вашей архитектуре нет файла, у нее нет дополнительных требований к конфигурации ядра для конкретной архитектуры для Android.
  • android-recommended . Эти параметры включают расширенные функции Android и являются необязательными для устройств.

Эти файлы конфигурации находятся в kernel/configs . Используйте набор файлов конфигурации, соответствующий используемой версии ядра.

Подробнее об элементах управления, уже предпринятых для усиления ядра на ваших устройствах, см. в разделе Безопасность системы и ядра . Дополнительные сведения о необходимых параметрах см. в документе определения совместимости с Android (CDD) .

Сгенерировать конфигурацию ядра

Для устройств с минималистским форматом defconfig используйте сценарий merge_config.sh в дереве ядра, чтобы включить параметры:

ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg

При этом создается файл .config , который можно использовать для сохранения нового файла defconfig или компиляции нового ядра с включенными функциями Android.

Дополнительные требования к конфигурации ядра

В некоторых случаях специалист по поддержке платформы может выбирать из нескольких функций ядра, чтобы удовлетворить зависимость от Android. Такие зависимости не могут быть выражены в файлах фрагментов конфигурации ядра (описанных выше), потому что формат этих файлов не поддерживает логические выражения. В Android 9 и более поздних версиях набор тестов совместимости (CTS) и набор тестов поставщиков (VTS) проверяют выполнение следующих требований:

  • CONFIG_OF=y или CONFIG_ACPI=y
  • Ядра 4.4 и 4.9 имеют CONFIG_ANDROID_LOW_MEMORY_KILLER=y ИЛИ оба имеют CONFIG_MEMCG=y и CONFIG_MEMCG_SWAP=y
  • CONFIG_DEBUG_RODATA=y или CONFIG_STRICT_KERNEL_RWX=y
  • CONFIG_DEBUG_SET_MODULE_RONX=y или CONFIG_STRICT_MODULE_RWX=y
  • Только для ARM64: CONFIG_ARM64_SW_TTBR0_PAN=y или CONFIG_ARM64_PAN=y

Кроме того, для параметра CONFIG_INET_UDP_DIAG должно быть установлено значение y для ядер 4.9 в Android 9 и выше.

Включить параметры режима хоста USB

Для аудио в режиме USB-хоста включите следующие параметры:

CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=y
# CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver

Для USB-хоста в режиме MIDI включите следующую опцию:

CONFIG_SND_USB_MIDI=y

Seccomp BPF с TSYNC

Secure Computing Berkeley Packet Filter (Seccomp BPF) — это технология безопасности ядра, которая позволяет создавать изолированные программные среды, определяющие контекст, в котором процесс может выполнять системные вызовы. Функция синхронизации потоков (TSYNC) позволяет использовать Seccomp BPF из многопоточных программ. Эта возможность ограничена архитектурами, в которых Seccomp поддерживает восходящий поток (ARM, ARM64, x86 и x86_64).

Демон Android Live-Lock

Android 10 включает демона Android Live-Lock ( llkd ), который предназначен для обнаружения и устранения взаимоблокировок ядра. Подробнее об использовании llkd см. в разделе Демон Android Live-Lock .

vDSO32 на ARM64

Виртуальный динамический общий объект (vDSO) — это альтернатива системным вызовам, которые при правильном использовании и настройке могут снизить затраты на цикл. В Android 10 добавлена ​​поддержка vDSO32 для 64-битных ядер (Android уже поддерживает vDSO64 для 64-битных ядер и vDSO32 для 32-битных ядер). Использование vDSO32 ( CONFIG_VDSO_COMPAT ) на архитектуре ARM64 обеспечивает увеличение времени автономной работы на 0,4% и другие улучшения производительности.

Сообщество Linux активно работает над объединением vDSO для различных архитектур . Вы можете настроить vDSO в ядре Linux, включив vDSO32 с помощью CONFIG_COMPAT и CONFIG_CROSS_COMPILE_COMPAT_VDSO с триплетом компилятора arm32. Команда Android Kernel перенесла старые версии серии исправлений vDSO на устройства Pixel, поэтому вы можете найти примеры в сборках ядра Pixel (путь LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN , справочник CROSS_COMPILE_ARM32 и конфигурацию CONFIG_CROSS_COMPILE_ARM32 ).

Конфигурация с низким объемом оперативной памяти

Настройте ядро/ActivityManager, чтобы уменьшить прямое восстановление

Прямое освобождение происходит, когда процесс или ядро ​​​​пытается выделить страницу памяти (либо напрямую, либо из-за сбоя в новой странице), и ядро ​​​​использует всю доступную свободную память. Это требует, чтобы ядро ​​блокировало выделение, пока оно освобождает страницу. Это, в свою очередь, часто требует дискового ввода-вывода, чтобы сбросить грязную страницу с резервной копией файла или дождаться, пока lowmemorykiller остановит процесс. Это может привести к дополнительным операциям ввода-вывода в любом потоке, включая поток пользовательского интерфейса.

Чтобы избежать прямого восстановления, в ядре есть водяные знаки, которые запускают kswapd или восстановление в фоновом режиме. Это поток, который пытается освободить страницы, чтобы в следующий раз, когда реальный поток выделял память, он мог быстро добиться успеха.

Пороговое значение по умолчанию для запуска восстановления в фоновом режиме довольно низкое, около 2 МБ на устройстве с 2 ГБ и 636 КБ на устройстве с 512 МБ. Ядро восстанавливает только несколько мегабайт памяти в фоновом режиме. Это означает, что любой процесс, который быстро выделяет больше нескольких мегабайт, быстро столкнется с прямым возвратом.

Поддержка настраиваемого ядра добавлена ​​в ветку ядра Android-3.4 в виде патча 92189d47f66c67e5fd92eafaa287e153197a454f («добавить дополнительные свободные килобайты настраиваемого»). Вишневый выбор этого патча для ядра устройства позволяет ActivityManager сообщить ядру, чтобы попытаться сохранить три полноэкранных 32-битных буфера памяти свободными.

Эти пороговые значения можно настроить с помощью среды config.xml .

<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable
in the kernel (if it exists). A high value will increase the amount of memory
that the kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A low value allows more memory to be used by
processes but may cause more allocations to block waiting on disk I/O or
lowmemorykiller. Overrides the default value chosen by ActivityManager based
on screen size. 0 prevents keeping any extra memory over what the kernel keeps
by default. -1 keeps the default. -->
<integer name="config_extraFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes
tunable in the kernel (if it exists). 0 uses the default value chosen by
ActivityManager. A positive value will increase the amount of memory that the
kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A negative value allows more memory to be
used by processes but may cause more allocations to block waiting on disk I/O
or lowmemorykiller. Directly added to the default value chosen by
ActivityManager based on screen size. -->
<integer name="config_extraFreeKbytesAdjust">0</integer>

Настроить LowMemoryKiller

ActivityManager настраивает пороговые значения LowMemoryKiller в соответствии с ожидаемым рабочим набором страниц с файловой поддержкой (кэшированных страниц), необходимых для запуска процессов в каждом сегменте уровня приоритета. Если устройство предъявляет высокие требования к рабочему набору, например, если пользовательскому интерфейсу поставщика требуется больше памяти или если добавлено больше служб, пороговые значения можно увеличить.

Пороги могут быть уменьшены, если слишком много памяти зарезервировано для страниц с файловой поддержкой, так что фоновые процессы будут останавливаться задолго до того, как произойдет перегрузка диска из-за того, что кеш становится слишком маленьким.

<!-- Device configuration setting the minfree tunable in the lowmemorykiller
in the kernel. A high value will cause the lowmemorykiller to fire earlier,
keeping more memory in the file cache and preventing I/O thrashing, but
allowing fewer processes to stay in memory. A low value will keep more
processes in memory but may cause thrashing if set too low. Overrides the
default value chosen by ActivityManager based on screen size and total memory
for the largest lowmemorykiller bucket, and scaled proportionally to the
smaller buckets. -1 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the minfree tunable in the
lowmemorykiller in the kernel. A high value will cause the lowmemorykiller to
fire earlier, keeping more memory in the file cache and preventing I/O
thrashing, but allowing fewer processes to stay in memory. A low value will
keep more processes in memory but may cause thrashing if set too low. Directly
added to the default value chosen by ActivityManager based on screen
size and total memory for the largest lowmemorykiller bucket, and scaled
proportionally to the smaller buckets. 0 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAdjust">0</integer>