Po dwóch miesiącach prac Linus Torvalds zaprezentował wydanie jądra Linux 6.2. Wśród najbardziej zauważalnych zmian: zezwolono na przyjmowanie kodu na licencji Copyleft-Next, usprawniono implementację RAID5/6 w Btrfs, kontynuowano integrowanie wsparcia dla języka Rust, zmniejszono narzuty podczas ochrony przed atakami Retbleed, dodano możliwość regulacji zużycia pamięci przy zapisie zwrotnym, dla TCP dodano mechanizm równoważenia PLB (Protective Load Balancing), wprowadzono hybrydowy mechanizm ochrony strumienia wykonywania poleceń (FineIBT), w BPF pojawiła się możliwość definiowania własnych obiektów i struktur danych, a w skład wchodzą również narzędzia rv (Runtime Verification), zmniejszono zużycie energii w implementacji blokad RCU.
W nowej wersji przyjęto 16843 poprawki od 2178 deweloperów, rozmiar łatki wynosi 62 MB (zmiany objęły 14108 plików, dodano 730195 linii kodu, usunięto 409485 linii). Około 42% wszystkich zmian w 6.2 dotyczy sterowników urządzeń, około 16% zmian ma związek z aktualizacją kodu specyficznego dla architektur sprzętowych, 12% związane jest ze stakem sieciowym, 4% – z systemami plików i 3% z wewnętrznymi subsystemami jądra.
Główne innowacje w jądrze 6.2:
- Pamięć i usługi systemowe
- Zezwalano na dołączenie do jądra kodu i zmian dostarczanych na licencji Copyleft-Next 0.3.1. Licencja Copyleft-Next została stworzona przez jednego z autorów GPLv3 i jest całkowicie zgodna z licencją GPLv2, co potwierdzili prawnicy firm SUSE i Red Hat. W porównaniu z GPLv2, licencja Copyleft-Next jest znacznie bardziej kompaktowa i łatwiejsza do zrozumienia (usunięto wstęp oraz odniesienia do przestarzałych kompromisów), określa terminy i procedury usuwania naruszeń, automatycznie znosi wymagania copyleft dla przestarzałych dzieł, które mają ponad 15 lat.
Copyleft-Next zawiera również punkt o przyznawaniu praw do opatentowanych technologii, co w przeciwieństwie do GPLv2 czyni tę licencję zgodną z licencją Apache 2.0. Aby zapewnić pełną zgodność z GPLv2, w tekście Copyleft-Next wyraźnie zaznaczone jest, że prace pochodne mogą być wydawane nie tylko na podstawie pierwotnej licencji Copyleft-Next, ale także na podstawie licencji GPL.
- Zestaw zawiera narzędzie „rv”, które zapewnia interfejs do interakcji z handlerami subsystemu RV (Runtime Verification) zaprojektowanego do weryfikacji poprawności działania w wysokowydajnych systemach, gwarantujących brak awarii. Weryfikacja jest przeprowadzana w czasie rzeczywistym przez dołączanie handlerów do punktów śledzenia, które porównują rzeczywisty przebieg wykonania z wcześniej określonym wzorcowym, deterministycznym modelem automatu, definiującym oczekiwane zachowanie systemu.
- W urządzeniu zRAM, które pozwala na przechowywanie partycji wymiany w pamięci w skompresowanej formie (tworzone jest urządzenie blokowe, na które następuje wymiana z kompresją), zaimplementowano możliwość ponownego pakowania stron z wykorzystaniem alternatywnego algorytmu w celu osiągnięcia wyższego poziomu kompresji. Główna idea polega na zapewnieniu wyboru między kilkoma algorytmami (lzo, lzo-rle, lz4, lz4hc, zstd), które oferują różne kompromisy między szybkością kompresji/rozpakowywania a poziomem kompresji lub są optymalne w szczególnych sytuacjach (np. do kompresji dużych stron pamięci).
- Dodano API „iommufd” do zarządzania z przestrzeni użytkownika systemem zarządzania pamięcią wejścia-wyjścia — IOMMU (I/O Memory-Management Unit). Nowe API umożliwia zarządzanie tabelami stron pamięci wejścia/wyjścia, wykorzystując deskryptory plików.
- W BPF wprowadzono możliwość tworzenia typów, definiowania własnych obiektów, budowania swojej hierarchii obiektów oraz elastycznego formowania własnych struktur danych, takich jak listy powiązane. Dla programów BPF przechodzących w tryb uśpienia (BPF_F_SLEEPABLE) dodano wsparcie dla blokad bpf_rcu_read_{,un}lock(). Wprowadzono wsparcie dla przechowywania obiektów task_struct. Dodano typ mapy BPF_MAP_TYPE_CGRP_STORAGE, który zapewnia lokalne przechowywanie dla cgroups.
- Dla mechanizmu blokad RCU (Read-copy-update) zaimplementowano opcjonalny mechanizm „leniwych” wywołań zwrotnych, w którym w trybie wsadowym kilka wywołań zwrotnych jest przetwarzanych jednocześnie z wykorzystaniem timera. Zastosowanie zaproponowanej optymalizacji pozwala na zmniejszenie zużycia energii o 5-10% na urządzeniach Android i ChromeOS poprzez odkładanie żądań RCU podczas bezczynności lub niskiego obciążenia systemu.
- Dodano sysctl split_lock_mitigate do zarządzania reakcją systemu na wykrycie podzielonych blokad („split lock”), które występują podczas dostępu do niewyrównanych danych w pamięci z powodu tego, że podczas wykonywania atomowej instrukcji dane pokrywają dwie linie pamięci podręcznej CPU. Takie blokady prowadzą do znacznego spadku wydajności. Ustawienie wartości 0 w split_lock_mitigate generuje jedynie ostrzeżenie o wystąpieniu problemu, a ustawienie wartości 1, oprócz wyświetlenia ostrzeżenia, powoduje spowolnienie wykonania procesu, który spowodował blokadę, aby zachować wydajność reszty systemu.
- Dla architektury PowerPC zaproponowano nową implementację blokad qspinlock, która wykazuje wyższą wydajność i rozwiązuje niektóre problemy z blokadami, które występują w wyjątkowych przypadkach.
- Przebudowano kod obsługi przerwań MSI (Message-Signaled Interrupts), w którym usunięto nagromadzone problemy architektoniczne i dodano wsparcie dla przypisania poszczególnych obsługujących do różnych urządzeń.
- Dla systemów opartych na architekturze zestawu instrukcji LoongArch, stosowanej w procesorach Loongson 3 5000 i realizującej nowy RISC ISA, podobny do MIPS i RISC-V, wdrożono wsparcie dla ftrace, ochrony stosu, trybu uśpienia i trybu oczekiwania.
- Udostępniono możliwość przypisywania nazw obszarom współdzielonej pamięci anonimowej (wcześniej nazwy mogły być przypisane tylko do prywatnej pamięci anonimowej, przydzielonej do konkretnego procesu).
- Dodano nowy parametr wiersza poleceń jądra „trace_trigger”, przeznaczony do aktywacji wyzwalacza śledzenia, stosowanego do przypisywania warunkowych poleceń wywoływanych przy spełnieniu warunku kontrolnego (np. trace_trigger=„sched_switch.stacktrace if prev_state == 2”).
- Zwiększono wymagania dotyczące wersji pakietu binutils. Do zbudowania jądra teraz wymagane są co najmniej binutils 2.25.
- Podczas wywołania exec() dodano możliwość umieszczenia procesu w przestrzeni nazw czasu (time namespace), w której czas różni się od systemowego.
- Rozpoczęto przenoszenie z gałęzi Rust-for-Linux dodatkowej funkcjonalności związanej z wykorzystaniem języka Rust jako drugiego języka do tworzenia sterowników i modułów jądra. Wsparcie dla Rust jest domyślnie nieaktywne i nie prowadzi do włączenia Rust do obowiązkowych zależności do kompilacji jądra. Proponowana w poprzednim wydaniu podstawowa funkcjonalność została rozszerzona o możliwości wsparcia dla niskopoziomowego kodu, takie jak typ Vec oraz makra pr_debug!(), pr_cont!() i pr_alert!(), a także makro proceduralne „#[vtable]”, które upraszcza pracę z tabelami wskaźników na funkcje. Oczekuje się, że w kolejnych wydaniach zostaną dodane zaawansowane obwiednie Rust dla podsystemów jądra, które pozwolą na tworzenie pełnoprawnych sterowników w Rust.
- Typ „char” używany w jądrze został teraz domyślnie zadeklarowany jako bez znaku dla wszystkich architektur.
- Mechanizm alokacji pamięci slab – SLOB (alokator slab) został ogłoszony jako przestarzały, zaprojektowany do systemów z małą ilością pamięci. W normalnych warunkach zamiast SLOB zaleca się używanie SLUB lub SLAB. Dla systemów z małą ilością pamięci zaleca się stosowanie SLUB w trybie SLUB_TINY.
- Zezwalano na dołączenie do jądra kodu i zmian dostarczanych na licencji Copyleft-Next 0.3.1. Licencja Copyleft-Next została stworzona przez jednego z autorów GPLv3 i jest całkowicie zgodna z licencją GPLv2, co potwierdzili prawnicy firm SUSE i Red Hat. W porównaniu z GPLv2, licencja Copyleft-Next jest znacznie bardziej kompaktowa i łatwiejsza do zrozumienia (usunięto wstęp oraz odniesienia do przestarzałych kompromisów), określa terminy i procedury usuwania naruszeń, automatycznie znosi wymagania copyleft dla przestarzałych dzieł, które mają ponad 15 lat.
- Podsystem dyskowy, wejście/wyjście i systemy plików
- W Btrfs wprowadzono ulepszenia mające na celu rozwiązanie problemu „write hole” w implementacji RAID 5/6 (próba przywrócenia RAID, jeśli awaria miała miejsce podczas zapisu, a nie można ustalić, który blok został poprawnie zapisany na którym z urządzeń RAID, co może prowadzić do uszkodzenia bloków odpowiadających niezapisanym blokom). Ponadto, dla SSD teraz domyślnie automatycznie aktywowane jest asynchroniczne wykonywanie operacji „discard”, co pozwala na osiągnięcie wyższej wydajności dzięki efektywnej grupowaniu operacji „discard” w kolejce oraz przetwarzaniu kolejki przez proces w tle. Zwiększono wydajność operacji send i lseek, a także ioctl FIEMAP.
- Rozszerzono możliwości zarządzania zapisem opóźnionym (writeback, tło zapisywania zmodyfikowanych danych) dla urządzeń blokowych. W niektórych sytuacjach, na przykład przy korzystaniu z sieciowych urządzeń blokowych lub dysków USB, zapis opóźniony może prowadzić do dużego zużycia pamięci RAM. Aby zarządzać zachowaniem zapisu opóźnionego i utrzymać rozmiar pamięci podręcznej stron w określonych ramach w sysfs (\/sys\/class\/bdi\/), wprowadzono nowe parametry strict_limit, min_bytes, max_bytes, min_ratio_fine oraz max_ratio_fine.
- W systemie plików F2FS zaimplementowano operację ioctl atomowego zastąpienia, która umożliwia zapis danych do pliku w ramach jednej atomowej operacji. W F2FS dodano również blokową pamięć podręczną ekstentów, co pomaga określić aktywnie używane dane lub dane, do których nie było dostępu od dawna.
- W systemie plików ext4 zgłoszono jedynie poprawki błędów.
- W systemie plików ntfs3 wprowadzono kilka nowych opcji montowania: „nocase” do zarządzania wielkością liter w nazwach plików i katalogów; windows_name, aby zabronić tworzenia nazw plików zawierających znaki niedopuszczalne dla systemu Windows; hide_dot_files do zarządzania oznaczaniem plików ukrytych dla plików rozpoczynających się od kropki.
- W systemie plików Squashfs wprowadzono opcję montowania „threads=”, która pozwala określić liczbę wątków do równoległych operacji dekompresji. W Squashfs pojawiła się także możliwość mapowania identyfikatorów użytkowników zamontowanych systemów plików, stosowanych do przypisywania plików konkretnego użytkownika na zamontowanej obcej partycji do innego użytkownika w bieżącym systemie.
- Przerobiono implementację list kontroli dostępu POSIX (POSIX ACL). W nowej implementacji usunięto problemy architektoniczne, uproszczono utrzymanie kodu oraz zastosowano bezpieczniejsze typy danych.
- Do podsystemu fscrypt, który służy do przezroczystego szyfrowania plików i katalogów, dodano wsparcie dla algorytmu szyfrowania SM4 (chiński standard GB\/T 32907-2016).
- Umożliwiono kompilację jądra bez wsparcia dla NFSv2 (w przyszłości planuje się całkowite zaprzestanie wsparcia dla NFSv2).
- Zmodyfikowano organizację sprawdzania uprawnień dostępu do urządzeń NVMe. Wprowadzono możliwość odczytu i zapisu na urządzeniu NVMe, jeśli proces zapisujący ma dostęp do specjalnego pliku urządzenia (wcześniej proces musiał mieć uprawnienia CAP_SYS_ADMIN).
- Usunięto sterownik pakietowy dla CD/DVD, który został uznany za przestarzały w 2016 roku.
- Wirtualizacja i bezpieczeństwo
- Wprowadzono nową metodę ochrony przed luką Retbleed w procesorach Intel i AMD, wykorzystującą śledzenie głębokości wywołań, co jest mniej obciążające w porównaniu do wcześniejszej ochrony przed Retbleed. Aby włączyć nowy tryb, zaproponowano opcję wiersza poleceń jądra "retbleed=stuff".
- Dodano hybrydowy mechanizm ochrony przepływu wykonania poleceń FineIBT, łączący zastosowanie instrukcji sprzętowych Intel IBT (Indirect Branch Tracking) i ochrony programowej kCFI (kernel Control Flow Integrity) w celu zablokowania naruszenia normalnej kolejności wykonywania (control flow) w wyniku wykorzystania exploitów, które modyfikują wskaźniki funkcji przechowywane w pamięci. FineIBT zezwala na wykonywanie wywołań przez przejścia pośrednie tylko w przypadku przejścia do instrukcji ENDBR, umieszczonej na początku funkcji. Dodatkowo, analogicznie do mechanizmu kCFI, następuje weryfikacja hashy, gwarantujących niezmienność wskaźników.
- Dodano ograniczenia blokujące ataki manipulujące generowaniem stanów "oops", po których problematyczne zadania są finalizowane, a stan jest przywracany bez zatrzymywania działania systemu. Przy bardzo dużej liczbie wywołań stanu "oops" występuje przepełnienie licznika referencji (refcount), co umożliwia wykorzystanie luk wynikających z dereferencji wskaźników NULL. Aby chronić przed takimi atakami, do jądra dodano limit maksymalnej liczby wystąpień "oops", po przekroczeniu którego jądro uruchomi stan "panic" z późniejszym restartem, co uniemożliwi osiągnięcie liczby iteracji niezbędnej do przepełnienia refcount. Domyślnie limit wynosi 10 tysięcy "oops", ale w razie potrzeby można go zmienić za pomocą parametru oops_limit.
- Dodano pole konfiguracji LEGACY_TIOCSTI oraz sysctl legacy_tiocsti do wyłączenia możliwości wprowadzania danych do terminala za pomocą ioctl TIOCSTI, ponieważ ta funkcjonalność może być wykorzystywana do wstrzykiwania dowolnych znaków do bufora wejściowego terminala oraz symulacji wprowadzania przez użytkownika.
- Proponowany jest nowy typ wewnętrznych struktur encoded_page, w którym dolne bity wskaźnika są wykorzystywane do przechowywania dodatkowych informacji stosowanych w celu ochrony przed przypadkowym dereferencjonowaniem wskaźnika (w przypadku rzeczywistej potrzeby dereferencjonowania należy najpierw wyczyścić te dodatkowe bity).
- Na platformie ARM64 przy rozruchu wprowadzono możliwość włączenia i wyłączenia programowej implementacji mechanizmu Shadow Stack, stosowanego do ochrony przed nadpisaniem adresu powrotu z funkcji w przypadku przepełnienia bufora na stosie (istota ochrony polega na zachowaniu adresu powrotu w osobnym 'cieniem' stosie po przekazaniu kontroli do funkcji oraz jego wydobyciu przed wyjściem z funkcji). Obsługa zarówno sprzętowej, jak i programowej implementacji Shadow Stack w jednym jądrze pozwala na użycie tego samego jądra w różnych systemach ARM, niezależnie od wsparcia dla instrukcji autoryzacji wskaźników. Włączenie programowej implementacji odbywa się poprzez zamianę odpowiednich instrukcji w kodzie podczas rozruchu.
- Dodano wsparcie dla mechanizmu asynchronicznego powiadomienia o wyjściu (asynchronous exit notification) na procesorach Intel, umożliwiającego wykrywanie ataków typu single-step na kod wykonywany w enklawach SGX.
- Proponowany jest zestaw operacji, które pozwalają hipernadzorcy obsługiwać zapytania z systemów gościnnych Intel TDX (Trusted Domain Extensions).
- Usunięto ustawienia kompilacji jądra RANDOM_TRUST_BOOTLOADER oraz RANDOM_TRUST_CPU, zamiast nich należy używać odpowiednich opcji wiersza poleceń random.trust_bootloader oraz random.trust_cpu.
- W mechanizmie Landlock, który pozwala ograniczyć interakcję grupy procesów z otoczeniem, dodano wsparcie dla flagi LANDLOCK_ACCESS_FS_TRUNCATE, umożliwiającej kontrolowanie wykonywania operacji przycinania plików.
- Subsystem sieciowy
- Do IPv6 dodano wsparcie dla PLB (Protective Load Balancing), mechanizmu równoważenia obciążenia między łączami sieciowymi, mającego na celu ograniczenie punktów przeciążeń na przełącznikach centrów danych. Poprzez zmianę etykiety przepływu IPv6, PLB losowo zmienia ścieżki pakietów, aby wyrównać obciążenie portów przełącznika. W celu zmniejszenia reorganizacji pakietów operacja ta jest przeprowadzana po okresach bezczynności, gdy to możliwe. Zastosowanie PLB w centrach danych Google pozwoliło zmniejszyć nierównowagę obciążenia na portach przełączników średnio o 60%, zmniejszyć utratę pakietów o 33% i zredukować opóźnienia o 20%.
- Dodano sterownik dla urządzeń MediaTek z obsługą Wi-Fi 7 (802.11be).
- Dodano wsparcie dla 800-gigabitowych łączy.
- Dodano możliwość zmiany nazw interfejsów sieciowych w locie, bez zatrzymywania pracy.
- Do logowanych komunikatów o SYN flood dodano wzmiankę o adresie IP, na który dotarł pakiet.
- Dla UDP zrealizowano możliwość użycia oddzielnych tabel haszujących dla różnych przestrzeni nazw sieciowych.
- Dla mostków sieciowych zrealizowano wsparcie dla metody uwierzytelniania MAB (MAC Authentication Bypass).
- Dla protokołu CAN (CAN_RAW) zrealizowano wsparcie dla trybu gniazd SO_MARK umożliwiającego załączanie filtrów ruchu na podstawie fwmark.
- W ipset wprowadzono nowy parametr bitmask, który pozwala określić maskę na podstawie dowolnych bitów w adresie IP (np. „ipset create set1 hash:ip bitmask 255.128.255.0”).
- W nf_tables dodano wsparcie dla przetwarzania nagłówków wewnętrznych (inner), które są częścią tunelowanych pakietów.
- Sprzęt
- Dodano podsystem „accel” z realizacją ramy dla akceleratorów obliczeniowych, które mogą być dostarczane zarówno w formie oddzielnych ASIC, jak i bloków IP w ramach SoC i GPU. Akceleratory te są w głównej mierze ukierunkowane na przyspieszanie rozwiązywania problemów uczenia maszynowego.
- W sterowniku amdgpu włączono wsparcie dla komponentów IP GC, PSP, SMU i NBIO. Dla systemów ARM64 zrealizowano wsparcie dla DCN (Display Core Next). Realizacja zabezpieczonego wyjścia na ekran została przeniesiona z użycia DCN10 na DCN21 i może być teraz używana przy podłączaniu kilku ekranów.
- W sterowniku i915 (Intel) ustabilizowano wsparcie dla dyskretnych kart graficznych Intel Arc (DG2/Alchemist).
- W sterowniku Nouveau wprowadzono wsparcie dla GPU NVIDIA GA102 (RTX 30) opartego na architekturze Ampere. Dla kart nva3 (GT215) dodano możliwość sterowania podświetleniem tła.
- Dodano wsparcie dla bezprzewodowych adapterów opartych na chipach Realtek 8852BE, Realtek 8821CU, 8822BU, 8822CU, 8723DU (USB) oraz MediaTek MT7996, interfejsów Bluetooth Broadcom BCM4377/4378/4387, a także kontrolerów Ethernet Motorcomm yt8521, NVIDIA Tegra GE.
- Dodano wsparcie ASoC (ALSA System on Chip) dla wbudowanych chipów audio HP Stream 8, Advantech MICA-071, Dell SKU 0C11, Intel ALC5682I-VD, Xiaomi Redmi Book Pro 14 2022, i.MX93, Armada 38x, RK3588. Dodano wsparcie dla interfejsu audio Focusrite Saffire Pro 40. Dodano kodek audio Realtek RT1318.
- Dodano wsparcie dla smartfonów i tabletów Sony (Xperia 10 IV, 5 IV, X i X compact, OnePlus One, 3, 3T oraz Nord N100, Xiaomi Poco F1 i Mi6, Huawei Watch, Google Pixel 3a, Samsung Galaxy Tab 4 10.1.
- Dodano wsparcie dla ARM SoC oraz płyt Apple T6000 (M1 Pro), T6001 (M1 Max), T6002 (M1 Ultra), Qualcomm MSM8996 Pro (Snapdragon 821), SM6115 (Snapdragon 662), SM4250 (Snapdragon 460), SM6375 (Snapdragon 695), SDM670 (Snapdragon 670), MSM8976 (Snapdragon 652), MSM8956 (Snapdragon 650), RK3326 Odroid-Go/rg351, Zyxel NSA310S, InnoComm i.MX8MM, Odroid Go Ultra.
Równocześnie latynoamerykańska Fundacja Wolnego Oprogramowania stworzyła wersję w pełni wolnego jądra 6.2 — Linux-libre 6.2-gnu, oczyszczoną z elementów firmware i sterowników zawierających nieliczne składniki lub kawałki kodu, których zakres zastosowania jest ograniczony przez producenta. W nowym wydaniu przeprowadzono czyszczenie nowych blobów w sterowniku nouveau. Wyłączono ładowanie blobów w sterownikach mt7622, mt7996 wifi oraz bcm4377 bluetooth. Przeprowadzono czyszczenie nazw blobów w plikach dts dla architektury Aarch64. Zaktualizowano kod czyszczenia blobów w różnych sterownikach i podsystemach. Zaprzestano czyszczenia sterownika s5k4ecgx, ponieważ został on usunięty z jądra.
Źródło: opennet.ru
