Примечания к выпуску ядра

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

Новые функции ядра 6.12

В этом разделе описаны новые функции ядра 6.12.

Профилирование распределения памяти

Чтобы понять, как используется память, нужно знать, где она выделяется. В ядре 6.12 появилась новая система атрибуции распределения памяти – профилирование распределения памяти (CONFIG_MEM_ALLOC_PROFILING в конфигурации). При профилировании распределения памяти каждое распределение связывается с уникальной строкой исходного кода, что позволяет быстро выявлять проблемы с распределением. Кроме того, профилирование распределения памяти:

  • Используется на этапе разработки, но доступен в стандартном образе GKI.

  • Его можно включить с помощью параметра sysctl.vm.mem_profiling boot.

  • Работает как с модулями ядра, так и с загруженными модулями.

Ускорение io_uring с помощью чтения без копирования и многократного чтения

В ядре 6.12 модули statsd и logd используют функцию sendfile с нулевым копированием, что повышает их производительность.

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

Улучшенные возможности и поддержка фильтра пакетов Berkeley (BPF)

В ядре 6.12 цепочка инструментов BPF была перенесена для поддержки CO-RE и нескольких современных функций. Кроме того, новый загрузчик BPF позволяет использовать современный BPF для программ, входящих в AOSP.

Выполнение прокси-сервера

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

Новые функции ядра 6.6

В этом разделе описаны новые функции ядра 6.6.

Поддержка Rust

В нескольких проектах ядра 6.6 используется Rust.

Блокировки для каждой области виртуальной памяти (VMA)

В ядре 6.6 используются блокировки для каждой области виртуальной памяти, чтобы устранить проблемы с конфликтами при работе mmap_lock (ранее известного как mmap_sem). Благодаря этому время запуска приложений, использующих большое количество потоков, может сократиться на 20%.

Планировщик EEVDF заменил CFS

EEVDF заменяет Completely Fair Scheduler (CFS), чтобы лучше балансировать доступ к ЦП между короткими и длинными задачами.

Снижено энергопотребление при обратных вызовах RCU.

Параметр RCU_LAZY использует метод пакетной обработки обратных вызовов RCU на основе таймера для экономии энергии. Если система не загружена или находится в режиме ожидания, этот параметр может снизить энергопотребление на 5–10 %.

Улучшенное сжатие памяти ZRAM

Новая настройка сборки CONFIG_ZRAM_MULTI_COMP позволяет ZRAM повторно сжимать страницы с помощью одного из трех альтернативных алгоритмов. Это позволяет освободить больше места для активных задач.

Новые функции ядра 6.1

В этом разделе описаны новые функции ядра 6.1.

Повышенная безопасность благодаря целостности потока управления ядром (KCFI)

KCFI заменяет целостность потока управления (CFI), что позволяет снизить стоимость выполнения и избежать затрат времени на сборку. Благодаря снижению затрат на выполнение KCFI можно включить в большем количестве мест, чем CFI, в частности в точках трассировки и хуках поставщиков.

Помимо KCFI, в ядре 6.1 реализовано несколько функций безопасности, таких как строгая проверка границ memcpy и меры по предотвращению атак с использованием спекулятивного выполнения.

Дополнительную информацию о KCFI можно найти в статье Целостность потока управления ядром.

Многопоколенческий алгоритм LRU (MGLRU)

MGLRU был добавлен в ядро 6.1, чтобы улучшить управление памятью за счет более точного определения того, какие страницы используются. Это улучшение позволяет реже останавливать приложения, когда системе не хватает памяти. Кроме того, обновление повышает удобство использования устройства, поскольку оно становится более отзывчивым.

Реализация MGLRU также включает поддержку нового безопасного для RCU дерева maple, которое в некоторых случаях можно использовать вместо красно-черного дерева (rbtree). При использовании безопасного для RCU дерева maple производительность повышается за счет меньшего объема занимаемой памяти и отсутствия блокировок.

Дополнительную информацию о MGLRU можно найти в статье Multi-Gen LRU.

Планирование

Поддержка и обновление планировщика – ключевой аспект работы по улучшению ядра. Обновления ядра в версии 6.1:

  • Добавлено планирование с учетом кластеров, которое повышает производительность за счет переноса на ядра, использующие общий кеш L2.
  • Удалена ненужная эвристика запаса энергии. Ограничив некоторые переносы, это обновление повышает эффективность использования энергии до 5%.
  • Улучшена балансировка нагрузки, чтобы уменьшить задержку при пробуждении.
  • Ускоренные льготные периоды RCU перенесены в поток ядра реального времени. Это обновление значительно снизило задержки, связанные с RCU.

Графика

Ядро 6.1 содержит новые методы для dma-buf, позволяющие экспортировать и импортировать файлы синхронизации, что соответствует требованиям Vulcan Video API.

Новый метод futex_waitv() упрощает перенос игр с других платформ, поскольку позволяет одновременно ожидать несколько объектов futex.

Инструменты отладки

Используйте Kernel Concurrency SANitizer (KCSAN) в отладочных сборках, чтобы выявлять гонки в коде ядра.

Кроме того, используйте Kernel Memory SANitizer (KMSAN), чтобы найти неинициализированные значения в ядре.

Улучшенная поддержка ARM64

Ядро 6.1 содержит ряд улучшений для архитектуры ARM64, в том числе:

  • Поддержка расширений таймера ARMv8.6
  • Поддержка алгоритма аутентификации указателей QARMA3
  • Первоначальная поддержка масштабируемого матричного расширения (SME) ARMv9
  • Улучшения в исправлении альтернативных функций, благодаря чему размер образа ядра уменьшился