Po dwóch miesiącach prac Linus Torvalds zaprezentował wydanie jądra Linux 6.10. Wśród najbardziej zauważalnych zmian znajduje się sterownik ntsync z prymitywami synchronizacji Windows NT, komponenty DRM Panic do realizacji odpowiednika "niebieskiego ekranu śmierci", zaprzestanie wsparcia dla starych procesorów Alpha, możliwość weryfikacji integralności w systemie plików opartym na FUSE, ograniczenie dostępu do ioctl poprzez mechanizm Landlock, podsystem do profilowania operacji alokacji pamięci, wywołanie systemowe mseal(), możliwość szyfrowanego wymiany danych z urządzeniami TPM oraz wsparcie dla wysokoprioritetowych kolejek roboczych w dm-crypt, jak również sterownik panthor dla dziesiątej generacji GPU Mali.
W nowej wersji wprowadzono 14564 poprawek od 1989 programistów, rozmiar łatki wynosi 41 MB (zmiany dotyczyły 12509 plików, dodano 547663 linie kodu, usunięto 312464 linie). W poprzednim wydaniu wprowadzono 15680 poprawek od 2106 programistów, a rozmiar łatki wyniósł 54 MB. Około 41% ze wszystkich zmian w 6.10 dotyczy sterowników urządzeń, około 15% zmian jest związanych z aktualizacją kodu specyficznego dla architektur sprzętowych, 13% dotyczy stosu sieciowego, 5% - systemów plików, a 4% - z wewnętrznymi podsystemami jądra.
Główne nowości w jądrze 6.10:
- Podsystem dyskowy, wejście/wyjście i systemy plików
- Dodano nową operację fcntl F_DUPFD_QUERY, dzięki której proces może ustalić, że dwa różne deskryptory plików odnoszą się do tego samego pliku. W przeciwieństwie do podobnych możliwości oferowanych przez wywołanie systemowe kcmp(), F_DUPFD_QUERY nie prowadzi do ujawniania zbędnych informacji i działa na systemach z wyłączonym kcmp().
- W podsystemie FUSE, stosowanym do realizacji systemów plików w przestrzeni użytkownika, wprowadzono możliwość zastosowania mechanizmu fs-verity do weryfikacji integralności i autentyczności plików.
- Do modułu dm-crypt, używanego do szyfrowania urządzeń blokowych, dodano opcję "high_priority", pozwalającą na wykorzystanie wysokoprioritetowych kolejek roboczych w celu zwiększenia wydajności na mocnych serwerach. Domyślnie tryb jest wyłączony, ponieważ może prowadzić do zwiększenia opóźnień na zwykłych komputerach w trakcie wykonywania zadań niezwiązanych z szyfrowaniem, takich jak przetwarzanie dźwięku.
- Wprowadzono protokół oparty na netlink do zarządzania serwerem NFS w jądrze. W przestrzeni użytkownika opracowano narzędzie nfsdctl oparte na tym protokole. Domyślnie wyłączono wsparcie dla montowania NFS v2 (wsparcie dla NFS v2 w narzędziu mount.nfs zostało zakończone już w 2021 roku).
- W systemie plików XFS kontynuowano prace nad wdrożeniem możliwości użycia narzędzia fsck do sprawdzania i naprawiania wykrytych problemów w trybie online, bez demontowania systemu plików. Dodano ioctl XFS_IOC_EXCHANGE_RANGE do wymiany zakresów bajtów między dwoma plikami w trybie atomowym.
- W Btrfs wprowadzono wsparcie dla zmniejszania (shrinker) niezwiązanych map extents, co może być pomocne w redukcji zużycia pamięci w warunkach niedoboru pamięci w systemie. Kod odpowiedzialny za kompresję danych oraz funkcja put_file_data() zostały przetłumaczone na użycie foliantów stron pamięci (page folios). Został przeprojektowany mechanizm blokowania extents podczas wykonywania operacji zapisu zwrotnego.
- W systemie plików Ext4 dodano wsparcie dla ioctl FS_IOC_GETFSSYSFSPATH do określenia lokalizacji określonego zamontowanego systemu plików w hierarchii /sys/fs.
- Systemy plików OPENPROMFS, ISOFS, QNX6, NILFS2, MINIX i FREEVXFS zostały przetłumaczone na użycie nowego API montowania partycji.
- W systemie plików EROFS (Extendable Read-Only File System), przeznaczonym do użycia na partycjach dostępnych tylko w trybie odczytu, dodano wsparcie dla algorytmu kompresji Zstandard.
- W Bcachefs przygotowano się do wykonania fsck bez demontowania partycji (sprawdzenie online). Dodano zmiany i poprawki w celu zwiększenia niezawodności działania. Wprowadzono możliwość aktualizacji i cofania formatu FS w trybie „nochanges”, wyłączającym zapis i przechowującym metadane tylko w pamięci.
- W systemie plików OverlayFS dodano wsparcie dla tworzenia tymczasowych plików przy użyciu opcji O_TMPFILE.
- Zakończono wsparcie mechanizmu ograniczającego przepustowość urządzeń blokowych „CONFIG_BLK_DEV_THROTTLING_LOW”, który od 2017 roku pozostawał w stanie eksperymentalnym, nie zdobył popularności w praktyce i utrudniał utrzymanie podsystemu urządzeń blokowych.
- Pamięć i usługi systemowe
- Dodano, ale wyłączone podczas kompilacji, sterownik ntsync, implementujący urządzenie symboliczne /dev/ntsync oraz zestaw prymitywów synchronizacji stosowanych w jądrze Windows NT. Implementacja takich prymitywów na poziomie jądra pozwala zdecydowanie zwiększyć wydajność gier Windows uruchamianych za pomocą Wine. Zysk wydajności wynika z eliminacji kosztów związanych z używaniem RPC w przestrzeni użytkownika. Stworzenie oddzielnego sterownika dla jądra Linux tłumaczy się problematycznością poprawnej implementacji API synchronizacji NT nad istniejącymi prymitywami w jądrze.
- Dodano podsystem do profilowania operacji alokacji pamięci w jądrze Linux, który pozwala wykrywać wycieki pamięci w jądrze i ułatwia przeprowadzanie optymalizacji zużycia pamięci. Podsystem zapewnia niskie koszty overhead, co pozwala używać go nie tylko w wersjach debugowania jądra, ale także w systemach produkcyjnych.
- Dodano wstępną implementację obsługi awaryjnej w jądrze — DRM Panic, korzystającą z podsystemu DRM (Direct Rendering Manager) do wyświetlania wizualnego kolorowego raportu w stylu »niebieskiego ekranu śmierci«. W następnej wersji planowane jest dodanie możliwości wyświetlania logo i kodu QR na ekranie w przypadku wystąpienia stanu awaryjnego.
- Kontynuowano przenoszenie zmian z gałęzi Rust-for-Linux związanych z używaniem języka Rust jako drugiego języka do tworzenia sterowników i modułów jądra (wsparcie dla Rust nie jest domyślnie aktywne i nie prowadzi do włączenia Rust do obowiązkowych zależności kompilacyjnych jądra). Zrealizowano przejście na wydanie Rust 1.78, umożliwiające wykorzystanie standardowej biblioteki alloc zamiast jej własnej gałęzi. Dodano abstrakcje do pracy z czasem w jądrze (oprowadzenie nad strukturą ktime_t). Dodano wsparcie dla używania komponentów jądra w języku Rust w systemach z architekturą RISC-V.
- W programach BPF wprowadzono możliwość korzystania z kolejek oczekiwania (wait queue) w jądrze. Dodano funkcje bpf_preempt_disable i bpf_preempt_enable, które umożliwiają tworzenie sekcji z kodem, które nie są przerywane przez scheduler zadań. Umożliwiono dostęp programów BPF do funkcji kryptograficznych jądra (crypto). Wprowadzono wsparcie dla kompilacji JIT programów BPF na systemach z 32-bitowymi procesorami ARCv2.
- Dla 32-bitowych systemów ARM wprowadzono wsparcie dla budowy jądra za pomocą kompilatora Clang z włączonym trybem ochrony CFI (Control Flow Integrity), który blokuje naruszenia normalnego porządku wykonania (control flow) spowodowane przez exploity, zmieniające przechowywane w pamięci wskaźniki na funkcje.
- Dodano możliwość bezpośredniego odzwierciedlenia przez mmap() okrągłych buforów śledzenia w celu przesłania ich zawartości do przestrzeni użytkownika bez dodatkowego kopiowania.
- Dodano wywołanie systemowe «mseal», które pozwala procesom wystawiać blokadę na zmianę określonych części swojej przestrzeni adresowej. W praktyce nowe wywołanie systemowe ma być używane w przeglądarce Chrome w celu wzmocnienia izolacji sandboxu.
- Dla subarchitektury x32, która oferuje hybrydowy ABI x86_64, umożliwiający korzystanie w systemach 64-bitowych z 32-bitowego modelu adresowania pamięci (procesor działa w trybie 64-bitowym, ale używa 32-bitowych wskaźników i operacji arytmetycznych), dodano wsparcie dla mechanizmu Shadow Stack, który pozwala blokować działanie wielu exploitów, wykorzystując możliwości sprzętowe procesorów Intel do ochrony przed nadpisywaniem adresu powrotu z funkcji w przypadku przepełnienia bufora na stosie.
- Na systemach z architekturą ARM64 w wywołaniu systemowym userfaultfd(), które umożliwia tworzenie obsługi zdarzeń dotyczących nieprzydzielonych stron pamięci (page faults) w przestrzeni użytkownika, wprowadzono możliwości związane z ochroną przed zapisem obszarów pamięci oraz elementów tabeli stron pamięci.
- Usunięto kod obsługujący procesory Alpha 21164 (EV5) i wcześniejsze serie, które były wydawane od 1995 roku. Utrzymanie kodu dla tych procesorów było utrudnione z powodu braku dostępu do pamięci na poziomie pojedynczych bajtów. Alpha była pierwszą architekturą, na którą przeniesiono jądro Linux, pierwotnie dostępne tylko dla systemów x86.
- Wirtualizacja i bezpieczeństwo
- Dodano wsparcie dla szyfrowanej wymiany danych z urządzeniami TPM (Trusted Platform Module) oraz weryfikacji integralności transakcji.
- Do modułu LSM Landlock, który ogranicza interakcję grupy procesów z otoczeniem, dodano możliwość stosowania reguł do ograniczenia dostępu do wywołań ioctl().
- Proponowana jest opcja init_mlocked_on_free, dostępna na etapie bootowania, zapewniająca wyczyszczenie zawartości pamięci chronionej przed wymianą na dysk za pomocą wywołania mlock(), jeśli ta pamięć zostanie zwolniona bez odblokowania przez wywołanie munlock(). Użycie tej opcji pozwala na uniknięcie pozostawienia kluczy kryptograficznych w pamięci w przypadku nagłego zakończenia działania aplikacji korzystającej z nich.
- W subsystemie crypto przyspieszone zostało wykonywanie operacji szyfrowania dysków z użyciem algorytmu AES-XTS na systemach x86_64 z procesorami Intel i AMD obsługującymi rozszerzenia VAES, AVX2, VPCLMULQDQ, AVX10 lub AVX512.
- Usunięto możliwość zbierania statystyk dotyczących użycia kryptosubsystemu jądra (CONFIG_CRYPTO_STATS). Funkcjonalność ta nie była wykorzystywana w praktyce, powodując znaczne obniżenie wydajności oraz dodatkowe obciążenie dla osób zajmujących się utrzymaniem.
- Subsystem sieciowy
- Znacznie zwiększono wydajność operacji przesyłania danych w trybie zero-copy przy użyciu subsystemu io_uring. Dodano możliwość łączenia ("bundle") kilku buforów dla operacji wysyłania i odbierania danych.
- Przepisano kod zbierania danych o wykorzystaniu przy wysyłaniu deskryptorów plików przez Unix-socket z użyciem wiadomości SCM_RIGHTS. Zmiana ta rozwiązuje problem kumulacji cyklicznych liczników odniesień.
- Dodano możliwość ustawiania filtrów dla protokołu PFCP (Packet Forwarding Control Protocol), używanego w sieciach 4G i 5G.
- Dodano wsparcie dla opcji gniazd sieciowych SO_PEEK_OFF, która, podobnie jak w przypadku tej samej opcji dla gniazd Unix, umożliwia określenie przesunięcia danych w kolejce używanej przez wywołanie systemowe recv przy wskazaniu flagi MSG_PEEK (oznaczenie danych jako nieprzeczytanych, które zostaną ponownie wydane przy następnym wywołaniu recv).
- Do podsystemu io_uring dodano wsparcie dla operacji IORING_CQE_F_SOCK_NONEMPTY, która pozwala określić, czy w gnieździe sieciowym są oczekujące na przetworzenie żądania połączenia.
- Zaproponowano wdrożenie technologii PoE (Power over Ethernet), opartej na wcześniej dostępnym kodzie wspierającym PoDL (Power over Data Line) i kompatybilnej z kontrolerami PoE Microchip PD692x0 i TI TPS23881.
- Dla protokołów TCP, DCCP i MPTC dodano wsparcie dla mechanizmu rstreason, który pozwala określić przyczynę wysyłania pakietów RST (na przykład NO_SOCKET).
- Sprzęt
- Do zestawu dodano sterownik panthor dla dziesiątej generacji GPU Mali (G310, G510, G710), w którym zastosowano technologię CSF (Command Stream Frontend), która przenosi na stronę oprogramowania niektóre funkcje sterownika w celu zmniejszenia obciążenia CPU oraz oferuje nowy model organizacji wykonania zadań na GPU. Zmiany w celu wsparcia nowego sterownika zostały również wprowadzone do Mesa i włączone do sterownika Gallium panfrost dla GPU Mali.
- Do sterownika i915 dodano identyfikatory PCI nowych dyskretnych kart graficznych Intel Arc (DG2/Alchemist).
- Kontynuowana jest praca nad sterownikiem drm (Direct Rendering Manager) Xe dla GPU opartego na architekturze Intel Xe, który jest używany w kartach graficznych Intel z rodziny Arc oraz w zintegrowanej grafice, począwszy od procesorów Tiger Lake. Dodano wsparcie dla CPU Arrow Lake H. Kontynuowana realizacja wsparcia dla procesorów Lunar Lake. Dodano wstępne wsparcie dla mechanizmu SR-IOV (Single Root I/O Virtualization).
- W sterowniku AMDGPU dodano wsparcie dla SMU 14.0 (System Management Unit). Umożliwiono wykorzystanie nowych GPU AMD w systemach z architekturą RISC-V.
- Dodano sterownik dla przyspieszacza operacji kryptograficznych Tegra Security Engine, który można wykorzystać do przyspieszenia AES i różnych algorytmów haszujących.
- Dodano wsparcie dla paneli ekranowych LG SW43408, Innolux G121XCE-L01 LVDS, RK3326 GameForce Chi, Crystal Clear CMT430B19N00, POWERTIP PH128800T006-ZHC01, Startek KD050HDFIA020-C020A, Pixel 3a, Khadas TS050 V2, Raydium RM69380, BOE NT116WHM-N44, CMN N116BCA-EA1 oraz AUO B120XAN01.0.
- Dodano wsparcie dla systemu dźwiękowego laptopów Lenovo Thinkbook 13x Gen 4, Lenovo Thinkbook 16P Gen 5, Lenovo Thinkbook 13X oraz ASUS Zenbook 2024 HN7306. Dodano wsparcie dla zewnętrznych kart dźwiękowych Vocaster One i Vocaster Two. Dodano sterownik dla wzmacniaczy NAU8325 od firmy Nuvoton Technology.
- W sterowniku HID-Steam dodano wsparcie dla IMU (Inertial Measurement Unit) kontrolera do gier Steam Deck, co pozwala na użycie osobnego węzła evdev do uzyskania dostępu do danych żyroskopu i akcelerometru.
- Włączono zmiany dla wsparcia ARM SoC Snapdragon X Elite, który wykorzystuje własny 12-rdzeniowy CPU Qualcomm Oryon i GPU Qualcomm Adreno. Chip jest skierowany do użycia w laptopach i komputerach PC, i w wielu testach przewyższa wyniki chipów Apple M3 oraz Intel Core Ultra 155H.
- Dodano wsparcie dla platform ARM, SoC i urządzeń: PocketBook 614 Plus, Sony Xperia Z3, Xperia 1 V, Samsung Galaxy S5 China, Motorola Moto G, RK3326 GameForce Chi, Anbernic RG35XX (Plus/H/2024), Airoha EN7581, Radxa ROCK 3C, ArmSom Sige7, Tanix TX1, Toradex Colibri iMX8DX, Renesas RZ/V2H, Forlinx OK3588-C, Protonic MECSBC, Emcraft Systems NavQ+, NXP S32G3, Wolfvision pf5, Amlogic A4/A5, ASUS RT-AC3200, ASUS RT-AC5300, ASrock E3C256D4I, IBM system1 BMC, Meta Harma BMC(AST2600), ASRock X570D4U BMC, Au-Zone Maivin AI Vision Starter Kit.
- Dodano wsparcie dla płyty Milk-V Mars, używającej SoC Starfive JH7110 opartego na architekturze RISC-V.
Równocześnie latynoamerykańska Fundacja Wolnego Oprogramowania utworzyła wariant całkowicie wolnego jądra 6.10 — Linux-libre 6.10-gnu, oczyszczonego z elementów firmware i sterowników zawierających zamknięte komponenty lub fragmenty kodu, których zakres stosowania jest ograniczony przez producenta. W wydaniu 6.10 zaktualizowano kod czyszczenia blobów w sterownikach Intel i915, rtl8xxxu, qla2xxx i QCAI sahara. Przeprowadzono czyszczenie nazw blobów w plikach dts (devicetree) dla architektury Aarch64. Oczyszczono z blobów nowe pliki dodane w sterownikach Adreno, Intel IPU3 i PRUEth. Przeprowadzono czyszczenie nowych sterowników Panthor, Intel IPU6, PRUEth SR1, rtw8703b, tps23881, air_en8811h, Intel ISH HID i pcm6240. Zaprzestano czyszczenia sterownika USB Prism2.5/3 USB, który został usunięty z jądra.
Źródło: opennet.ru
