След две седмици разработка, Линус Торвалдс представи версия на ядрото Linux 5.18. Сред най-забележителните промени: извършена е голяма чистка на остаряла функционалност, обявена е за остаряла файловата система Reiserfs, реализирани са събития за трасировка на потребителски процеси, добавена е поддръжка на механизма за блокиране на експлойти Intel IBT, включен е режим за откриване на препълване на буфери при използване на функция memcpy(), добавен е механизъм за проследяване на извиквания на функции fprobe, повишена е производителността на планиращия процесор за AMD Zen, във версията е включен драйвер за управление на функционалността на процесорите Intel (SDS), интегрирана е част от пачовете за реструктуриране на заглавните файлове, одобрено е приложението на стандарта C11.
В новата версия са приети 16206 поправки от 2127 разработчици (в предишното издание имаше 14203 поправки от 1995 разработчици), размерът на пача е 108 MB (промените засягат 14235 файла, добавени са 1340982 реда код, изтрити са 593836 реда). Около 44% от всички промени в 5.18 са свързани с драйверите на устройства, около 16% от промените са относно актуализиране на код, специфичен за хардуерни архитектури, 11% са свързани с мрежовия стек, 3% — с файловите системи и 3% с вътрешните подсистеми на ядрото.
Основните нововъведения в ядрото 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 (C89), формулирана през 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 възлите, което при определени натоварвания доведе до значително повишаване на производителността.
- Разширени са средствата за трасировка на приложения в пространството на потребителя. В новата версия на ядрото е добавена възможността потребителските процеси да създават събития за трасировка (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 (виртуални динамични споделени обекти), предоставящ ограничен набор от системни извиквания, достъпни в пространството на потребителя без превключване на контекст. Поддръжката на 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 е допустимо за закрепени в RAM страници памет, които при извикване на 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). Поддържа се live-режим на обработка на пакети, при който 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 SoC 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 Spectrum Ethernet, Realtek rtw8852c, Qualcomm Q6V5, Wolfson ADSP, MediaTek HCI UART.
Източник: opennet.ru
