Wydanie jądra Linux 6.12 z obsługą trybu czasu rzeczywistego

Po dwóch miesiącach prac Linus Torvalds zaprezentował wydanie jądra Linux 6.12. Wśród najbardziej znaczących zmian znajdują się: możliwość włączenia trybu czasu rzeczywistego, sched_ext do tworzenia planistów CPU za pośrednictwem eBPF, generowanie kodu QR w stanach awaryjnych, mechanizm pamięci urządzenia TCP, mechanizm rezerwacji zasobów SCHED_DEADLINE, poprawa planisty zadań EEVDF oraz moduł IPE do ustalania polityk zapewnienia integralności.

Nowa wersja przyjęła 14607 poprawek od 2167 programistów, rozmiar łaty wynosi 37 MB (zmiany dotyczyły 13087 plików, dodano 507913 linii kodu, usunięto 234083 linie). W poprzednim wydaniu przyjęto 15130 poprawek od 2078 programistów, rozmiar łaty wynosił 85 MB (w jądrze 6.10 łata miała rozmiar 41 MB). Około 45% wszystkich zmian w wersji 6.12 dotyczy sterowników urządzeń, około 12% zmian odnosi się do aktualizacji kodu specyficznego dla architektur sprzętowych, 13% dotyczy stosu sieciowego, 6% — systemów plików, a 3% z wewnętrznych systemów jądra.

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

  • Pamięć i usługi systemowe
    • Udostępniono możliwość kompilacji jądra z opcją PREEMPT_RT bez dodatkowych łat w celu pracy w trybie czasu rzeczywistego. Ostatnią brakującą funkcją, która uniemożliwiała aktywację trybu PREEMPT_RT, była obsługa nieblokującego atomowego wyjścia przez funkcję printk, która również została przyjęta do jądra. Obsługa PREEMPT_RT jest dostępna dla architektur x86, x86_64, ARM64 i RISC-V. Do tej pory implementacja trybu PREEMPT_RT była dostarczana w formie zewnętrznych łat, na podstawie których niektóre dystrybucje, takie jak RHEL, SUSE i Ubuntu, tworzyły osobne edycje czasu rzeczywistego swoich produktów, poszukiwane w takich dziedzinach jak systemy finansowe, urządzenia do przetwarzania dźwięku i wideo, lotnictwo, medycyna, robotyka, telekomunikacyjne i przemysłowe systemy, w których konieczne jest zapewnienie przewidywalnego czasu przetwarzania zdarzeń.
    • Dodano mechanizm «sched_ext» (SCX), który umożliwia użycie eBPF do tworzenia planistów CPU obejmujących praktycznie wszystkie aspekty planowania wykonywania zadań i rozdzielania zasobów CPU. Takie planistowie mogą być ładowani dynamicznie i działać w jądrze Linux. maszynie wirtualnej eBPF. Mechanizm sched_ext ułatwia tworzenie specyficznych dla określonych zadań planistów, umożliwia eksperymentowanie z różnymi technikami i strategiami planowania oraz pozwala na szybkie tworzenie działających prototypów i wymianę planistów w infrastrukturach roboczych. Na przykład, przy użyciu sched_ext można stworzyć planistę uwzględniającego specyfikę danego aplikacji i dynamicznie zmieniającego strategię planowania w zależności od stanu systemu i dodatkowych czynników.
    • W skład wchodzi pozostała część łatek wymaganych do działania mechanizmu SCHED_DEADLINE server, który rozwiązuje problem niedostatecznego otrzymywania zasobów CPU przez zwykłe zadania w warunkach monopolizacji CPU przez zadania o wysokim priorytecie (realtime). Aby zapobiec monopolizacji CPU, w jądrze wcześniej używano mechanizmu Realtime throttling, który próbował zarezerwować 5% dla zadań niskoprioritytowych, pozostawiając 95% czasu zadaniom realtime. Mechanizm ten pozostawiał wiele do życzenia, ponieważ zwykłe zadania w wielu sytuacjach nie otrzymywały wystarczającej ilości czasu procesora. SCHED_DEADLINE server realizuje bardziej efektywny mechanizm rezerwacji zasobów.
    • Zakończono integrację planisty zadań EEVDF (Earliest Eligible Virtual Deadline First), który zastąpił planistę CFS (Completely Fair Scheduler) dostarczanego od jądra 2.6.23. Nowy planista przy wyborze następnego procesu do przekazania wykonania uwzględnia procesy, które nie otrzymały wystarczających zasobów procesora lub otrzymały niesłusznie dużo czasu procesora. W pierwszym przypadku wymusza przekazanie kontroli procesowi, a w drugim, przeciwnie, odkłada je. Stary planista CFS używał heurystyki i drobnych dostosowań do określenia procesów wymagających szczególnej uwagi, podczas gdy nowy planista śledzi je bardziej bezpośrednio i nie wymaga drobnych dostosowań. Zakłada się, że EEVDF pozwoli na zmniejszenie opóźnień przy realizacji zadań, z którymi CFS miało problemy z planowaniem.
    • W obsłudze awarii w jądrze — DRM Panic, korzystającym z podsystemu DRM (Direct Rendering Manager) do wyświetlania wizualnego raportu w stylu „niebieskiego ekranu śmierci”, dodano możliwość wyświetlania na ekranie logo oraz kodu QR z raportem kmsg w przypadku wystąpienia awarii. Ponieważ w kodzie QR mieści się tylko 2953 bajty, wprowadzono opcję DRM_PANIC_SCREEN_QR_CODE_URL, w której raport kmsg jest kompresowany za pomocą zlib i dołączany jako parametr do URL, co pozwala na przesłanie przez kod QR V40 około 7500 bajtów. Podczas budowy pakietów z jądrem dystrybucje mogą ustawić bazowy link dla URL, co umożliwi przejście na stronę do zgłoszenia problemu. Aby wybrać format kodu QR, wprowadzono ustawienie DRM_PANIC_SCREEN_QR_VERSION.
    • Dodano wsparcie dla rozszerzenia ARM POE (Permission Overlay Extension), które pozwala na definiowanie uprawnień dostępu do obszarów pamięci. Dzięki temu rozszerzeniu w systemach z procesorami ARM64 można zrealizować mechanizm Memory Protection Keys, stosowany do ograniczania dostępu do stron pamięci bez konieczności zmiany tabeli stron pamięci.
    • Dla architektur Loongarch, ARM64, PowerPC i s390 przeniesiono realizację wywołania systemowego getrandom(), optymalizując ją za pomocą mechanizmu vDSO (virtual dynamic shared object), który pozwala na przeniesienie obsługi wywołania systemowego z jądra do przestrzeni użytkownika, unikając przełączeń kontekstu. Optymalizacja ta pozwala przyspieszyć uzyskiwanie losowych liczb do 15 razy.
    • Do podsystemu asynchronicznego wejścia/wyjścia io_uring dodano możliwość używania absolutnych timeoutów, które uruchamiają się po osiągnięciu określonego czasu w systemowych zegarach (wcześniej można było ustawiać tylko względne timeouty, w których określano czas trwania od początku operacji).
    • Dodano pliki do generowania wiązań dla biblioteki libcpupower przy użyciu narzędzi SWIG, które pozwalają na tworzenie wiązań z kodu w C/C++ dla różnych języków programowania. Wiązania te umożliwiają tworzenie skryptów w Pythonie i innych językach oraz ich wykorzystanie do rozszerzenia funkcjonalności biblioteki libcpupower, która udostępnia API do zarządzania cpufreq i sterownikami z przestrzeni użytkownika.
    • W narzędziu cpuidle zaimplementowano wyświetlanie wartości stanu bezczynności „residency”, stosowanej w systemach czasu rzeczywistego i uwzględniającej minimalny czas, w którym procesor musi być w stanie bezczynności, aby uzasadnić koszty energii związane z przejściem do tego stanu i wyjściem z niego.
    • Dodano możliwość korzystania z kompilatora Clang do budowy standardowej biblioteki C nolibc, wchodzącej w skład źródeł jądra Linux, która zapewnia interfejs do podstawowych wywołań systemowych. Podczas budowania nolibc w Clang dopuszcza się wykorzystanie optymalizacji na etapie łączenia (LTO).
    • Niektóre interfejsy cgroup1, takie jak rozliczanie TCP, pierwsza wersja miękkich limitów (soft limit) oraz zarządzanie wyczerpywaniem pamięci, zostały uznane za przestarzałe. Wsparcie dla tych funkcji wciąż pozostaje w pełnym zakresie, a ostrzeżenie zostało wydane w celu zbadania liczby użytkowników, którzy nadal korzystają z tych możliwości.
    • Dodano możliwość konfigurowania pierścieniowego bufora śledzenia w celu przechowywania zgromadzonych danych po ponownym uruchomieniu, co pozwoli na nieutracenie zgromadzonych informacji debugujących w przypadku awaryjnego zakończenia pracy jądra. Dane są przechowywane w pamięci. Włączenie realizowane jest poprzez parametr wiersza poleceń jądra trace_instance, na przykład ustawienie „trace_instance=boot_map@0x285400000:12M” zarezerwuje 12 MB pamięci pod adresem 0x285400000 dla bufora „boot_map”, który będzie dostępny przez plik /sys/kernel/tracing/instances/boot_map.
    • Kontynuowane są prace nad przeniesieniem zmian z gałęzi Rust-for-Linux, związanych z używaniem 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 prowadzi do włączenia Rust do obowiązkowych zależności kompilacji jądra). Dodano moduły ‘list’ i ‘rbtree’ do pracy z dwukierunkowymi listami powiązanymi oraz drzewami czerwono-czarnymi. Rozszerzono możliwości modułów ‘init’, ‘sync’, ‘types’ i ‘error’. Umożliwiono korzystanie z kodu w języku Rust podczas kompilacji jądra z zabezpieczeniami przed atakami Spectre (opcje MITIGATION_{RETHUNK, RETPOLINE, SLS}), wykorzystaniem systemu debugowania KASAN, mechanizmu ochrony kCFI (kernel Control Flow Integrity) i Shadow Call, a także przy korzystaniu z dodatkowych wtyczek GCC. Dodano sterownik dla kontrolera Ethernet Applied Micro QT2025 PHY, napisanego w języku Rust. Przygotowano osobną stronę z dokumentacją — rust.docs.kernel.org.
    • W skład źródeł jądra dodano narzędzie xdrgen do konwersji specyfikacji XDR (eXternal Data Representation) na funkcje kodowania i dekodowania XDR napisane w stylu C akceptowanym w jądrze Linux.
    • Do jądra wprowadzono zmianę z realizacją mechanizmu maskowania wskaźników w celu zredukowania liczby wolnych wywołań barrier_nospec() w 64-bitowej funkcji copy_from_user(), wykorzystywanej do kopiowania danych z przestrzeni użytkownika do jądra. Zastosowanie maskowania przyspiesza przebieg testu «per_thread_ops» o 2,6%, oceniającego liczbę operacji, które mogą być wykonane w jednym wątku.
    • Dodano nowy sterownik USB, umożliwiający stosowanie protokołu 9pfs jako transportu do przesyłania i odbierania danych z urządzenia USB, podczas montowania systemu plików 9p na USB (na przykład, «mount -t 9p -o trans=usbg,aname=\/path\/to\/fs \/mnt\/9»). Jako przykład zastosowania nowego sterownika podano użycie zamiast NFS do organizacji załadunku partycji głównej przy opracowywaniu urządzeń wbudowanych.
  • Podsystem dyskowy, wejście/wyjście i systemy plików
    • W podsystemie VFS dodano możliwość pracy z urządzeniami pamięci masowej, których rozmiar bloków jest większy niż rozmiar strony pamięci w systemie. W systemach plików, ta możliwość jest obecnie wspierana tylko w XFS.
    • Do podsystemy FUSE, umożliwiającej tworzenie implementacji systemów plików działających w przestrzeni użytkownika, dodano wsparcie dla mapowania identyfikatorów użytkowników zamontowanych systemów plików, stosowanego do kojarzenia plików określonego użytkownika na zamontowanej obcej partycji z innym użytkownikiem w bieżącym systemie.
    • Zrealizowano nową operację fcntl F_CREATED_QUERY, umożliwiającą aplikacji określenie, czy plik otwarty z flagą O_CREAT został stworzony, czy istniał wcześniej.
    • Do wywołania systemowego name_to_handle_at() dodano możliwość użycia unikalnych 64-bitowych identyfikatorów punktów montowania w celu uniknięcia warunków wyścigu podczas analizy /proc/mountinfo.
    • Rozmiar struktury „file” w jądrze został zmniejszony z 232 do 184 bajtów, co pozwala na zmniejszenie zużycia pamięci w systemach intensywnie pracujących z plikami.
    • Zabroniono montowania systemów plików do punktów montowania wewnątrz hierarchii /proc, na przykład w /proc/PID/fd, co stwarzało potencjalne problemy z bezpieczeństwem.
    • W pseudo-FS NSFS (NameSpace FS), używanym do pracy z przestrzeniami nazw, wprowadzono dodatkowe informacje o przestrzeniach nazw punktów montowania.
    • W systemie plików EROFS (Extendable Read-Only File System), przeznaczonym do użytku na partycjach dostępnych w trybie tylko do odczytu, dodano wsparcie dla montowania systemów plików bezpośrednio z obrazów dysków przechowywanych w postaci plików.
    • W XFS dodano nowe polecenia ioctl XFS_IOC_START_COMMIT i XFS_IOC_COMMIT_RANGE do wymiany zawartości między dwoma plikami.
    • W NFS dodano wsparcie protokołu «LOCALIO», który umożliwia ustalenie, czy klient i serwer NFS znajdują się na tym samym hoście, aby wykorzystać odpowiednie optymalizacje.
    • W systemie plików Btrfs proponowane są optymalizacje wydajności, przeprowadzono refaktoryzację kodu, zmniejszono obszar blokowania extents podczas operacji odczytu, kontynuowano prace nad przejściem na użycie foliów stron pamięci (page folios), wprowadzono automatyczne zwalnianie pamięci dla struktury btrfs_path.
    • W systemie plików Ext4 usunięto błędy związane z alokacją bloków, zarządzaniem extentami, mechanizmem „fast commit” oraz dzienkowaniem.
  • Wirtualizacja i bezpieczeństwo
    • Dodano moduł LSM IPE (Integrity Policy Enforcement), opracowany przez firmę Microsoft w celu rozszerzenia istniejącego systemu mandatywnego zarządzania dostępem. Moduł pozwala określić ogólną politykę zapewnienia integralności dla całego systemu, wskazując, jakie operacje są dozwolone i w jaki sposób należy weryfikować autentyczność składników. Na przykład, za pomocą IPE można wskazać, które pliki wykonywalne można uruchamiać, z uwzględnieniem weryfikacji ich zgodności z wersją odniesienia przy użyciu kryptograficznych haszy dostarczonych przez system dm-verity.
    • Na etapie kompilacji jądra wprowadzono możliwość oddzielnego włączania dostępnych metod ochrony przed różnymi podatnościami klasy Spectre w CPU. W Kconfig zaproponowano nowe opcje: MITIGATE_MDS (ochrona przed podatnością Microarchitectural Data Sampling), MITIGATE_TAA (ochrona przed podatnością TSX Asynchronous Abort), MITIGATE_MMIO_STALE_DATA (ochrona przed podatnością MMIO Stale Data), MITIGATE_L1TF (ochrona przed podatnością L1 Terminal Fault), MITIGATE_RETBLEED (ochrona przed podatnością Retbleed), MITIGATE_SPECTRE_V1, MITIGATE_SPECTRE_V2 (ochrona przed podatnościami Spectre), MITIGATE_SRBDS (ochrona przed podatnością Special Register Buffer Data Sampling), MITIGATE_SSB (ochrona przed podatnością Speculative Store Bypass).
    • Dodano parametr wiersza poleceń proc_mem.force_override oraz zestaw ustawień kompilacyjnych w Kconfig (PROC_MEM_FORCE_ALWAYS, PROC_MEM_FORCE_PTRACE i PROC_MEM_FORCE_NEVER), które pozwalają zakazać modyfikacji pamięci przez /proc/pid/mem.
    • Podsystem LSM (Linux Security Module) przeszedł na używanie statycznych wywołań, co pozwoliło wzmocnić bezpieczeństwo i zwiększyć wydajność.
    • Zapewniono możliwość korzystania z domyślnych rdzeni dla architektury ARM64 w środowiskach gościnnych działających na systemach Android z zmodyfikowanym hyperwizorem KVM (protected KVM).
    • W module LSM Landlock, pozwalającym na ograniczenie interakcji grupy procesów z otoczeniem, zrealizowano koncepcję «IPC scoping» w celu selektywnego ograniczenia interakcji z środowiskami sandboxowymi, wykorzystując gniazda Unix i sygnały. Na przykład, można zakazać nawiązywania połączeń przy użyciu gniazd Unix z procesami, w których nie stosuje się izolacji, ale zezwolić na połączenia z procesami w tej samej przestrzeni scope.
    • W hyperwizorze KVM w CPUID dla systemów gościnnych dodano flagę, która sygnalizuje o wsparciu rozszerzeń AVX10.1.
  • Subsystem sieciowy
    • Dodano urządzenie pamięci TCP, które umożliwia korzystanie z gniazd sieciowych do bezpośredniego przesyłania zawartości pamięci urządzeń peryferyjnych przez sieć (tryb zero-copy) oraz bezpośrednie umieszczanie zawartości pakietów sieciowych w obszarze pamięci urządzenia po stronie odbiorcy. Przesyłane w pakietach dane są przesyłane z karty sieciowej do pamięci urządzenia peryferyjnego lub z pamięci urządzenia do karty sieciowej bezpośrednio, omijając CPU, a nagłówki pakietów trafiają do zwykłych buforów jądra.
    • Rozszerzone możliwości wielu sterowników Ethernet i bezprzewodowych. Na przykład, w sterowniku Intel iwlwifi dodano wsparcie dla przeniesienia operacji RLC/SMPS na stronę oprogramowania sprzętowego, w sterowniku RealTek rtw89 zwiększono wydajność i dodano wsparcie dla chipów RTL8852BT/8852BE-VT (WiFi 6), w sterowniku Ethernet microchip dodano wsparcie dla specyfikacji IEEE 802.3bw (100BASE-T1) i IEEE 802.3bp, ulepszono implementacje wirtualnych Ethernet Microsoft vNIC i IBM veth. Dodano nowe sterowniki dla chipów Ethernet Realtek RTL9054, RTL9068, RTL9072, RTL9075, RTL9068, RTL9071 oraz Microchip LAN8650/1 10BASE-T1S MAC-PHY.
    • W MPTCP (MultiPath TCP), rozszerzeniu protokołu TCP do organizowania dostarczania pakietów TCP jednocześnie przez wiele tras za pośrednictwem różnych interfejsów sieciowych, rozmiar używanych przy routingu wag został zwiększony z 8 do 16 bitów. Zrealizowano detekcję znikającego (blackhole) ruchu oraz wstrzymanie na pewien czas prób ustanawiania połączeń z systemami, które prowadzą do utraty ruchu.
    • Dla IPv6 zaimplementowano wsparcie dla flagi „p” w PIO (Prefix Information Option), stosowanej w ogłoszeniach RA (IPv6 Router Advertisements) do wyboru modelu wdrażania klientów przez DHCPv6-PD (DHCPv6 Prefix Delegation, RFC9663) zamiast przypisywania osobnych adresów na podstawie prefiksów, korzystając z SLAAC (Stateless Address Autoconfiguration). W IPv6 IOAM6 dodano wsparcie dla nowego trybu enkapsulacji tunsrc, co pozwala osiągnąć wyższą wydajność.
    • Zwiększona wydajność przetwarzania pakietów kontrolnych IPsec.
    • Zwiększona wydajność resetowania (flush) dużych zestawów reguł nftables. W nfnetlink_queue ulepszono wsparcie dla protokołu SCTP.
    • W API ethtool dodano wsparcie dla przypisania wielu kart sieciowych do jednego interfejsu sieciowego.
  • Sprzęt
    • W sterowniku AMDGPU kontynuowane są prace nad implementacją wsparcia dla GPU AMD RDNA4 („GFX12”). Dodano możliwość resetowania pojedynczych kolejek zadań bez resetowania stanu całego GPU.
    • Kontynuowano prace nad sterownikiem drm (Direct Rendering Manager) Xe dla GPU opartych na architekturze Intel Xe, które są używane w kartach graficznych Intel serii Arc oraz w grafice zintegrowanej, zaczynając od procesorów Tiger Lake. Nowa wersja obejmuje wsparcie dla GPU opartych na mikroarchitekturze Battlemage i Lunar Lake. Wprowadzono wsparcie dla modyfikatorów CCS (Color Control Surface) Xe2 do zarządzania parametrami zintegrowanych i dedykowanych GPU.
    • W sterowniku i915 wprowadzono możliwość wyjścia przez interfejs HWMON lub sysfs (atrybut „fan1_input”) informacji o prędkości obrotowej wentylatora. Zmienna „i915.modeset” została oznaczona jako przestarzała, zamiast „i915.modeset=0” należy używać parametru „i915.nomodeset”.
    • W sterowniku DRM msm (GPU Qualcomm Adreno) dodano wsparcie dla GPU A615, A306 oraz A621.
    • W sterowniku Nouveau przeprowadzono przeprojektowanie i porządkowanie wewnętrznych struktur.
    • W sterowniku intel_pstate, zarządzającym parametrami zużycia energii (P-state) na systemach z procesorami Intel, dodano wsparcie dla systemów hybrydowych z asymetrycznymi (różniącymi się właściwościami) CPU, a także wsparcie dla zarządzania energią procesorów opartych na mikroarchitekturach Granite Rapids i Sierra Forest. W sterowniku intel_idle dodano wsparcie dla CPU Xeon Granite Rapids. W sterowniku intel_rapl zapewniono rozpoznawanie procesów AMD serii 1Ah oraz procesorów Intel ArrowLake-U.
    • Kontynuowano wprowadzanie zmian dla wsparcia ARM SoC Snapdragon X Elite, w którym zastosowano własny 12-rdzeniowy CPU Qualcomm Oryon oraz GPU Qualcomm Adreno. Układ jest skierowany na rynek laptopów i PC, przewyższając w wielu testach wydajnościowych układy Apple M3 oraz Intel Core Ultra 155H.
    • Dodano wsparcie dla platform ARM, SoC oraz urządzeń: Broadcom bcm2712 (Raspberry Pi 5), Renesas R9A09G057 (RZ/V2H), Qualcomm Snapdragon 414 (MSM8929), Lenovo ThinkPad T14s Gen 6, Lenovo A6000/A6010, Surface Laptop 7, Anbernic RG35XXSP, Firefly Core-PX30-JD4, Lunzn Fastrhino R68S, Aspeed Riser, AGX Orin, Rockchip Qnap-TS433, Huashan Pi, Meta Catalina, BeagleY-AI, NanoPi R2S Plus, ExynosAuto v920, SOPHGO SG2002, Qualcomm IPQ5332, LG G4 (h815), Cool Pi CM5 GenBook, Anbernic RG35XXSP, GameForce Ace, IBM P11, Kontron i.MX93 OSM-S, NanoPC-T6.
    • Dodano wsparcie dla paneli ekranowych Anbernic RG28XX, On Tat Industrial Company KD50G21-40NT-A1, Innolux G070ACE-LH3, Melfas lmfbx101117480, Densitron DMT028VGHMCMI-1D, Microchip AC40T08A, AOU B116XTN02.3, AUO B116XAN06.1, AOU B116XAT04.1, BOE TV101WUM-LL2, BOE NV140WUM-N41, BOE NV133WUM-N63, BOE NV116WHM-A4D, BOE NE140WUM-N6G, CMN N116BCA-EA2, CMN N116BCP-EA2, CSW MNB601LS1-4, Starry er88577.
    • W systemie dźwiękowym dodano obsługę chipów i kodeków RME Digiface USB, AMD ACP 7.1, Mediatek MT6367, MT8365, Realtek RTL1320, C-Media CM9825. Starsze sterowniki dźwięku dla ASoC Intel zostały uznane za przestarzałe, zamiast nich zaleca się stosowanie sterowników AVS. Wprowadzono wiele ulepszeń w sterowniku SoundWire.

Ź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