След като разработката продължи два месеца, Линус Торвалдс представи версия на ядрото Linux 5.18. Сред най-забележителните промени са: извършена е значителна чистка на остарели функции, файловата система Reiserfs е обявена за остаряла, релацията на проследяване на потребителските процеси е реализирана, добавена е поддръжка за механизма за блокиране на експлоити Intel IBT, включен е режим за откриване на препълване на буфера при използване на функцията memcpy(), добавен е механизъм за проследяване на повиквания на функции fprobe, увеличена е производителността на планировчика на задачи за CPU AMD Zen, включен е драйвер за управление на функционалността на CPU Intel (SDS), интегрирани са част от пачовете за реструктуриране на заглавните файлове, одобрено е прилагането на стандарт C11.
В новую версию принято 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 инлайн криптиране, при което операциите по криптиране и декриптиране се извършват от контролера на носителя, а не от ядрото. При обикновеното криптиране от ядрото достъпът до криптирани файлове чрез 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 между NUMA узлите, което доведе до съществени подобрения в производителността при определени натоварвания.
- Разширени са средствата за проследяване на приложения в потребителското пространство. В новата версия на ядрото е добавена възможността за създаване на проследяващи събития от потребителски процеси и запис на данни в буфера за проследяване, които могат да бъдат прегледани чрез стандартни инструменти за проследяване на ядрото, като 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», содержащее ключи владельца системы (MOK, Machine Owner Keys), поддерживаемые в 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). Поддържа се режим на живо обработка на пакети, при който XDP-обработващият може на лето да пренасочва мрежови пакети в мрежовия стек или към други устройства. Също така е възможно създаване на софтуерни генератори на външен трафик или внедряване на мрежови кадри в мрежовия стек.
- За BPF-програми, прикрепяни към мрежови cgroups, предлагат се помощни функции за изрично задаване на стойността, връщана от системните повиквания, което позволява предаване на по-пълна информация за причините за блокиране на системното повикване.
- В подсистемата XDP (eXpress Data Path) е добавена поддръжка за фрагментирани пакети, разположени в няколко буфера, което позволява обработката на Jumbo-кадри в XDP и приложение на 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), 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.
Източник: opennet.ru
