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

Используйте следующие параметры конфигурации в качестве основы для конфигурации ядра 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

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

CONFIG_SND_USB_MIDI=y

Seccomp BPF с TSYNC

Фильтр пакетов Беркли Secure Computing (Seccomp BPF) — это технология безопасности ядра, которая позволяет создавать песочницы, определяющие контекст, в котором процесс может выполнять системные вызовы. Функция синхронизации потока (TSYNC) позволяет использовать SECCOMP BPF из многопоточных программ. This ability is limited to architectures that have Seccomp support upstream (ARM, ARM64, x86, and x86_64).

Демон блокировки Android в реальном времени

Android 10 includes the Android live-lock daemon ( llkd ), which is designed to catch and mitigate kernel deadlocks. Подробную информацию об использовании llkd см. в разделе демон живой блокировки Android .

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 ).

Low RAM configuration

Настройте ядро ​​и 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 increases 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 increases 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>

Tune LowmemoryKiller

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

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

<!-- Device configuration setting the minfree tunable in the lowmemorykiller
in the kernel. A high value causes 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 keeps 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 causes 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
keeps 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>
,

Используйте следующие параметры конфигурации в качестве основы для конфигурации ядра 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 (Seccomp BPF) — это технология безопасности ядра, позволяющая создавать песочницы, определяющие контекст, в котором процесс может выполнять системные вызовы. Функция синхронизации потоков (TSYNC) позволяет использовать Seccomp BPF из многопоточных программ. Эта возможность ограничена архитектурами, имеющими поддержку Seccomp (ARM, ARM64, x86 и x86_64).

Демон Android Live-Lock

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

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 increases 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 increases 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>

Настройте низкий уровень памятиMemoryKiller

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

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

<!-- Device configuration setting the minfree tunable in the lowmemorykiller
in the kernel. A high value causes 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 keeps 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 causes 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
keeps 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>