В новую версию принято 16206 исправлений от 2127 разработчиков (в прошлом выпуске было 14203 исправления от 1995 разработчиков),
размер патча — 108 МБ (изменения затронули 14235 файлов, добавлено 1340982 строк кода, удалено 593836 строк). Около 44% всех представленных в 5.18 изменений связаны с драйверами устройств, примерно 16% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 11% связано с сетевым стеком, 3% — с файловыми системами и 3% c внутренними подсистемами ядра.
Основные новшества в ядре 5.18:
- Дисковая подсистема, ввод/вывод и файловые системы
- В файловой системе Btrfs добавлена поддержка проброса сжатых данных при выполнении операций send и receive. Ранее при использовании send/receive отправляющая сторона распаковывала данные, хранимые в сжатом виде, а принимающая повторно сжимала перед записью. В ядре 5.18 приложениям в пространстве пользователя, использующим вызовы send/receive, предоставлена возможность передачи сжатых данных без переупаковки. Функциональность реализована благодаря новым ioctl-операциям BTRFS_IOC_ENCODED_READ и BTRFS_IOC_ENCODED_WRITE, позволяющим напрямую читать и записывать информацию в экстенты.
Кроме того, в Btrfs повышена производительность fsync. Добавлена возможность дедупликации и выполнения reflink (клонирование метаданных файла с созданием ссылки на уже имеющиеся данные без их фактического копирования) для всего хранилища, не ограничиваясь точками монтирования.
- В режиме прямого ввода/вывода (Direct I/O) обеспечена возможность доступа к зашифрованным файлам при использовании в fscrypt inline-шифрования, в котором операции шифрования и расшифровки выполняются силами контроллера накопителя, а не ядра. При обычном шифровании силами ядра доступ к зашифрованным файлам при помощи Direct I/O как и раньше невозможен, так как обращение к файлам осуществляется минуя механизм буферизации в ядре.
- В NFS-сервере по умолчанию включена поддержка протокола NFSv3, которая теперь не требует отдельного включения и доступна при общем включении NFS. NFSv3 рассматривается как основная и всегда поддерживаемая версия NFS, а поддержка NFSv2 возможно в будущем будет прекращена. Значительно повышена эффективность чтения содержимого каталогов.
- Файловая система ReiserFS переведена в разряд устаревших и ожидает удаления в 2025 году. Перевод ReiserFS в разряд устаревших позволит снизить трудозатраты на сопровождение общих для файловых систем изменений, связанных с поддержкой нового API для монтирования, iomap и фолиантов.
- Для ФС F2FS реализована возможность маппинга идентификаторов пользователей примонтированных файловых систем, применяемого для сопоставления файлов определённого пользователя на примонтированном чужом разделе с другим пользователем в текущей системе.
- Переработан код для подсчёта статистики в обработчиках Device-mapper, что позволило заметно повысить точность аккаунтинга в таких обработчиках, как dm-crypt.
- Для устройств NVMe реализована поддержка 64-разрядных контрольных сумм для проверки целостности.
- Для файловой системы exfat предложена новая опция монтирования «keep_last_dots», запрещающая очистку точек в конце имени файла (в Windows точки в конце имени по умолчанию удаляются).
- В EXT4 повышена производительность режима fast_commit и увеличена масштабируемость. Опция монтирования «mb_optimize_scan», позволяющая повысить производительность в условиях большой фрагментации ФС, адаптирована для работы с файлами с экстентами.
- Прекращена поддержка потоков записи (write stream) в подсистеме, обеспечивающей работу блочных устройств. Указанная возможность была предложена для SSD, но не получила распространения и сейчас в обиходе отсутствуют устройства с поддержкой данного режима и маловероятно, что они появятся в будущем.
- В файловой системе Btrfs добавлена поддержка проброса сжатых данных при выполнении операций send и receive. Ранее при использовании send/receive отправляющая сторона распаковывала данные, хранимые в сжатом виде, а принимающая повторно сжимала перед записью. В ядре 5.18 приложениям в пространстве пользователя, использующим вызовы send/receive, предоставлена возможность передачи сжатых данных без переупаковки. Функциональность реализована благодаря новым ioctl-операциям BTRFS_IOC_ENCODED_READ и BTRFS_IOC_ENCODED_WRITE, позволяющим напрямую читать и записывать информацию в экстенты.
- Память и системные сервисы
- Началась интеграция набора патчей, позволяющего значительно сократить время пересборки ядра за счёт реструктуризации иерархии заголовочных файлов и сокращения числа перекрёстных зависимостей. В состав ядра 5.18 включены патчи, оптимизирующие структуру заголовочных файлов планировщика задач (kernel/sched). По сравнению с прошлым выпуском потребление процессорного времени при сборке кода kernel/sched/ сократилось на 61%, а фактическое время уменьшилось на 3.9% (с 2.95 до 2.84 сек).
- В коде ядра разрешено использование стандарта C11, опубликованного в 2011 году. Ранее добавляемый в ядро код должен был соответствовать спецификации ANSI C (С89), сформированной ещё в 1989 году.
В сборочных скриптах ядра 5.18 опция ‘—std=gnu89’ заменена на ‘—std=gnu11 -Wno-shift-negative-value’. Рассматривалась возможность использования стандарта C17, но в этом случае пришлось бы повышать минимально поддерживаемую версию GCC, включение же поддержки C11 укладывается в текущие требования к версии GCC (5.1). - Повышена производительность планирования задач на процессорах AMD с микроархитектурой Zen, в которых для каждого узла с локальными каналами памяти предоставляется несколько кэшей последнего уровня (LLC, Last Level Cache). В новой версии устранён дисбаланс LLC между узлами, что при некоторых видах нагрузки привело к существенному повышению производительности.
- Расширены средства для трассировки приложений в пространстве пользователя. В новой версии ядра добавлена возможность создания пользовательскими процессами событий трассировки (User events) и записи данных в буфер трассировки, которые могут быть просмотрены через типовые утилиты трассировки ядра, такие как ftrace и perf. События трассировки из пространства пользователя изолированны от событий трассировки ядра.
Состояние событий может быть просмотрено через файл /sys/kernel/debug/tracing/user_events_status, а регистрация события и запись данных через файл /sys/kernel/debug/tracing/user_events_data. - Добавлен механизм отслеживания (probe) вызовов функций — fprobe. API fprobe основан на ftrace, но ограничен только возможностью прикрепления callback-обработчиков к точкам входа в функцию и завершения работы функции. В отличие от kprobes и kretprobes, новый механизм позволяет использовать один обработчик сразу для нескольких функций.
- Прекращена поддержка старых процессоров ARM (ARMv4 и ARMv5), не оснащённых блоком управления памятью (MMU). Поддержка систем ARMv7-M без MMU сохранена.
- Прекращена поддержка RISC-подобной архитектуры NDS32, использовавшейся в процессорах компании Andes Technologies. Код удалён из-за отсутствия сопровождения и невостребованности поддержки NDS32 в основном ядре Linux (оставшиеся пользователи используют специализированные сборки ядра от производителей оборудования).
- По умолчанию отключена сборка ядра с поддержкой формата исполняемых файлов a.out для архитектур alpha и m68k, в которых данный формат продолжает использоваться. Вероятно, поддержка устаревшего формата a.out в скором времени будет полностью удалена из ядра. Планы по удалению формата a.out обсуждаются с 2019 года.
- Для архитектуры PA-RISC реализована минимальная поддержка механизма vDSO (virtual dynamic shared objects), предоставляющего ограниченный набор системных вызовов, доступный в пространстве пользователя без переключения контекста. Поддержка vDSO позволила реализовать возможность запуска с неисполняемым стеком.
- Добавлена поддержка механизма Intel HFI (Hardware Feedback Interface), позволяющего оборудованию передавать ядру сведения о текущей производительности и энергоэффективности каждого CPU.
- Добавлен драйвер для механизма Intel SDSi (Software-Defined Silicon), позволяющего управлять включением дополнительных возможностей в процессоре (например, специализированные инструкции и дополнительная кэш-память). Идея в том, что по более низкой цене могут поставляться чипы с заблокированными расширенными функциями, которые затем можно «докупить» и активировать дополнительные возможности без аппаратной замены чипа.
- Добавлен драйвер amd_hsmp для поддержки интерфейса AMD HSMP (Host System Management Port), предоставляющего доступ к функциям управления процессором через набор специальных регистров, появившихся в серверных процессорах AMD EPYC начиная с поколения Fam19h. Например, через HSMP можно получить данные об энергопотреблении и температуре, выставить ограничения на частоту, активировать различные режимы повышения производительности, управлять параметрами работы памяти.
- В интерфейсе асинхронного ввода/вывода io_uring реализована опция IORING_SETUP_SUBMIT_ALL для регистрации в кольцевом буфере набора файловых дескрипторов, а также операция IORING_OP_MSG_RING, позволяющая отправить сигнал из одного кольцевого буфера в другой кольцевой буфер.
- В механизме DAMOS (Data Access Monitoring-based Operation Schemes), позволяющем высвобождать память с учётом частоты обращения к памяти, расширены возможности по контролю за операциями с памятью из пространства пользователя.
- Интегрирована третья серия патчей с реализацией концепции фолиантов страниц памяти (page folios), которые напоминают объединённые страницы памяти (compound pages), но отличаются улучшенной семантикой и более понятной организацией работы. Использование фолиантов позволяет ускорить управление памятью в некоторых подсистемах ядра. В предложенных патчах осуществлён перевод на фолианты внутренних функций управления памятью, включая разновидности функции get_user_pages(). Предоставлена поддержка создания больших фолиантов в коде упреждающего чтения данных.
- В сборочной системе появилась поддержка переменных окружения USERCFLAGS и USERLDFLAGS, при помощи которых можно передать дополнительные флаги компилятору и компоновщику.
- В подсистеме eBPF в механизме BTF (BPF Type Format), предоставляющем информацию для проверки типов в псевдокоде BPF, реализована возможность добавления аннотаций к переменным, ссылающимся на области памяти в пространстве пользователя. Аннотации помогают системе верификации BPF-кода более качественно выявлять и проверять обращения к памяти.
- Преложен новый обработчик выделения памяти для хранения загруженных BPF-программ, который позволяет более эффективно использовать память в ситуациях загрузки большого числа BPF-программ.
- В системный вызов madvise(), предоставляющий средства для оптимизации управления памятью процесса, добавлен флаг MADV_DONTNEED_LOCKED, который дополняет уже имеющийся флаг MADV_DONTNEED, через который ядру можно заранее сообщить о готовящемся освобождении блока памяти, т.е. о том, что этот блок уже не нужен и может использоваться ядром. В отличие от MADV_DONTNEED использование флага MADV_DONTNEED_LOCKED допустимо для закреплённых в ОЗУ страниц памяти, которые при вызове madvise вытесняются без смены своего закреплённого статуса и в случае последующего обращения к блоку и генерации «page fault» возвращаются с сохранением привязки. Дополнительно добавлено изменение, позволяющее использовать флаг MADV_DONTNEED с большими страницами памяти в HugeTLB.
- Виртуализация и безопасность
- Для архитектуры x86 добавлена поддержка механизма защиты потока выполнения команд Intel IBT (Indirect Branch Tracking), мешающего применению техник построения эксплоитов с использованием приёмов возвратно-ориентированного программирования (ROP, Return-Oriented Programming), при которых эксплоит формируется в форме цепочки вызовов уже имеющихся в памяти кусков машинных инструкций, завершающихся инструкцией возврата управления (как правило, это окончания функций). Суть реализованного метода защиты в блокировании косвенных переходов в тело функции через добавление вначале функции специальной инструкции ENDBR и разрешение выполнения по косвенному переходу только в случае перехода на эту инструкцию (косвенный вызов через JMP и CALL должен всегда попадать на инструкцию ENDBR, которая размещена в самом начале функции).
- Включена более строгая проверка границ буферов в функциях memcpy(), memmove() и memset(), выполняемая на этапе компиляции при включении режима CONFIG_FORTIFY_SOURCE. Добавленное изменение сводится к проверке выхода за границы элементов структур, размер которых известен. Отмечается, что реализованная возможность позволила бы блокировать все связанные с memcpy() переполнения буфера в ядре, выявленные по меньшей мере за последние три года.
- Добавлена вторая часть кода обновлённой реализации генератора псевдослучайных чисел RDRAND, отвечающего за работу устройств /dev/random и /dev/urandom. Новая реализация примечательна
унификацией работы /dev/random и /dev/urandom, добавлением защиты от появления дубликатов в потоке случайных чисел при запуске виртуальных машин и переходом на использование хеш-функции BLAKE2s вместо SHA1 для операций смешивания энтропии. Изменение позволило повысить безопасность генератора псевдослучайных чисел, благодаря избавлению от проблемного алгоритма SHA1 и исключению перезаписи вектора инициализации RNG. Так как алгоритм BLAKE2s опережает SHA1 по производительности, то его применение также положительно отразилось на производительности. - Для архитектуры ARM64 добавлена поддержка нового алгоритма
аутентификации указателей — «QARMA3», который быстрее алгоритма QARMA при сохранении должного уровня защиты. Технология позволяет использовать специализированные инструкции ARM64 для проверки адресов возврата при помощи цифровых подписей, которые хранятся в неиспользуемых верхних битах самого указателя. - Для архитектуры ARM64 реализована поддержка сборки с включением в GCC 12 режима защиты от перезаписи адреса возврата из функции в случае переполнения буфера в стеке. Суть защиты в сохранении после передачи управления функции адреса возврата в отдельном «теневом» стеке и извлечении данного адреса перед выходом из функции.
- Добавлено новое хранилище ключей (keyring) — «machine», содержащее ключи владельца системы, поддерживаемые в shim-загрузчике. Указанные ключи могут использоваться для заверения цифровой подписью компонентов ядра, загружаемых на стадии после начальной загрузки (например, модулей ядра).
- Удалена поддержка асимметричных закрытых ключей для TPM, которые предложены в устаревшей версии TPM, имеют известные проблемы с безопасностью и не получили распространение на практике.
- Добавлена защита данных с типом size_t от целочисленных переполнений. В коде задействованы обработчики size_mul(), size_add() и size_sub(), позволяющие безопасно производить умножение, сложение и вычитание размеров с типом size_t.
- При сборке ядра включены флаги «-Warray-bounds» и «-Wzero-length-bounds», выводящие предупреждения при выходе индекса за границу массива и использовании массивов нулевой длины.
- В устройство virtio-crypto добавлена поддержка шифрования с использованием алгоритма RSA.
- Сетевая подсистема
- В реализации сетевых мостов добавлена поддержка режима привязки портов (locked mode), при котором пользователь может отправлять трафик через порт только с разрешённого MAC-адреса. Также добавлена возможность использования нескольких структур для оценки состояния протокола STP (Spanning Tree Protocol). Ранее для VLAN могла производиться только прямая привязка к STP (1:1), при которой каждый VLAN управлялся независимо. В новой версии добавлен параметр mst_enable, при включении которого состояние VLAN-ов контролируется модулем MST (Multiple Spanning Trees) и привязка VLAN-ов может соответствовать модели M:N.
- Продолжена работа по интеграции в сетевой стек средств для отслеживания причин отбрасывания пакетов (коды reason). Код причины передаётся во время освобождения памяти, связанной с пакетом, и позволяет учитывать такие ситуации, как отбрасывание пакета из-за ошибок заполнения полей в заголовке, выявление спуфинга фильтром rp_filter, неверная контрольная сумма, нехватка памяти, срабатывание правил IPSec XFRM, неверный номер последовательности TCP и т.п.
- Предоставлена возможность передачи сетевых пакетов из BPF-программ, запущенных из пространства пользователя в режиме BPF_PROG_RUN при котором BPF-программы выполняются в ядре, но возвращают результат в пространство пользователя. Пакеты передаются с использованием подсистемы XDP (eXpress Data Path). Поддерживается live-режим обработки пакетов, при котором XDP-обработчик может на лету перенаправлять сетевые пакеты в сетевой стек или на другие устройства. Также возможно создание программных генераторов внешнего трафика или подстановка сетевых кадров в сетевой стек.
- Для BPF-программ, прикрепляемых к сетевым cgroups, предложены вспомогательные функции для явного выставления значения, возвращаемого системными вызовами, что позволяет передать более полную информацию о причинах блокировки системного вызова.
- В подсистему XDP (eXpress Data Path) добавлена поддержка фрагментированных пакетов, размещаемых в нескольких буферах, что позволяет обрабатывать в XDP Jumbo-кадры и применять TSO/GRO (TCP Segmentation Offload/Generic Receive Offload) для XDP_REDIRECT.
- Значительно ускорен процесс удаления сетевых пространств имён, что было востребовано на некоторых крупных системах с большим объёмом трафика.
- Оборудование
- В драйвере amdgpu по умолчанию включена технология адаптивной синхронизации FreeSync, которая позволяет корректировать частоту обновления информации на экране, обеспечивая плавность и отсутствие разрывов изображения во время игр и просмотра видео. Объявлена стабильной поддержка GPU Aldebaran.
- В драйвере i915 добавлена поддержка чипов Intel Alderlake N и дискретных видеокарт Intel DG2-G12 (Arc Alchemist).
- В драйвере nouveau обеспечена поддержка более высоких битрейтов для интерфейсов DP/eDP и поддержка удлинителей кабеля lttprs (Link-Training Tunable PHY Repeaters).
- В подсистеме drm (Direct Rendering Manager) в драйверах armada, exynos, gma500, hyperv, imx, ingenic, mcde, mediatek, msm, omap, rcar-du, rockchip, sprd, sti, tegra, tilcdc, xen и vc4 добавлена поддержка параметра nomodeset, позволяющего отключить переключение видеорежимов на уровне ядра и использование средств для аппаратного ускорения отрисовки, оставив только функциональность, связанную с системным фреймбуфером.
- Добавлена поддержка ARM SoС Qualcomm Snapdragon 625/632 (используется в смартфонах LG Nexus 5X и Fairphone FP3), Samsung Exynos 850, Samsung Exynos 7885 (используется в Samsung Galaxy A8), Airoha (Mediatek/EcoNet) EN7523, Mediatek mt6582 (планшет Prestigio PMT5008 3G), Microchip Lan966, Renesas RZ/G2LC, RZ/V2L, Tesla FSD,
TI K3/AM62 и i.MXRTxxxx. - Добавлена поддержка ARM-устройств и плат Broadcom (Raspberry Pi Zero 2 W), Qualcomm (Google Herobrine R1 Chromebook, SHIFT6mq, Samsung Galaxy Book2), Rockchip (Pine64 PineNote, Bananapi-R2-Pro, STM32 Emtrion emSBS, Samsung Galaxy Tab S, Prestigio PMT5008 3G tablet), Allwinner (A20-Marsboard), Amlogic (Amediatek X96-AIR, CYX A95XF3-AIR, Haochuangy H96-Max, Amlogic AQ222 и OSMC Vero 4K+), Aspeed (Quanta S6Q, ASRock ROMED8HM3), Marvell MVEBU/Armada (Ctera C200 V1 и V2 NAS), Mstar (DongShanPiOne, Miyoo Mini), NXP i.MX (Protonic PRT8MM, emCON-MX8M Mini, Toradex Verdin, Gateworks GW7903).
- Добавлена поддержка звуковых систем и кодеков AMD PDM, Atmel PDMC, Awinic AW8738, i.MX TLV320AIC31xx, Intel CS35L41, ESSX8336, Mediatek
MT8181, nVidia Tegra234, Qualcomm SC7280,
Renesas RZ/V2L, Texas Instruments TAS585M. Добавлена начальная реализация звукового драйвера для DSP-чипа Intel AVS. Обновлена поддержка драйверов для Intel ADL и Tegra234, а также внесены изменения для улучшения поддержки звука на устройствах
Dell, HP, Lenovo, ASUS, Samsung и Clevo.
Одновременно латиноамериканский Фонд свободного ПО сформировал
вариант полностью свободного ядра 5.18 — Linux-libre 5.18-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске проведена чистка драйверов для панелей MIPI DBI, VPU Amphion, WiFi MediaTek MT7986 WMAC, Mediatek MT7921U (USB) и Realtek 8852a/8852c, звуковых чипов Intel AVS и Texas Instruments TAS5805M. Также проведена чистка DTS-файлов для разных SoC Qualcomm с процессорами на базе архитектуры AArch64. Обновлён код чистки блобов в драйверах и подсистемах AMD GPU, MediaTek MT7915, Silicon Labs WF200+ WiFi, Mellanox Spectru Ethernet, Realtek rtw8852c, Qualcomm Q6V5, Wolfson ADSP, MediaTek HCI UART.
Источник: http://www.opennet.ru/opennews/art.shtml?num=57235