Реліз ядра Linux 5.18

Після двох місяців розробки Лінус Торвальдс презентував реліз ядра Linux 5.18. Серед найбільш помітних змін: проведено велике чищення застарілої функціональності, оголошено застарілою ФС Reiserfs, реалізовано події трасування користувальницьких процесів, додано підтримку механізму блокування роботи експлоїтів Intel IBT, включено режим виявлення переповнення буферів при використанні функції memcpy(), додано механізм відстеження підвищено продуктивність планувальника завдань на CPU AMD Zen, до складу включено драйвер для управління функціональністю CPU Intel (SDS), інтегровано частину патчів для реструктуризації заголовних файлів, схвалено застосування стандарту C11.

У нову версію прийнято 16206 виправлень від 2127 розробників (у минулому випуску було 14203 виправлення від 1995 розробників), розмір патчу - 108 МБ (зміни торкнулися 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 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, але не набула поширення і зараз у побуті відсутні пристрої з підтримкою даного режиму і малоймовірно, що вони з'являться в майбутньому.
  • Пам'ять та системні сервіси
    • Почалася інтеграція набору патчів, що дозволяє значно скоротити час перескладання ядра рахунок реструктуризації ієрархії заголовних файлів і скорочення числа перехресних залежностей. До складу ядра 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, що за деяких видів навантаження призвело до суттєвого підвищення продуктивності.
    • Розширено засоби для трасування програм у просторі користувача. У новій версії ядра додана можливість створення процесами користувача подій трасування (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", що містить ключі власника системи (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) додано підтримку фрагментованих пакетів, що розміщуються в декількох буферах, що дозволяє обробляти в 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/EcoNet7523) 6582 5008G), Microchip Lan3, Renesas RZ/G966LC, RZ/V2L, Tesla FSD, TI K2/AM3 та 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 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, 8 Armada (Ctera C3 V200 та V1 NAS), Mstar (DongShanPiOne, Miyoo Mini), NXP i.MX (Protonic PRT2MM, emCON-MX8M Mini, Toradex Verdin, Gateworks GW8).
    • Додано підтримку звукових систем та кодеків AMD PDM, Atmel PDMC, Awinic AW8738, i.MX TLV320AIC31xx, Intel CS35L41, ESSX8336, Mediatek MT8181, nVidia Tegra234, Qualcomm SC7280AS, Renes Додано початкову реалізацію звукового драйвера для DSP-чіпа Intel AVS. Оновлено підтримку драйверів для Intel ADL і Tegra2, а також внесено зміни для покращення підтримки звуку на пристроях 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

Додати коментар або відгук