Реліз ядра Linux 6.1

Після двох місяців розробки Лінус Торвальдс подав реліз ядра Linux 6.1. Серед найбільш помітних змін: підтримка розробки драйверів і модулів на мові Rust, модернізація механізму визначення сторінок пам'яті, спеціальний менеджер пам'яті для BPF-програм, система діагностики проблем з пам'яттю KMSAN, механізм захисту KCFI (Kernelk Control-Flow Integrity), впровадження структури Maple tree.

У нову версію прийнято 15115 виправлень від 2139 розробників, розмір патчу - 51 МБ, що приблизно в 2 рази менше розміру патчів від ядер 6.0 та 5.19. Зміни торкнулися 13165 файлів, додано 716247 рядків коду, видалено 304560 рядків. Близько 45% всіх представлених у 6.1 змін пов'язані з драйверами пристроїв, приблизно 14% змін стосуються оновлення коду, специфічного для апаратних архітектур, 14% пов'язано з мережевим стеком, 3% — з файловими системами і 3% з внутрішніми підсистемами ядра.

Основні нововведення в ядрі 6.1:

  • Пам'ять та системні сервіси
    • Додана можливість використання мови Rust як другої мови для розробки драйверів та модулів ядра. Основним мотивом підтримки Rust є спрощення написання безпечних та якісних драйверів пристроїв за рахунок зниження ймовірності помилок при роботі з пам'яттю. Підтримка Rust неактивна за замовчуванням і не призводить до включення Rust до обов'язкових складальних залежностей до ядра. У ядро ​​поки що прийнято мінімальний урізаний варіант патчів, який скорочений з 40 до 13 тисяч рядків коду і забезпечує лише необхідний мінімум, достатній для складання простого модуля ядра, написаного мовою Rust. Надалі планується поступово нарощувати наявну функціональність, переносячи інші зміни з гілки Rust-for-Linux. Паралельно розвиваються проекти щодо використання запропонованої інфраструктури для розробки мовою Rust драйверів накопичувачів NVMe, мережевого протоколу 9p та GPU Apple M1.
    • Для систем на базі архітектур AArch64, RISC-V та LoongArch з EFI реалізована можливість прямого завантаження стислих образів ядра. Додані обробники для завантаження, запуску та вивантаження образів ядра, що викликаються безпосередньо з EFI zboot. Також додані обробники установки та видалення протоколів із БД протоколів EFI. Раніше розпакування здійснювалося окремим завантажувачем, а тепер це може робити обробник у самому ядрі - образ ядра формується у вигляді програми EFI.
    • До складу прийнято частину патчів з реалізацією багаторівневої моделі управління пам'яттю, що дозволяє розділяти банки пам'яті з різними характеристиками продуктивності. Наприклад, сторінки, що найбільш інтенсивно використовуються, можуть розміщуватися в найбільш швидкій пам'яті, а сторінки, що рідко використовуються, можуть зберігатися в відносно повільній пам'яті. У ядро ​​6.1 прийнято механізм визначення знаходження інтенсивно використовуваних сторінок в повільної пам'яті їхнього просування у швидку пам'ять, і навіть реалізована загальна концепція рівнів пам'яті та його відносної продуктивності.
    • До складу включений механізм MGLRU (Multi-Generational LRU), який замінив собою стару реалізацію LRU (Least Recently Used) на основі двох черг на багатоступінчасту структуру, що краще визначає які сторінки пам'яті по-справжньому використовуються, а які можна витіснити в розділ підкачування.
    • Додано підтримку запропонованої інженерами Oracle структури даних «maple tree», яка позиціонується як ефективніша заміна структурі «red-black tree». Maple tree є варіантом B-tree, що підтримує індексацію по діапазонах значень і спроектований для ефективного використання кешу сучасних процесорів. На maple tree вже переведені деякі підсистеми управління пам'яттю, що позитивно вплинуло на їх продуктивність. У майбутньому maple tree може використовуватися для реалізації блокувань діапазонів (range locking).
    • До підсистеми BPF додано можливість створення «деструктивних» BPF-програм, спеціально розрахованих на ініціювання аварійного завершення роботи через виклик crash_kexec(). Подібні BPF-програми можуть знадобитися з метою налагодження для ініціювання створення crash-дампа в певний момент часу. Для доступу до деструктивних операцій при завантаженні програми BPF потрібно вказати прапор BPF_F_DESTRUCTIVE, активацію sysctl kernel.destructive_bpf_enabled і наявність прав CAP_SYS_BOOT.
    • Для BPF-програм надано можливість перебору елементів cgroup, а також перебору ресурсів (файли, vma, процеси тощо) певного потоку чи завдання. Реалізовано новий map-тип для створення кільцевих буферів (user ring buffer).
    • Додано спеціальний виклик для виділення пам'яті в BPF-програмах (memory allocator), який забезпечує безпечніший розподіл пам'яті в контексті BPF, ніж штатний kmalloc().
    • Інтегровано першу частину змін, що забезпечують можливість створення драйверів для пристроїв введення з інтерфейсом HID (Human Interface Device), що реалізуються у формі BPF-програм.
    • З ядра повністю видалено код для підтримки формату виконуваних файлів a.out, який був переведений у розряд застарілих у випуску 5.1, а починаючи з версій 5.18 і 5.19 був відключений для основних архітектур. Формат a.out давно не застосовується на системах з Linux, а генерація файлів a.out не підтримується сучасними інструментальними засобами конфігурацій для Linux за замовчуванням. Завантажувач для файлів a.out може бути реалізований повністю в просторі користувача.
    • Для систем на базі архітектури набору команд LoongArch, що застосовується в процесорах Loongson 3 5000 та реалізує новий RISC ISA, схожий на MIPS та RISC-V, реалізована підтримка подій вимірювання продуктивності (perf event), kexec, kdump та JIT-компіляції BPF.
    • В інтерфейсі асинхронного вводу/виводу io_uring запропонований новий режим IORING_SETUP_DEFER_TASKRUN, що дозволяє тимчасово відкласти виконання пов'язаних з кільцевим буфером робіт до моменту, поки не надійде запит від програми, що може використовуватися для організації виконання робіт у пакетному режимі та запобігання проблемам із затримками програми у невідповідний момент.
    • Процесам у просторі користувача надано можливість ініціювання перетворення діапазону звичайних сторінок пам'яті на набір великих сторінок пам'яті (Transparent Huge-Pages).
    • Додано реалізацію пристрою /dev/userfaultfd, що дозволяє організувати доступ до функціональності системного виклику userfaultfd() з використанням прав доступу до ФС. Функціональність userfaultfd дозволяє створювати обробники звернень до невиділених сторінок пам'яті (page faults) у просторі користувача.
    • Підвищено вимоги до версії утиліти GNU Make – для складання ядра тепер потрібна як мінімум версія 3.82.
  • Дискова підсистема, введення/виведення та файлові системи
    • У файлову систему Btrfs внесено суттєві оптимізації продуктивності, серед іншого на порядки збільшено продуктивність ioctl-виклику FIEMAP. Додано підтримку асинхронного буферизованого запису для додатків, що використовують io_uring. До операції «send» додано підтримку файлів, захищених за допомогою fs-verity.
    • У ФС ext4 додані оптимізації продуктивності, пов'язані з підтримкою журналу та роботою в режимі лише для читання.
    • У файловій системі EROFS (Enhanced Read-Only File System), призначеної для використання на розділах, доступних у режимі лише для читання, реалізована можливість спільного зберігання даних, що дублюються у різних ФС.
    • У системний виклик statx() додано можливість виведення відомостей про можливість застосування файлу прямого введення/виводу.
    • У підсистему FUSE (Filesystems in User Space) додано підтримку створення тимчасових файлів з прапором O_TMPFILE.
  • Віртуалізація та безпека
    • Замінено реалізацію механізму захисту CFI (Control Flow Integrity), що додає перед кожним непрямим викликом функції перевірки для виявлення деяких форм невизначеної поведінки, які потенційно можуть призвести до порушення нормального порядку виконання (control flow) внаслідок застосування експлоїтів, що змінюють покажчики на функції, що зберігаються в пам'яті. . Штатна реалізація CFI від проекту LLVM замінена на варіант також заснований на використанні Clang, але спеціально адаптований для захисту низькорівневих підсистем і ядер операційних систем. У LLVM нова реалізація буде запропонована у випуску Clang 16 і включатиметься опцією "-fsanitize=kcfi". Ключовою відмінністю нової реалізації є те, що вона не прив'язана до оптимізацій на етапі зв'язування (LTO) і не призводить до заміни покажчиків функцій посилання у таблиці переходів.
    • Для LSM-модулів (Linux Security Module) надано можливість створення обробників, що перехоплюють операції зі створення просторів імен.
    • Надано засоби для верифікації цифрових підписів PKCS#7 у BPF-програмах.
    • В /dev/random повернуто можливість відкриття в неблокуючому режимі (O_NONBLOCK), яка була недодана видалена в ядрі 5.6.
    • На системах з архітектурою x86 додано висновок попередження у разі мапінгу підсистемами ядра сторінок пам'яті, що одночасно допускають виконання та запис. Надалі розглядається можливість повністю заборонити подібний мапінг пам'яті.
    • Доданий механізм налагодження KMSAN (Kernel Memory Sanitizer) для виявлення використання неініціалізованої пам'яті в ядрі, а також витоків неініціалізованої пам'яті між простором користувача та пристроями.
    • Внесено поліпшення в криптонадійний генератор псевдовипадкових чисел CRNG, що використовується у виклику getrandom. Зміни підготовлені Джейсоном Доненфілдом (Jason A. Donenfeld), автором VPN WireGuard і націлені на підвищення безпеки вилучення псевдовипадкових цілих чисел.
  • Мережева підсистема
    • У TCP-стеку реалізовано можливість (відключено за замовчуванням) роздільного використання хеш-таблиць сокетів для кожного простору імен, що дозволяє підвищити продуктивність систем з великою кількістю просторів імен.
    • Видалено код для підтримки застарілого протоколу DECnet. Для простору користувача залишені заглушки API, що дозволяють компілювати програми, що використовують DECnet, але ці програми не зможуть підключитися до мережі.
    • Документовано протокол netlink.
  • Обладнання
    • У драйвері amdgpu додано підтримку прокидання DSC (Display Stream Compression) для стиснення даних без втрат під час обміну інформацією з екранами, що підтримують дуже велику роздільну здатність. Продовжено роботу щодо забезпечення підтримки платформ AMD RDNA3 (RX 7000) та CDNA (Instinct). Додано підтримку IP-компонентів DCN 3.2, SMU 13.x, NBIO 7.7, GC 11.x, PSP 13.x, SDMA 6.x та GMC 11.x. У драйвері amdkfd (для дискретних GPU AMD, таких як Polaris) реалізовано підтримку GFX 11.0.3.
    • У драйвері i915 (Intel) включено підтримку GPU Meteor Lake. Для Meteor Lake та нових GPU забезпечена підтримка інтерфейсу DP 2.0 (DisplayPort). Додано ідентифікатори для відеокарт на базі мікроархітектури Alder Lake S.
    • Додано підтримку звукових підсистем, реалізованих у процесорах Apple Silicon, Intel SkyLake та Intel KabyLake. У звуковому драйвері CS35L41 HDA забезпечено підтримку переходу в сплячий режим. Додано підтримку ASoC (ALSA System on Chip) для вбудованих звукових чіпів Apple Silicon, AMD Rembrant DSPs, AMD Pink Sardine ACP 6.2, Everest ES8326, Intel Sky Lake та Kaby Lake, Mediatek MT8186, NXP i.MX8ULP DSPs, Qual SM8280 та Texas Instruments SRC8250
    • Додано підтримку LCD-панелей Samsung LTL101AL01, B120XAN01.0, R140NWF5 RH, Densitron DMT028VGHMCMI-1A TFT, AUO B133UAN02.1, IVO M133NW4J-R3, Innolux N120. 1WHM-N116, INX N01.6BCA-EA116 , INX N21BCN-EA116, Multi-Inno Technology MI2FT-116.
    • Додано підтримку AHCI SATA-контролерів, що використовуються в SoC Baikal-T1.
    • Додано підтримку Bluetooth-чіпів MediaTek MT7921, Intel Magnetor (CNVi, Integrated Connectivity), Realtek RTL8852C, RTW8852AE та RTL8761BUV (Edimax BT-8500).
    • У драйвер ath11k для бездротових модулів Qualcomm додано підтримку спектрального сканування в діапазоні 160 MHz, реалізовано багатопотоковий NAPI, покращено підтримку Wi-Fi чіпів Qualcomm WCN6750.
    • Додані драйвери для клавіатури до PinePhone, тачпадів InterTouch (ThinkPad P1 G3), X-Box Adaptive Controller, PhoenixRC Flight Controller, VRC-2 Car Controller, DualSense Edge Controller, керуючих панелей IBM (IBM Operation Panel), пультів XBOX One Elite, XP-PEN Deco Pro S та Intuos Pro Small (PTH-460).
    • Додано драйвер для криптографічних прискорювачів Aspeed HACE (Hash and Crypto Engine).
    • Додано підтримку інтегрованих Thunderbolt/USB4 контролерів Intel Meteor Lake.
    • Додано підтримку смартфонів Sony Xperia 1 IV, Samsung Galaxy E5, E7 та Grand Max, Pine64 Pinephone Pro.
    • Додана підтримка ARM SoC та плат: AMD DaytonaX, Mediatek MT8186, Rockchips RK3399 та RK3566, TI AM62A, NXP i.MX8DXL, Renesas R-Car H3Ne-1.7G, Qualcomm IPQ8064-v2.0, i.MX8062MM OSM-S, MT8065 (Acer Tomato), Radxa Rock 8C+, NanoPi R8195S Enterprise Edition, JetHome JetHub D4p. Оновлено драйвери для SoC Samsung, Mediatek, Renesas, Tegra, Qualcomm, Broadcom та NXP.

Одночасно латиноамериканський Фонд вільного програмного забезпечення сформував варіант повністю вільного ядра 6.1 — Linux-libre 6.1-gnu, очищеного від елементів прошивок та драйверів, що містять невільні компоненти або ділянки коду, сфера застосування яких обмежена виробником. У новому випуску проведено чищення нового драйвера rtw8852b та DTS-файлів для різних SoC Qualcomm та MediaTek з процесорами на базі архітектури AArch64. Оновлено код чищення блобів у драйверах та підсистемах amdgpu, i915, brcmfmac, r8188eu, rtw8852c, Intel ACPI. Відкориговано чищення застарілих драйверів tm6000 TV cards, cpia2 v4l, sp8870, av7110.

Джерело: opennet.ru

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