Реліз ядра Linux 5.8

Після двох місяців розробки Лінус Торвальдс представив реліз ядра Linux 5.8. Серед найбільш помітних змін: детектор станів гонки KCSAN, універсальний механізм доставки повідомлень у простір користувача, підтримка обладнання для inline-шифрування, розширені механізми захисту для ARM64, підтримка російського процесора Baikal-T1, можливість роздільного монтування екземплярів procfs, реалізація для ARM64 механізмів захисту Call Stack та BTI.

Ядро 5.8 стало найбільшим за кількістю змін із усіх ядер за весь час існування проекту. При цьому зміни не пов'язані з якоюсь однією підсистемою, а охоплюють різні частини ядра і в основному пов'язані з внутрішніми переробками та чищенням. Найбільше змін спостерігається у драйверах. У нову версію прийнято 17606 виправлень від 2081 розробників, які торкнулися приблизно 20% всіх файлів у репозиторії з кодом ядра. Розмір патча - 65 МБ (зміни торкнулися 16180 файлів, додано 1043240 рядків коду, видалено 489854 рядків). Для порівняння у гілці 5.7 було внесено 15033 39 виправлень, а розмір патча становив 37 МБ. Близько 5.8% усіх представлених у 16 змін пов'язані з драйверами пристроїв, приблизно 11% змін стосуються оновлення коду, специфічного для апаратних архітектур, 3% пов'язано з мережевим стеком, 4% — з файловими системами і XNUMX% з внутрішніми підсистемами ядра.

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

  • Віртуалізація та безпека
    • Забезпечено блокування завантаження модулів ядра, що мають секції з кодом, в яких одночасно виставлені біти, що дозволяють виконання та запис. Зміна реалізована в рамках більшого проекту з позбавлення ядра від застосування сторінок пам'яті, що допускають одночасно виконання та запис.
    • З'явилася можливість створення окремих екземплярів procfs, що дозволяють використовувати кілька точок монтування procfs, змонтованих з різними опціями, але відбивають один простір імен ідентифікаторів процесів (pid namespace). Раніше всі точки монтування procfs лише віддзеркалювали одне внутрішнє уявлення і будь-яка зміна параметрів монтування позначалося на решті точках монтування, пов'язаних з тим же простором імен ідентифікаторів процесів. З областей, в яких може бути затребуване монтування з різними опціями, відзначається реалізація легковагової ізоляції для систем, що вбудовуються, з можливістю приховування в procfs певних типів процесів та інформаційних вузлів.
    • Для платформи ARM64 реалізовано підтримку механізму
      Shadow-Call Stack, що надається компілятором Clang для захисту від перезапису адреси повернення з функції у разі переповнення буфера в стеку. Суть захисту у збереженні після передачі керування функцією адреси повернення в окремому «тіньовому» стеку та вийманні цієї адреси перед виходом з функції.

    • Для платформи ARM64 додано підтримку інструкцій ARMv8.5-BTI (Branch Target Indicator) для захисту виконання наборів інструкцій, на які не повинні виконуватися переходи під час розгалуження. Блокування переходів на довільні ділянки коду реалізовано для протидії створенню гаджетів в експлоїтах, що використовують прийоми зворотно-орієнтованого програмування (ROP — Return-Oriented Programming, атакуючий не намагається розмістити свій код у пам'яті, а оперує вже наявними шматками машинних інструкцій, що завершуються з яких вишиковуються ланцюжок викликів для отримання потрібної функціональності).
    • Додано підтримку обладнання для inline-шифрування блокових пристроїв (Inline Encryption). Пристрої inlinep-шифрування зазвичай вбудовані в накопичувач, але логічно розміщується між системною пам'яттю та диском, здійснюючи прозоре шифрування та розшифрування вводу/виводу на основі заданих ядром ключів та алгоритму шифрування.
    • Доданий параметр командного рядка ядра initrdmem, що дозволяє вказати фізичну адресу розміщення initrd у пам'яті при розміщенні початкового завантажувального образу в ОЗУ.
    • Додано нові можливості: CAP_PERFMON для доступу до підсистеми perf та виконання моніторингу продуктивності. CAP_BPF, що дозволяє виконання деяких операцій з BPF (наприклад, завантаження BPF-програм), які раніше вимагали прав CAP_SYS_ADMIN (тепер повноваження CAP_SYS_ADMIN поділені на комбінацію CAP_BPF, CAP_PERFMON та CAP_NET_ADMIN).
    • Додано новий пристрій virtio-mem, що дозволяє реалізувати гаряче підключення та відключення пам'яті до гостьових систем.
    • Реалізовано відкликання операцій мапінгу в /dev/mem, якщо драйвер пристрою використовує області пам'яті, що перекриваються.
    • Доданий захист від уразливості CROSSTalk/SRBDS, що дозволяє відновити результати виконання деяких інструкцій, які виконуються на іншому ядрі CPU.
  • Пам'ять та системні сервіси
    • У документ, що визначає правила оформлення коду, прийняті рекомендації щодо застосування інклюзивної термінології Розробникам не рекомендується використовувати зв'язки 'master/slave' та 'blacklist/whitelist', а також окремо слово 'slave'. Рекомендації стосуються лише нового використання цих термінів. Згадки зазначених слів, що вже є в ядрі, залишаться недоторканими. У новому коді використання зазначених термінів дозволено, якщо цього вимагає підтримка API та ABI, що видається в простір, а також при оновленні коду для підтримки існуючого обладнання або протоколів, специфікації на які наказують використання певних термінів.
    • До складу включено налагоджувальний інструмент KCSAN (Kernel Concurrency Sanitizer), призначений для динамічного виявлення станів гонки всередині ядра. Використання KCSAN підтримується при збиранні GCC і Clang, і вимагає додавання спеціальних модифікацій на етапі компіляції для відстеження доступу до пам'яті (застосовуються точки зупинки, що спрацьовують при читанні або зміні пам'яті). Основна увага при розробці KCSAN приділена запобіганню помилкових спрацьовувань, масштабованості та простоті використання.
    • доданий універсальний механізм доставки повідомлень з ядра в простір користувача. Механізм заснований на штатному драйвері pipe і дозволяє ефективно розподіляти повідомлення від ядра каналами, відкритими в просторі користувача. Точки прийому повідомлень являють собою pipe-и, відкриті в спеціальному режимі і дозволяють накопичувати в кільцевому буфері повідомлення, що надходять від ядра. Читання здійснюється звичайною функцією read(). Власник каналу визначає, які джерела в ядрі необхідно відстежувати і може визначити фільтр для ігнорування повідомлень і подій певного типу. З подій поки підтримуються лише операції з ключами, такі як додавання/видалення ключів та зміна їх атрибутів. Зазначені події планують використовувати у GNOME.
    • Продовжено розвиток функціональності pidfd, що допомагає обробляти ситуації з повторним використанням PID (pidfd зв'язується з конкретним процесом і не змінюється, в той час як PID може бути прив'язаний до іншого процесу після завершення поточного процесу, асоційованого з цим PID). У новій версії додано підтримку використання pidfd для прикріплення процесу до просторів імен (дозволено вказівку pidfd при виконанні системного виклику setns). Застосування pidfd дозволяє одним викликом управляти прикріпленням процесу до кількох типів просторів імен, істотно скорочуючи кількість необхідних системних викликів та реалізуючи прикріплення в атомарному режимі (якщо при прикріпленні до одного з просторів імен виникне збій, то не підключатимуться та інші).
    • Додано новий системний виклик faccessat2(), який відрізняється від
      faccessat() додатковим аргументом з прапорами, що відповідають рекомендаціям POSIX (раніше дані прапори емулювалися в Сі-бібліотеці, а новий faccessat2 дозволяє реалізувати їх у ядрі).

    • У Cgroup додано налаштування memory.swap.high, яке можна використовувати для уповільнення завдань, що займають занадто багато місця в розділі підкачки.
    • В інтерфейс асинхронного введення/виводу io_uring додано підтримку системного виклику tee().
    • Доданий механізм «BPF iteratorпризначений для виведення в простір користувача вмісту структур ядра.
    • Надано можливість використання кільцевого буфера обмінюватись даними між BPF-программами.
    • У механізм padata, призначений для організації паралельного виконання завдань у ядрі, додано підтримку багатопотокових завдань з балансуванням навантаження.
    • У механізм pstore, що дозволяє зберегти налагоджувальну інформацію про причину краху в області пам'яті, що не втрачаються між перезавантаженнями, доданий бекенд для збереження інформації на блокові пристрої.
    • З гілки ядра PREEMPT_RT перенесено реалізація локальних блокувань.
    • доданий новий API виділення буферів (AF_XDP), націлений на спрощення написання мережевих драйверів із підтримкою XDP (eXpress Data Path).
    • Для архітектури RISC-V реалізовано підтримку налагодження компонентів ядра за допомогою KGDB.
    • До випуску 4.8 підвищені вимоги до версії GCC, яка може бути використана для складання ядра. В одному з наступних випусків планується підняти планку до GCC 4.9.
  • Дискова підсистема, введення/виведення та файлові системи
    • У Device Mapper доданий новий обробник dm-ebs (emulate block size), який може застосовуватися для емуляції меншого розміру логічного блоку (наприклад, емуляції 512-байтних секторів на дисках з розміром сектора 4K).
    • У файловій системі F2FS з'явилася підтримка стиснення з допомогою алгоритму LZO-RLE.
    • У dm-crypt додано підтримка зашифрованих ключів.
    • У Btrfs покращено обробку операцій читання в режимі прямого введення/виводу. При монтуванні прискорено перевірка віддалених підрозділів та каталогів, що залишилися без батька.
    • У CIFS доданий параметр "nodelete", що допускає штатні перевірки прав на сервері, але забороняє клієнту видаляти файли чи каталоги.
    • У Ext4 покращено обробку помилки ENOSPC під час використання багатопоточності. У xattr додано підтримку простору імен gnu.*, що використовується в GNU Hurd.
    • Для Ext4 і XFS включена підтримка операцій DAX (прямий доступ до ФС в обхід сторінкового кешу без застосування рівня блокових пристроїв) у прив'язці до окремих файлів та каталогів.
    • У системний виклик statx() додано прапор STATX_ATTR_DAX, при вказівці якого інформація вилучається за допомогою механізму DAX.
    • У EXFAT додано підтримка верифікації завантажувальної області.
    • У FAT покращено попереджувальне завантаження елементів ФС. Тестування повільного 2ТБ USB-накопичувача показало скорочення часу проходження тесту з 383 до 51 сек.
  • Мережева підсистема
    • У код керування роботою мережевих мостів додано підтримка протоколу MRP (Media Redundancy Protocol), що дозволяє забезпечити відмовостійкість, закільцевавши кілька Ethernet-комутаторів.
    • У систему керування трафіком (Tc) додано нова дія «gate», що дає змогу визначити часові інтервали для обробки та відкидання певних пакетів.
    • У ядро ​​та утиліту ethtool додано підтримку функцій тестування приєднаного мережного кабелю та самодіагностики мережевих пристроїв.
    • У IPv6-стік додано підтримку алгоритму MPLS (Multiprotocol Label Switching) для маршрутизації пакетів з використанням багатопротокольної комутації за мітками (для IPv4 MPLS підтримувався і раніше).
    • Додано підтримку передачі пакетів IKE (Internet Key Exchange) та IPSec поверх TCP (RFC 8229) для обходу можливих блокувань UDP.
    • Додано мережевий блоковий пристрій rnbd, що дозволяє організувати віддалений доступ до блокового пристрою за допомогою транспорту RDMA (InfiniBand, RoCE, iWARP) та протоколу RTRS.
    • У TCP-стеку додано підтримка стиснення діапазонів у відповідях вибіркового підтвердження (selective acknowledgment, SACK).
    • Для IPv6 реалізована підтримка TCP-LD (RFC 6069, Long Connectivity Disruptions).
  • Обладнання
    • У DRM-драйвері i915 для відеокарт Intel включена за замовчуванням підтримка чіпів Intel Tiger Lake (GEN12), для яких також реалізована можливість використання системи SAGV (System Agent Geyserville) для динамічного підстроювання частоти та напруги в залежності від вимог до енергоспоживання або продуктивності.
    • У драйвер amdgpu додано підтримку піксельного формату FP16 та реалізовано можливість роботи з шифрованими буферами у відеопам'яті (TMZ, Trusted Memory Zone).
    • Додано підтримку датчиків енергоспоживання процесорів AMD Zen і Zen2, а також датчиків температури AMD Ryzen 4000 Renoir. Для AMD Zen та Zen2 забезпечена підтримка вилучення інформації про енергоспоживання через інтерфейс RAPL (Running Average Power Limit).
    • У драйвер Nouveau додано підтримку формату модифікаторів NVIDIA. Для gv100 реалізовано можливість використання черезрядкових режимів розгортки. Додано визначення vGPU.
    • До драйвера MSM (Qualcomm) додано підтримку GPU Adreno A405, A640 і A650.
    • доданий внутрішній фреймворк для керування ресурсами DRM (Direct Rendering Manager).
    • Додано підтримку смартфонів Xiaomi Redmi Note 7 та Samsung Galaxy S2, а також ноутбуків Elm/Hana Chromebook.
    • Додано драйвери для LCD-панелей: ASUS TM5P5 NT35596, Starry KR070PE2T, Leadtek LTK050H3146W, Visionox rm69299, Boe tv105wum-nw0.
    • Додана підтримка ARM-плат і платформ Renesas RZ/G1H, Realtek RTD1195, Realtek RTD1395/RTD1619, Rockchips RK3326, AMLogic S905D, S905X3, S922XH, Olimex A20-OLinuXino-LIME
      , Beacon i.MX8m-Mini, Qualcomm SDM660/SDM630, Xnano X5 TV Box, Stinger96, Beaglebone-AI.

    • Додана підтримка MIPS-процесора Loongson-2K (скорочений Loongson64). Для CPU Loongson 3 додано підтримку віртуалізації з використанням гіпервізора KVM.
    • Додана
      підтримка російського процесора Baikal-T1 та заснованої на ньому системи на кристалі BE-T1000. Процесор Baikal-Т1 містить два суперскалярні ядра P5600 MIPS 32 r5, що працюють на частоті 1.2 ГГц. Чіп містить кеш L2 (1 Мб), контролер пам'яті DDR3-1600 ECC, 1 порт 10Gb Ethernet, 2 порти 1Gb Ethernet, контролер PCIe Gen.3 х4, 2 порти SATA 3.0, USB 2.0, GPIO, UART, SPI, I2C. Процесор надає апаратну підтримку віртуалізації, інструкції SIMD та інтегрований апаратний прискорювач криптографічних операцій, що підтримує ГОСТ 28147-89. Чіп розроблений з використанням ліцензованого у компанії Imagination Technologies блоку процесорного ядра MIPS32 P5600 Warrior.

Одночасно латиноамериканський Фонд вільного ПЗ сформував
варіант повністю вільного ядра 5.8 - Linux-libre 5.8-gnu, очищеного від елементів прошивок та драйверів, що містять невільні компоненти або ділянки коду, сфера застосування яких обмежена виробником. У новому випуску відключено завантаження блобів у драйверах для Atom ISP Video, MediaTek 7663 USB/7915 PCIe, Realtek 8723DE WiFi, Renesas PCI xHCI, HabanaLabs Gaudi, Enhanced Asynchronous Sample Rate Converter, Maxim Integrated MAX98390 Home Audio Processor, та I38060C EEPROM Slave. Оновлено код чищення блобів у драйверах та підсистемах Adreno GPU, HabanaLabs Goya, x2 touchscreen, vt86 та btbcm.

Джерело: opennet.ru

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