Wydanie jądra Linux 6.11

Po dwóch miesiącach prac Linus Torvalds zaprezentował wydanie jądra Linux 6.11. Wśród najważniejszych zmian znajdują się: wsparcie dla atomowych operacji zapisu na poziomie bloków, wsparcie dla operacji bind() i listen() w io_uring, nowy mechanizm blokad programowych obsługi przerwań, możliwość zapisu do odzwierciedlonych w pamięci plików wykonywalnych, wsparcie dla pisania sterowników urządzeń blokowych w języku Rust, optymalizacja wywołania getrandom(), nowa implementacja AES-GCM.

Nowa wersja zawiera 15130 poprawek od 2078 programistów, rozmiar łatki wynosi 85 MB (zmiany dotknęły 13282 plików, dodano 985857 linii kodu, usunięto 268915 linii). W poprzednim wydaniu było 14564 poprawek od 1989 programistów, rozmiar łatki wynosił 41 MB (dwa razy mniej niż łatka dla jądra 6.11). Około 46% wszystkich zmian w 6.11 dotyczy sterowników urządzeń, około 17% zmian dotyczy aktualizacji kodu specyficznego dla architektur sprzętowych, 10% związane jest z stosem sieciowym, 5% z systemami plików, a 3% z wewnętrznymi subsystémami jądra.

Główne nowości w jądrze 6.11:

  • Podsystem dyskowy, wejście/wyjście i systemy plików
    • Zrealizowano wsparcie dla atomowych operacji zapisu na poziomie bloków, w których na nośniku zapisywany jest albo cały zadany zestaw bloków, albo żaden z bloków, co pozwala chronić przed sytuacjami, w których po awarii sprzętu zapisywana jest tylko część bloków, a w pozostałej części zostaje stara informacja. Aby włączyć atomowy tryb zapisu w wywołaniu systemowym pwritev(), dodano flagę RWF_ATOMIC. Informacje o wsparciu atomowego zapisu (atomic_write_unit_min, atomic_write_unit_max i atomic_write_segments_max) w odniesieniu do pojedynczych plików można uzyskać za pomocą funkcji statx().
    • Oferowane jest wsparcie dla zapisu do plików wykonywalnych związanych z działającymi procesami. Wcześniej, tak jak w innych systemach uniksowych, jądro zgłaszało błąd przy próbie zapisu do pliku wykonywalnego uruchomionego procesu. Ograniczenie to zostało zniesione, ponieważ jest pozbawione praktycznego sensu.
    • Zrealizowano możliwość tworzenia sterowników urządzeń blokowych w języku Rust. Jako przykład do jądra dodano sterownik rnull, będący odpowiednikiem sterownika null_blk, napisanego w języku Rust.
    • W systemie plików Btrfs w opcji montowania „rescue=” wprowadzono wsparcie dla nowych trybów „ignoremetacsums” i „ignoresuperflags”, które można wykorzystać do przeniesienia niektórych kontroli do przestrzeni użytkownika podczas przywracania systemu plików po awarii. Realizacja operacji dynamicznego zwracania grup bloków została przerobiona, aby wykluczyć sytuację braku wolnego miejsca w warunkach niepełnego wypełnienia systemu plików.
    • W systemie plików ntfs3 wprowadzono wsparcie dla atrybutów „compressed” i „immutable”, definiujących pliki skompresowane i niezmienne.
    • W systemach plików F2FS i Ext4 przetwarzanie nazw plików bez uwzględnienia wielkości liter (casefold) uproszczono poprzez przechowywanie nazw w formie qstr-łańcuchów bez zbędnych przekształceń wielkości liter.
    • W systemie plików Ext4 optymalizacja funkcji jbd2_transaction_committed poprawiła wydajność na bardzo szybkich nośnikach (w testach odnotowano wzrost liczby przetwarzanych operacji na sekundę o 20%).
    • W wywołaniu systemowym statx() zezwolono na przekazywanie wskaźnika NULL zamiast pustego ciągu z ścieżką do pliku, jeśli ustawiony jest znacznik AT_EMPTY_PATH.
    • W wywołaniu systemowym open_by_handle_at() złagodzono kontrole uprawnień dostępu do pliku, gdy brak jest uprawnień CAP_DAC_READ_SEARCH do przeszukiwania w początkowej przestrzeni nazw. Wcześniej konieczność posiadania uprawnień CAP_DAC_READ_SEARCH do początkowej przestrzeni nazw uniemożliwiała korzystanie z wywołania systemowego open_by_handle_at() w kontenerach.
    • Rozszerzone możliwości wywołań systemowych listmount() i statmount(). W listmount() dodano znacznik LISTMOUNT_REVERSE do wyświetlania zawartości tabeli punktów montowania w odwróconym porządku (najświeższe wpisy na górze). W statmount() wprowadzono wyświetlanie opcji ustawionych podczas montowania systemu plików. W obu wywołaniach systemowych zezwolono na działanie bez dostępu do początkowej przestrzeni nazw (gdy dostępne jest tylko lokalne lub zewnętrzne przestrzeń nazw).
    • W systemie plików Bcachefs wprowadzono wsparcie dla automatycznego przezroczystego przywracania problematycznych danych, przy użyciu kodów naprawy błędów — jeśli podczas odczytu występuje błąd wejścia/wyjścia lub wykryto niespójność sumy kontrolnej, problematyczny blok danych jest automatycznie zapisany ponownie w przypadku dostępności nadmiarowości do jego przywrócenia.
  • Pamięć i usługi systemowe
    • W zestawie przyjęto poprawki z wdrożeniem nowego mechanizmu blokowania programowych obsługiwaczy przerwań (BH, bottom-half), który zapewnia blokowanie używanych struktur danych, ale jednocześnie nie powoduje zablokowania równoległego wykonywania niepowiązanego z nimi kodu. Zauważono, że zmiana pozwoliła nie tylko na zmniejszenie opóźnień dla rdzeni działających w trybie rzeczywistym, ale również na zwiększenie wydajności zwykłych rdzeni (na przykład dla niektórych rodzajów obciążeń zaobserwowano wzrost wydajności systemu sieciowego o 14,5%).
    • Do podsystemu asynchronicznego wejścia/wyjścia io_uring dodano wsparcie dla operacji realizujących funkcje bind() i listen(), używanych do tworzenia akceptujących połączenia gniazd sieciowych.
    • Dodano zestaw operacji ioctl dla pseudo-FS NSFS (NameSpace FS), wykorzystywanego do pracy z przestrzenią nazw. Nowe operacje ioctl pozwalają przekształcać identyfikatory procesów i grup wątków między różnymi przestrzeniami nazw identyfikatorów procesów (PID namespace). Podobne operacje ioctl, pozwalające na podstawie identyfikatorów pidfd określać deskryptory plików procesów w odrębnych przestrzeniach nazw, również dodano do pseudo-FS pidfd.
    • Dla programów BPF dodano wsparcie dla nowego iteratora do pracy z maskami bitowymi, który można wykorzystać, na przykład, do iteracji poszczególnych bitów w obszarach pamięci, takich jak cpumask. Dodano mechanizm do wysyłania procesom w przestrzeni użytkownika powiadomień o odłączeniu (detach/unregister) obiektu struct_ops. Poszerzono zakres typów, które można stosować w tablicach (na przykład, można deklarować tablice, które mają elementy z typami kptr, bpf_rb_root i bpf_list_head). Proponowany jest bardziej niezawodny mechanizm Split BTF (BPF Type Format), używany do weryfikacji typów w pseudokodzie BPF.
    • Dodano podsystem, który pozwala na organizację zasilania urządzeń w określonej kolejności, na wypadek gdy jedno urządzenie musi być aktywowane przed innym (na przykład podczas aktywacji chipów bezprzewodowych na platformach Qualcomm).
    • Dodano moduł „Sloppy logic analyzer”, który pozwala na tworzenie prostych analizatorów logicznych sygnału, wykorzystujących GPIO i działających na oddzielnym rdzeniu CPU.
    • Dodano wsparcie dla stałych runtime, które mogą być używane zamiast zmiennych inicjowanych jednokrotnie. Na przykład stałe runtime mogą być stosowane zamiast zmiennych przechowujących wskaźnik i rozmiar dla pamięci podręcznej dentry. Te zmienne są ustawiane w czasie ładowania i nigdy później się nie zmieniają. Idea polega na tym, aby bezpośrednio wstawiać wartości takich zmiennych do instrukcji w kodzie, eliminując narzuty związane z manewrowaniem wskaźnikami.
    • Kontynuowany jest transfer zmian z gałęzi Rust-for-Linux, związanych z wykorzystaniem języka Rust jako drugiego języka do tworzenia sterowników i modułów jądra (wsparcie dla Rust nie jest włączone domyślnie i nie prowadzi do zaliczenia Rust do obowiązkowych zależności przy budowie jądra). Dodano wsparcie dla wydania Rust 1.80 (jako minimalna wersja nadal wspierana jest Rust 1.78). Oprócz wcześniej wymienionych narzędzi do rozwijania sterowników urządzeń blokowych, w nowej wersji dodano abstrakcje do ładowania firmware'u, dostępu do przestrzeni użytkownika (uaccess) oraz działania ze strukturą "page".
    • Dla systemów x86-64 zrealizowano nowy systemowy wywołanie uretprobe(), optymalizujące działanie mechanizmu śledzenia uretprobe, pozwalającego śledzić wartości zwracane przez funkcje w aplikacjach przestrzeni użytkownika.
    • Dodano parametry wiersza poleceń jądra: „reserve_mem” dla rezerwacji nazwanej przestrzeni pamięci podczas ładowania oraz „ramoops.mem_name” do użycia w obszarze pamięci pstore utworzonym za pomocą reserve_mem.
    • W kontrolerze pamięci opartym na cgroup do pliku memory.reclaim, w którym określane są ustawienia spłaty pamięci, dodano parametr „swappiness”, pozwalający zmienić balans między spłacaniem anonimowych stron pamięci do obszaru wymiany a zwalnianiem stron pamięci zajętych przez pamięć podręczną plików.
    • Dodano interfejs ioctl PROCMAP_QUERY dla bardziej efektywnego wyszukiwania wirtualnych obszarów pamięci (Virtual Memory Area) w /proc/PID/maps.
    • Do systemowego wywołania mmap() dodano flagę MAP_DROPPABLE do żądania pamięci, która nigdy nie będzie zrzucana do obszaru wymiany, a w przypadku niedoboru pamięci może być usunięta.
    • Dla architektury ARM64 wprowadzono wsparcie dla gorącego podłączenia (przełączania pomiędzy trybami online/offline) fizycznych i wirtualnych CPU w systemach z ACPI.
    • Architektura RISC-V zyskała wsparcie dla hot-plugging pamięci oraz dodano wsparcie dla wtyczki GCC STACKLEAK (inicjalizuje wszystkie zmienne przechowywane na stosie, aby zapobiec wyciekom informacji z jądra przez nieinicjalizowane zmienne, które mogą zawierać resztki wcześniej zapisanych danych na stosie).
    • Usunięto mechanizm fikcyjnego mapowania pamięci EFI (fake EFI memory map) na etapie rozruchu. Ten mechanizm nie był wykorzystywany w praktyce i przeszkadzał w pracach nad wykonywaniem poufnym. maszyn wirtualnych.
    • Zaprzestano wsparcia dla platformy PowerPC 40x.
    • Podwyższono wymagania dotyczące wersji GNU Make — do budowy jądra wymagana jest co najmniej wersja GNU Make opublikowana w 2013 roku.
  • Wirtualizacja i bezpieczeństwo
    • Zintegrowano poprawki, które znacznie (do 15 razy) przyspieszają uzyskiwanie liczb losowych za pomocą wywołania systemowego getrandom(). Optymalizacja opiera się na wykorzystaniu mechanizmu vDSO (virtual dynamic shared object), który przenosi obsługę wywołania systemowego z jądra do przestrzeni użytkownika i unika przełączania kontekstu. Operacja realizacji wywołania systemowego jest ładowana w przestrzeń adresową procesu bezpośrednio przez jądro.
    • Dla systemów x86-64 włączono nową implementację algorytmu szyfrowania AES-GCM, wspierającą użycie instrukcji wektorowych VAES, VPCLMULQDQ oraz AVX512/AVX10 dla przyspieszenia obliczeń. W przeprowadzonych testach wzrost wydajności po przejściu na nową implementację osiąga 156%. Assemblerowa implementacja AES-GCM została całkowicie przepisana z uwzględnieniem poprawności, wydajności, rozmiaru i szczegółowej dokumentacji kodu.
    • Wprowadzono możliwość uruchamiania jądra jako systemu gościa w zwirtualizowanych środowiskach, wykorzystujących rozszerzenie procesora AMD SEV-SNP (Secure Nested Paging), mające na celu zapewnienie bezpiecznej pracy z zagnieżdżonymi tabelami stron pamięci. W celu dodatkowej izolacji dostępu do zasobów z maszyn wirtualnych można zastosować moduł SVSM (Linux Secure VM Service Module). W hipernadzorze KVM dodano wstępne wsparcie dla uruchamiania systemów gości zabezpieczonych za pomocą AMD SEV-SNP.
    • Dodano oddzielny alokator slab bucket, który można włączyć za pomocą parametru CONFIG_SLAB_BUCKETS, zapewniający ochronę przed atakami techniką „heap spraying”.
    • W hiperwiza KVM dodano wywołanie ioctl do wstępnego przydzielenia pamięci dla systemu gościa przed jego faktycznym uruchomieniem.
  • Subsystem sieciowy
    • Dodano parametr sysctl net.tcp_rto_min_us, za pomocą którego można ustawić minimalny czas oczekiwania na retransmisję (retransmission timeout) dla gniazd TCP.
    • W narzędziu ethtool dodano możliwość precyzyjnego dostosowania konfiguracji obsługi przerwań dla interfejsów sieciowych korzystających z interfejsu Net DIM.
  • Sprzęt
    • W sterowniku AMDGPU włączono początkowe wsparcie dla GPU AMD RDNA4 („GFX12”). Dodano obsługę technologii DCN 4.0.x, GC 12.0, GMC 12.0, SDMA 7.0, MES12 oraz MMHUB 4.1.
    • W kontynuowanej pracy nad sterownikiem drm (Direct Rendering Manager) Xe dla GPU opartych na architekturze Intel Xe, wykorzystywanych w kartach graficznych Intel rodziny Arc oraz w zintegrowanej grafice, począwszy od procesorów Tiger Lake, poprawiono wsparcie dla GPU opartych na mikroarchitekturach Battlemage, Arrow Lake i Lunar Lake.
    • W podsystemie DRM (Direct Rendering Manager) przepisano obsługę parametrów EDID (Extended Display Identification Data) dostarczanych przez monitor.
    • W sterowniku i915 dodano wsparcie dla GPU Battlemage Xe2 oraz włączono domyślny tryb CMRR (Content Match Refresh Rate).
    • W sterowniku DRM msm (GPU Qualcomm Adreno) dodano wsparcie dla platformy SM7150 oraz GPU X185 i a505.
    • Dodano wsparcie dla paneli ekranowych Lincoln Tech Sol LCD185-101CT, Microtips Technology 13-101HIEBCAF0-C, Microtips Technology MF-103HIEB0GA0, BOE nv110wum-l60, IVO t109nw41, WL-355608-A8, PrimeView PM070WL4, Lincoln Technologies LCD197, Ortustech COM35H3P70ULC, AUO G104STN01, K&d kd101ne3-40ti.
    • W podsystemie dźwiękowym dodano wsparcie dla układów i kodeków Intel Panther Lake, Asahi Kasei AK4619, Cirrus Logic CS530x, Everest Semiconductors ES8311, NXP i.MX95, LPC32xx, Qualcomm LPASS v2.5, WCD937x, Realtek RT1318, RT1320 i Texas Instruments PCM5242.
    • Wprowadzono końcową serię zmian, które zapewniają wsparcie dla ARM SoC Snapdragon X Elite, w którym używany jest własny 12-rdzeniowy CPU Qualcomm Oryon oraz GPU Qualcomm Adreno. Chip jest skierowany do zastosowania w laptopach i PC, przewyższając w wielu testach wydajności chipy Apple M3 oraz Intel Core Ultra 155H. Zmiany wprowadzone w jądrze 6.11 związane są z obsługą GPU Adreno X1-85 oraz zarządzaniem zużyciem energii. Z urządzeń opartych na SoC Snapdragon X Elite zgłoszono wsparcie dla laptopów ASUS Vivobook S15 oraz Lenovo Yoga Slim7x.

Równocześnie latynoamerykańska Fundacja Wolnego Oprogramowania stworzyła wariant całkowicie wolnego jądra 6.11 — Linux-libre 6.10-gnu, oczyszczonego z elementów firmware'u i sterowników, które zawierają zamknięte komponenty lub fragmenty kodu, których użycie jest ograniczone przez producenta. W wydaniu 6.11 zaktualizowano kod usuwania blobów w sterownikach mdgpu, adreno, vgxy61, atomisp, btnxpuart, prueth i tas2781. Przeprowadzono oczyszczenie nowych sterowników amdgpu isp, tn40, rtl8192du, cs40l50, rt1320 i pcie-rcar-gen4. Wykonano czyszczenie nazw blobów w plikach dts (devicetree) dla architektury Aarch64. Dodano wersję prymitywów do ładowania firmware'u, która nie generuje ostrzeżeń ani zapytań (nowait-nowarn). Dodano kod do identyfikacji prymitywów ładowania firmware'u w kodzie w języku Rust.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster