Wydanie jądra Linux 6.8

Po dwóch miesiącach prac Linus Torvalds zaprezentował wydanie jądra Linux 6.8. Wśród najważniejszych zmian znajdują się: sterownik Xe dla GPU Intel, tryb ochrony urządzeń blokowych z zamontowanymi systemami plików, mechanizm harmonogramu zadań Deadline server, automatyczna optymalizacja łączenia identycznych stron pamięci, pierwszy sterownik w języku Rust, wywołania systemowe listmount i statmount, usunięcie bpfilter i SLAB, mechanizm guest_memfd w KVM oraz profilowanie dostępu do danych.

Nowa wersja zawiera 15641 poprawek od 2018 programistów, rozmiar łatki wynosi 44 MB (zmiany dotyczyły 12212 plików, dodano 663864 linijek kodu, usunięto 339094 linijki). W poprzednim wydaniu było 18405 poprawek od 2066 programistów, a rozmiar łatki wynosił 72 MB. Około 42% wszystkich przedstawionych w 6.8 zmian dotyczy sterowników urządzeń, około 15% zmian jest związanych z aktualizacjami kodu specyficznego dla architektur sprzętowych, 14% dotyczy stosu sieciowego, 6% - systemów plików, a 3% z wewnętrznych podsystemów jądra.

W repozytorium Git z jądrem 6.8 znajduje się 9,996 mln obiektów, co wskazuje, że następne jądro 6.9 przekroczy symboliczny próg 10 mln obiektów git. W przeszłości zmiana numerów gałęzi 3.x i 4.x dobrze korelowała z liczbą obiektów git w repozytorium — jądro 3.0 zostało wydane, gdy w repozytorium znajdowało się około 2 mln obiektów, a jądro 4.0 — 4 mln obiektów. W 2019 roku wydanie 5.0 przerwało tę logiczną sekwencję, ponieważ w momencie jego formowania repozytorium zawierało około 6,5 mln obiektów git.

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

  • Podsystem dyskowy, wejście/wyjście i systemy plików
    • Dodano tryb blokowania bezpośredniego zapisu na urządzenia blokowe, na których znajdują się zamontowane systemy plików (po włączeniu trybu użytkownik root nie będzie mógł wprowadzać zmian w systemie plików poprzez manipulacje na poziomie urządzenia blokowego). Domyślnie tryb jest wyłączony i wymaga określenia parametru BLK_DEV_WRITE_MOUNTED podczas kompilacji. Dla partycji z Btrfs blokada na razie nie działa, ponieważ w kodzie Btrfs jeszcze nie przyjęto niezbędnych zmian.
    • Dodano wywołania systemowe listmount() i statmount(), które pozwalają z przestrzeni użytkownika uzyskać szczegółowe informacje o zamontowanych systemach plików.
    • W systemie plików XFS kontynuowane są prace nad implementacją możliwości użycia narzędzia fsck do sprawdzania i naprawy wykrytych problemów w trybie online, bez odmontowywania systemu plików.
    • W Ext4 dla bloków o rozmiarze mniejszym niż strona pamięci wdrożono wywołanie dioread_nolock, które pozwala zwiększyć wydajność dzięki eliminacji zbędnych blokad. Niektóre funkcje zostały przetłumaczone na użycie foliantów stron pamięci (page folios).
    • W Btrfs dodano obsługę flagi montowania „nospace_cache”, aby wyłączyć pamięć podręczną wolnych bloków. Niektóre funkcje zostały przetłumaczone na użycie foliantów stron pamięci (page folios).
    • W systemie plików EROFS (Extendable Read-Only File System), przeznaczonym do użytku na partycjach dostępnych tylko w trybie do odczytu, dodano wsparcie dla kompresji podstron oraz poprawiono działanie w sytuacji braku pamięci.
    • W systemie plików F2FS poprawiono wsparcie dla urządzeń pamięci masowej z podziałem na strefy (podział na strefy grup bloków lub sektorów, w które dozwolone jest jedynie sekwencyjne dodawanie danych z aktualizacją całej grupy bloków).
    • Dla systemu plików SMB wdrożono możliwość tworzenia blokowych i symbolicznych plików urządzeń.
    • W Bcachefs dodano częściową obsługę sprawdzania i przywracania integralności zamontowanych systemów plików.
    • W podsystemie device-mapper zakończono wsparcie dla obsługi MD_LINEAR, MD_MULTIPATH i MD_FAULTY, które zostały uznane za przestarzałe w 2021 roku.
  • Pamięć i usługi systemowe
    • W podsystemie Zswap dodano funkcję aktywowaną w przypadku braku pamięci, umożliwiającą wymuszoną wymianę „zimnych” stron pamięci do rzeczywistej partycji swap, do których nie było odwołań i które prawdopodobnie pozostaną nieużywane. Zswap wykonuje buforowanie wypychanych stron do partycji swap, przechowując je w pamięci operacyjnej w skompresowanej formie, starając się uniknąć zapisu do rzeczywistej nieskompresowanej partycji swap na dysku. Wprowadzone zmiany w sytuacji braku pamięci pozwalają zmniejszyć rozmiar przechowywanego w RAMie zbioru Zswap i zwolnić pamięć dla systemu.
    • W Zswap zaproponowano nowy tryb, który całkowicie wyłącza opóźnione zapisywanie (writeback) do rzeczywistej partycji swap, jeśli próba zapisu zakończyła się niepowodzeniem, i nie zapisuje już istniejących w zbiorze Zswap stron do partycji swap.
    • Do planera zadań dodano mechanizm SCHED_DEADLINE serwera, który rozwiązuje problem braku możliwości przydzielania zasobów CPU przez zwykłe zadania w warunkach monopolizacji CPU przez zadania wysokiego priorytetu (realtime). Aby zapobiec monopolizacji CPU w jądrze wcześniej stosowano mechanizm Realtime throttling, który próbował zarezerwować 5% dla zadań niskiego priorytetu, pozostawiając 95% czasu dla zadań realtime. Mechanizm ten pozostawiał wiele do życzenia, ponieważ zwykłe zadania w wielu sytuacjach nie otrzymywały wystarczającej ilości czasu CPU. SCHED_DEADLINE server wprowadza bardziej efektywny mechanizm rezerwacji zasobów.
    • Do subsystemu DAMON (Data Access MONitor), który pozwala na śledzenie dostępu procesów do danych w pamięci operacyjnej (na przykład można dowiedzieć się, do jakich obszarów pamięci odwoływał się proces, a które obszary pamięci pozostały nieużywane), dodano mechanizm automatycznej regulacji agresywności zużycia pamięci na podstawie ustalonych kwot.
    • Dodano wsparcie dla wielkoformatowych stron pamięci (mTHP — multi-size Transparent Huge Pages), umożliwiające przydzielanie pamięci w blokach o rozmiarze większym niż standardowa strona, ale mniejszym niż tradycyjna strona THP.
    • Dodano wsparcie dla dużych foliantów (page folios, połączone strony pamięci) dla pamięci anonimowej (nieprzypisanej do systemu plików, na przykład przydzielonej za pomocą malloc). Zmiana ma na celu poprawę wydajności poprzez przydzielanie większych fragmentów pamięci podczas dostępu do nieprzydzielonych stron pamięci (page faults). Na przykład, użycie dużych foliantów pozwoliło na 5% skrócenie czasu rekompilacji jądra (przy zmniejszeniu czasu spędzonego na poziomie jądra o 40%).
    • Do pliku konfiguracyjnego jądra dodano parametr TRANSPARENT_HUGEPAGE_NEVER, który umożliwia wyłączenie użycia dużych stron pamięci (Transparent Huge Pages).
    • Do wywołania systemowego userfaultfd(), które umożliwia tworzenie handlerów dla nieprzydzielonych stron pamięci (page faults) w przestrzeni użytkownika, dodano operację UFFDIO_MOVE, która pozwala na przenoszenie stron pamięci w wirtualnej przestrzeni adresowej podczas kompresji sterty (heap compaction) bez konieczności wykonywania operacji przydzielania stron pamięci. W przeprowadzonych testach zastosowanie UFFDIO_MOVE pozwoliło na 40% redukcję czasu kompresji w porównaniu do użycia operacji UFFDIO_COPY.
    • Dodano narzędzie „KSM advisor”, które automatycznie optymalizuje parametry systemu scalania identycznych stron pamięci (KSM — Kernel Samepage Merging).
    • Kontynuowano przenoszenie zmian z gałęzi Rust-for-Linux, związanych z wykorzystaniem języka Rust jako drugiego języka do opracowywania sterowników i modułów jądra (wsparcie dla Rust nie jest domyślnie aktywne i nie powoduje włączenia Rust do zestawu obowiązkowych zależności do budowy jądra). W nowej wersji włączono zmiany, które dodają interfejs Rust nad poziomem abstrahencji phylib i korzystają z tego interfejsu sterownik ax88796b_rust, zapewniający wsparcie dla interfejsu PHY kontrolera Ethernet Asix AX88772A (100MBit). Funkcjonalnie sterownik na Rust jest całkowicie równoważny starym sterownikom ax88796b napisanym w języku C i może być używany z kartami sieciowymi X-Surf 100 z chipem AX88796B. Dla architektury LoongArch wprowadzono możliwość pisania modułów w języku Rust. Zrealizowano przesiadkę na wersję Rust 1.74.1.
    • Dodano mechanizm tokenów BPF, który pozwala na selektywne delegowanie przetwarzania poszczególnych możliwości BPF, takich jak ładowanie programu BPF czy tworzenie mapy BPF, do nieuprzywilejowanych procesów w przestrzeni użytkownika, które zostały potwierdzone specjalnym tokenem.
    • Rozszerzono funkcjonalność weryfikatora programów BPF.
    • Do narzędzia perf dodano wsparcie dla profilowania danych, umożliwiające śledzenie operacji odczytu i zapisu w strukturach danych, na przykład w celu zidentyfikowania najbardziej aktywnie modyfikowanych pól w strukturach. Na systemach z procesorami obsługującymi zbieranie informacji o operacjach z pamięcią (Intel, AMD, ARM) do gromadzenia statystyk należy użyć polecenia „perf mem record”, a do wyświetlania raportu o dostępie do struktur danych — „perf annotate —data-type”.
    • Przeprowadzono optymalizację wydajności przetwarzania systemowych wywołań na architekturze s390 (IBM Z), co w testach spowodowało przyspieszenie wejścia w wywołanie systemowe o około 11%.
    • Umożliwiono zmianę rozmiaru buforów śledzenia, stosowanych do buforowania informacji o zdarzeniach śledzenia przekazywanych do przestrzeni użytkownika.
    • Usunięty wcześniej ogłoszony jako przestarzały mechanizm przydzielania pamięci SLAB, którego miejsce w jądrze zajmuje teraz tylko SLUB. Podano jako przyczynę problemy z utrzymywaniem, występowanie błędów w kodzie i duplikację funkcjonalności z bardziej zaawansowanym alokatorze SLUB.
    • Podczas kompilacji jądra włączono flagę „-Wmissing-prototypes”, która generuje ostrzeżenia dla wywołań globalnych funkcji, które nie mają zdefiniowanego prototypu.
    • Dla architektury RISC-V na systemach z obsługą rozszerzenia SUSP SBI wdrożono obsługę przejścia w tryb uśpienia z zachowaniem stanu w pamięci RAM. Udostępniono możliwość użycia wywołania systemowego riscv_hwprobe() w celu uzyskania informacji o obsługiwanych rozszerzeniach architektury zestawu rozkazów RISC-V.
  • Wirtualizacja i bezpieczeństwo
    • Dodano nowe wywołania systemowe lsm_list_modules(), lsm_get_self_attr() oraz lsm_set_self_attr() do wyświetlania listy załadowanych modułów LSM (Linux Security Modules) i uzyskiwania/ustawiania atrybutów modułu LSM. Dodano nową strukturę lsm_ctx do komunikacji w kontekście LSM między przestrzenią użytkownika a jądrem.
    • Podsystem AppArmor przeszedł na użycie algorytmu SHA-256 do weryfikacji reguł, zamiast używać skrótów SHA-1.
    • Z jądra usunięto implementację funkcji strlcpy(), która latem została dołączona do biblioteki C Glibc 3.38. Strlcpy jest alternatywą dla funkcji strncpy(), zapewniającą ochronę przed przepełnieniem bufora i zawsze dodającą zerowy bajt końca łańcucha.
    • W hipernadzorze KVM Dodano obsługę podsystemu guest_memfd (pamięć pierwszego gościa), który oferuje funkcje zarządzania pamięcią umożliwiające realizację możliwości i optymalizacji, niedostępnych przy użyciu wspólnego podsystemu zarządzania pamięcią. Na przykład, guest_memfd umożliwia przydzielenie i odzwierciedlenie w systemie gościu obszaru pamięci, niedostępnego dla środowiska hosta, co może być wykorzystywane do organizacji obliczeń poufnych.
    • Dla systemów gości działających pod kontrolą hypervisora KVM włączono wsparcie dla trybu LAM (Linear Address Masking) oferowanego w procesorach Intel, który pozwala wykorzystać część bitów 64-bitowych wskaźników (od 57 do 62 bitów) do przechowywania metadanych niezwiązanych z adresowaniem.
    • W hipernadzorze KVM dla systemów opartych na architekturze ARM64 dodano wsparcie dla 52-bitowych (LPA2) adresów fizycznych. Dla systemów z architekturą x86 udostępniono możliwość kompilacji bez emulacji hiperwywołań Hyper-V, co pozwala na zmniejszenie rozmiaru jądra.
    • Dodano sterownik iaa (IAA Compression Accelerator) w celu przyspieszenia operacji kompresji i dekompresji danych metodą DEFLATE, wykorzystując możliwości kryptograficznych przyspieszaczy Intel Analytics Accelerator (IAA).
    • Po stronie środowiska hosta wprowadzono wsparcie dla mechanizmu Intel TDX (Trusted Domain Extensions), który przy użyciu hipernadzoru KVM pozwala na tworzenie zabezpieczonych środowisk gościnnych, w których używane jest szyfrowanie pamięci. maszyn wirtualnych.
    • W SELinux dodano identyfikator SID „init”, który pozwala na wyróżnienie procesów uruchamianych na etapie bootowania, przed zastosowaniem polityk SELinux. Udoskonalono interfejs /sys/fs/selinux do zarządzania SELinux.
  • Subsystem sieciowy
    • Przeprowadzono niskopoziomową reorganizację podstawowych struktur danych sieciowych w celu zwiększenia efektywności buforowania. Wcześniej pola w strukturach stosu sieciowego socks, netdev, netns oraz mibs były rozmieszczane w miarę dodawania, co ograniczało wykorzystanie pamięci podręcznej procesora. Przeorganizowanie rozmieszczenia zmiennych w strukturach doprowadziło do zauważalnego zwiększenia prędkości działania TCP, dzięki minimalizacji wykorzystania linii pamięci podręcznej na etapie przesyłania danych oraz optymalizacji dostępu do zmiennych. W przypadku przetwarzania wielu równoległych połączeń TCP przyspieszenie może wynosić do 40%.
    • Usunięto podsystem bpfilter, który wykorzystywał BPF do filtrowania pakietów. Bpfilter wprowadzono od wersji 4.18, ale nigdy nie został doprowadzony do poziomu odpowiedniego do szerokiego użytku. W ostatnich latach kod bpfilter w jądrze nie rozwijał się, a rozwój kontynuowała firma Facebook w oddzielnym repozytorium.
  • Sprzęt
    • Nowy sterownik DRM (Direct Rendering Manager) Xe dla GPU opartych na architekturze Intel Xe, wykorzystywanych w kartach graficznych Intel z serii Arc oraz zintegrowanej grafice, od procesorów Tiger Lake. Sterownik Xe jest przedstawiany jako fundament do obsługi nowych chipów, niezwiązany z kodem dla wsparcia starszych platform. Zbudowano go z wykorzystaniem nowej architektury, w której bardziej aktywnie wykorzystano istniejące komponenty systemu DRM oraz standardowe elementy sterownika i915, niezwiązane z konkretnymi GPU, na przykład kod do interakcji z ekranami, model pamięci oraz realizację execbuf. W Mesa obsługa OpenGL i Vulkan nad sterownikiem Xe została zrealizowana na poziomie zmian w istniejących sterownikach Mesa Iris i ANV.
    • W sterowniku i915 kontynuowana jest praca nad wsparciem chipów Intel LunarLake (Xe 2). Ulepszono wsparcie dla chipów Intel Meteor Lake.
    • W sterowniku Nouveau wdrożono domyślne ustawienia dla korzystania z funkcji firmware GSP do obsługi GPU NVIDIA opartych na mikroarchitekturach Turing i Ampere, gdzie operacje inicjalizacji i kontroli GPU są realizowane przez osobny mikrokontroler GSP (GPU System Processor). Po włączeniu tego ustawienia, sterownik będzie działał poprzez odwołanie do firmware, zamiast bezpośredniego programowania operacji interakcji z sprzętem.
    • W sterowniku AMDGPU wdrożono wsparcie ACPI WBRF oraz VPE DPM, zmieniono obsługę prędkości kanału PCIe, w używanych do synchronizacji kolejkach zaangażowano 64-bitowe numery sekwencyjne, dodano wsparcie dla specyficznych dla AMD mechanizmów zarządzania kolorami oraz rozwiązano problem z przejściem w tryb uśpienia.
    • Dodano wstępną implementację sterownika dla GPU Broadcom VideoCore 7.1, wykorzystywanego w płytach Raspberry Pi 5.
    • Dodano sterownik dla GPU serii PowerVR 6 opartych na mikroarchitekturze Rogue firmy Imagination Technologies.
    • Dodano wsparcie dla kontrolerów Thunderbolt/USB4 zintegrowanych w chipach opartych na mikroarchitekturze Intel Lunar Lake.
    • Dodano sterowniki dla kamer używanych w SoC Starfive, GalaxyCore GC2145/GC0308, Chips&Media Wave oraz THine THP7312.
    • Dodano wsparcie dla kontrolerów gier NSO (Nintendo Switch Online) — wersje starych kontrolerów od SNES (Super Nintendo), Genesis i N64 (Nintendo 64), przystosowane dla Nintendo Switch. Dodano sterownik dla padów Adafruit Seesaw. W sterowniku xpad dodano wsparcie dla kontrolerów Lenovo Legion Go.
    • W sterowniku dts dodano wsparcie dla urządzeń gamingowych Powkiddy RK2023, Powkiddy X55 i Anbernic RG351V.
    • Dodano wsparcie dla systemów dźwiękowych używanych w chipach NXP i.MX8m MICFIL, Qualcomm SM8250, AMD ACP5x, Intel Arrow Lake, SM8550, SM8650 i X1E80100.
    • Firma AMD wprowadziła zmiany związane z wsparciem przyszłej serii procesorów opartych na nowej mikroarchitekturze Zen 5.
    • Dodano wsparcie dla SoC ARM64: Qualcomm SM8650 (Snapdragon 8 Gen 3), Qualcomm X1E80100 (Snapdragon X Elite), Samsung Exynos Auto v920, Google GS101 (Tensor G1), MediaTek MT8188 oraz Unisoc UMS9620 (Tanggula 7).
    • Dodano wsparcie dla platform i urządzeń ARM: Huashan Pi, Microsoft Lumia, HTC One Mini 2, Motorola MotoG 4G, Huawei Honor 5X/GR5, Anbernic RG351V, Powkiddy RK2023, Powkiddy X55, ComXpress oparte na Marvell CN913x, Chromebook Lenovo, Asus i Acer oparte na Mediatek MT8183, Toradex Verdin AM62 oraz płyty oparte na Allwinner H616/H618.
    • Zaprzestano wsparcia dla procesorów ARM11 ARMv6K SMP.

Jednocześnie latynoamerykańska Fundacja Wolnego Oprogramowania stworzyła wersję w pełni wolnego jądra 6.8 — Linux-libre 6.8-gnu, oczyszczoną z elementów firmware i sterowników, zawierających niestrukturalne komponenty lub fragmenty kodu, których zastosowanie jest ograniczone przez producenta. W wydaniu 6.8 zaktualizowano kod oczyszczania blobów w różnych sterownikach i podsystemach. Przeprowadzono czyszczenie sterowników Intel qat_420xx, Imagination PowerVR, Intel Xe, Chips&Media Wave5, Intel VSC, Aquantia PHY oraz Realtek rtw8922a. W związku z usunięciem z jądra zaprzestano czyszczenia sterowników atmel, hermes, orinoco_usb, libertas_cs oraz zd1201. Przeprowadzono czyszczenie nazw blobów w plikach dts (devicetree) dla architektur ARM i Aarch64. Usunięto problemy z czyszczeniem sterownika i915.

Ź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