Po dwóch miesiącach prac rozwojowych Linus Torvalds wydał jądro. Linux 6.12. Do najważniejszych zmian należą: możliwość włączenia trybu czasu rzeczywistego, sched_ext do tworzenia harmonogramów CPU za pośrednictwem eBPF, generowanie kodu QR w sytuacjach awaryjnych, mechanizm Device Memory TCP, mechanizm rezerwacji zasobów serwera SCHED_DEADLINE, ulepszenie harmonogramu zadań EEVDF, moduł IPE do ustawiania zasad integralności.
Nowa wersja zawiera 14607 2167 poprawek od 37 programistów, rozmiar łatki to 13087 MB (zmiany dotyczyły 507913 234083 plików, dodano 15130 2078 linii kodu, usunięto 85 6.10 linii). Ostatnia wersja zawierała 41 45 poprawek od 6.12 programistów, a rozmiar łatki wynosił 12 MB (w jądrze 13 łatka miała rozmiar 6 MB). Około 3% wszystkich zmian wprowadzonych w wersji XNUMX dotyczy sterowników urządzeń, około XNUMX% zmian dotyczy aktualizacji kodu specyficznego dla architektur sprzętowych, XNUMX% dotyczy stosu sieciowego, XNUMX% dotyczy systemów plików, a XNUMX% są powiązane z wewnętrznymi podsystemami jądra.
Główne innowacje w jądrze 6.12:
- Usługi pamięci i systemu
- Możliwość kompilacji jądra z opcją PREEMPT_RT bez dodatkowych poprawek dla operacji w czasie rzeczywistym jest teraz dostępna. Ostatnią brakującą funkcją jądra, która uniemożliwiała włączenie trybu PREEMPT_RT, była obsługa nieblokującego wyjścia atomowego za pośrednictwem funkcji printk, która również jest zawarta w jądrze. 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 postaci poprawek zewnętrznych, które były dostępne w niektórych dystrybucjach, takich jak RHEL, SUSE i… Ubuntu, stworzyli osobne edycje Realtime swoich produktów, cieszące się popytem w takich obszarach jak systemy finansowe, urządzenia do przetwarzania dźwięku i obrazu, lotnictwo, medycyna, robotyka, telekomunikacja i systemy przemysłowe, gdzie konieczne jest zapewnienie przewidywalnego czasu przetwarzania zdarzeń.
- Dodano mechanizm „sched_ext” (SCX), umożliwiający wykorzystanie eBPF do tworzenia harmonogramów procesora, które obejmują praktycznie wszystkie aspekty harmonogramowania zadań i alokacji zasobów procesora. Takie harmonogramy mogą być dynamicznie ładowane i uruchamiane w jądrze. Linux в maszyna wirtualna eBPF. Mechanizm sched_ext upraszcza tworzenie harmonogramów zadań, umożliwia eksperymentowanie z różnymi technikami i strategiami harmonogramowania oraz pozwala na szybkie tworzenie działających prototypów i błyskawiczną wymianę harmonogramów w infrastrukturach produkcyjnych. Na przykład, używając sched_ext, można utworzyć harmonogram, który uwzględnia specyfikę konkretnej aplikacji i dynamicznie zmienia swoją strategię harmonogramowania w zależności od stanu systemu i innych czynników.
- W kompozycji znajduje się pozostała część poprawek niezbędnych do działania mechanizmu serwerowego SCHED_DEADLINE, który rozwiązuje problem niedostatecznego wykorzystania zasobów procesora przez zwykłe zadania, gdy procesor jest zmonopolizowany przez zadania o wysokim priorytecie (czasu rzeczywistego). Aby zapobiec monopolizacji procesora, jądro korzystało wcześniej z mechanizmu dławienia w czasie rzeczywistym, który próbował zarezerwować 5% czasu na zadania o niskim priorytecie, pozostawiając 95% czasu na zadania czasu rzeczywistego. Mechanizm ten pozostawiał wiele do życzenia, gdyż zwykłe zadania w wielu sytuacjach nie otrzymywały wystarczającej ilości czasu procesora. Serwer SCHED_DEADLINE implementuje wydajniejszy mechanizm rezerwacji zasobów.
- Zakończono integrację harmonogramu zadań EEVDF (Earliest Eligible Virtual Deadline First), który zastąpił harmonogram CFS (Completely Fair Scheduler), dostarczany począwszy od jądra 2.6.23. Nowy harmonogram przy wyborze kolejnego procesu, do którego ma zostać przekazane wykonanie, bierze pod uwagę procesy, które nie otrzymały wystarczających zasobów procesora lub otrzymały niesprawiedliwie dużą ilość czasu procesora. W pierwszym przypadku przeniesienie kontroli nad procesem jest wymuszone, w drugim wręcz przeciwnie – odkładane w czasie. Stary program planujący CFS wykorzystywał heurystykę i dostrajanie w celu identyfikowania procesów wymagających szczególnej uwagi, podczas gdy nowy program planujący śledzi je w bardziej wyraźny sposób i nie wymaga dostrajania. Oczekuje się, że EEVDF zmniejszy opóźnienia w zadaniach, w przypadku których CFS miał problemy z harmonogramem.
- W module obsługi awaryjnej jądra - DRM Panic, który wykorzystuje podsystem DRM (Direct Rendering Manager) do wyświetlania raportu wizualnego w stylu „niebieskiego ekranu śmierci”, możliwość wyświetlenia logo i kodu QR z raportem kmsg na dodano ekran informujący o wystąpieniu sytuacji awaryjnej. Ponieważ w kodzie QR mieszczą się tylko 2953 bajty, dostępna jest opcja DRM_PANIC_SCREEN_QR_CODE_URL, w której raport kmsg jest kompresowany za pomocą zlib i dołączany jako parametr do adresu URL, co pozwala na przesłanie około 40 bajtów za pomocą kodu QR V7500. Podczas budowania pakietów z jądrem dystrybucje mogą ustawić podstawowy adres URL dla adresu URL, który umożliwi im przejście do strony w celu zgłoszenia problemu. Aby wybrać format kodu QR, dostępne jest ustawienie DRM_PANIC_SCREEN_QR_VERSION.
- Dodano obsługę ARM POE (Permission Overlay Extension), która umożliwia ustawienie praw dostępu do obszarów pamięci. Korzystając z tego rozszerzenia, w systemach z procesorami ARM64 można zaimplementować mechanizm Memory Protection Keys, który służy do ograniczania dostępu do stron pamięci bez zmiany tabeli stron pamięci.
- Dla architektur Loongarch, ARM64, PowerPC i s390 przeniesiono implementację wywołania systemowego getrandom(), zoptymalizowanego przy użyciu mechanizmu vDSO (wirtualny dynamiczny obiekt współdzielony), który umożliwia przeniesienie obsługi wywołań systemowych z jądra do użytkownika spację i unikaj przełączania kontekstu. Optymalizacja pozwala przyspieszyć generowanie liczb losowych nawet 15-krotnie.
- Do podsystemu asynchronicznego wejścia/wyjścia io_uring dodano możliwość stosowania timeoutów bezwzględnych, wyzwalanych po osiągnięciu określonego czasu na zegarze systemowym (wcześniej można było ustawiać tylko timeouty względne, które wskazywały czas od początku operacji ).
- Dodano pliki do generowania powiązań dla biblioteki libcpupower przy użyciu zestawu narzędzi SWIG, który umożliwia generowanie powiązań z kodu C/C++ dla różnych języków programowania. Powiązania umożliwiają tworzenie skryptów w języku Python i innych językach oraz wykorzystywanie ich do rozszerzania funkcjonalności biblioteki libcpupower, która udostępnia API do zarządzania cpufreq i sterownikami z przestrzeni użytkownika.
- Narzędzie cpuidle wyświetla wartość „rezydencji” w stanie bezczynności, stosowaną w systemach czasu rzeczywistego i biorąc pod uwagę minimalny czas, przez jaki procesor musi znajdować się w stanie bezczynności, aby uzasadnić koszty energii związane z przejściem do i z tego stanu.
- Dodano możliwość użycia kompilatora Clang do zbudowania standardowej biblioteki C nolibc, która jest zawarta w kodzie źródłowym jądra. Linux i zapewnia wrapper dla podstawowych wywołań systemowych. Podczas kompilacji biblioteki nolibc w Clang włączona jest optymalizacja czasu łączenia (LTO).
- Niektóre interfejsy cgroup1, takie jak rozliczanie TCP, miękkie limity w wersji XNUMX i zarządzanie wyczerpaniem pamięci, stały się przestarzałe. Na razie obsługa tych funkcji jest w pełni obsługiwana i ostrzeżenie ma na celu zbadanie liczby użytkowników, którzy w dalszym ciągu korzystają z tych funkcji.
- Dodano możliwość skonfigurowania bufora śledzenia pierścieniowego w celu zapisania zgromadzonych danych po ponownym uruchomieniu, co pozwoli uniknąć utraty zgromadzonych informacji debugowania w przypadku awarii jądra. Dane są przechowywane w pamięci. Włączenie odbywa się za pomocą parametru 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 poprzez plik /sys/kernel /tracing/instances/boot_map.
- Kontynuacja migracji zmian z gałęzi Rust-for-branchLinux, związane z wykorzystaniem Rusta jako drugiego języka do tworzenia sterowników i modułów jądra (obsługa Rusta nie jest domyślnie aktywna i nie uwzględnia Rusta wśród wymaganych zależności kompilacji jądra). Dodano moduły „list” i „rbtree” do pracy z listami dwukierunkowymi i drzewami wyszukiwania czerwono-czarnymi. Rozszerzono możliwości modułów „init”, „sync”, „types” i „error”. Dodano możliwość użycia kodu Rusta podczas budowania jądra z ochroną przed atakami Spectre (opcje MITIGATION_{RETHUNK,RETPOLINE,SLS}), przy użyciu systemu debugowania KASAN, mechanizmów ochrony kCFI (kernel Control Flow Integrity) i Shadow Call, a także podczas korzystania z dodatkowych wtyczek GCC. Dodano sterownik dla kontrolera Applied Micro QT2025 PHY Ethernet, napisany w Ruście. Przygotowano osobną stronę internetową z dokumentacją: rust.docs.kernel.org.
- Do kodu źródłowego jądra dodano narzędzie xdrgen umożliwiające konwersję specyfikacji XDR (eXternal Data Representation) na funkcje kodowania i dekodowania XDR napisane w stylu języka C stosowanym przez jądro. Linux.
- Jądro zostało zmienione w celu zaimplementowania mechanizmu maskowania wskaźników w celu zmniejszenia liczby powolnych wywołań bariery_nospec() w 64-bitowej funkcji copy_from_user(), używanej do kopiowania danych do jądra z przestrzeni użytkownika. Stosowanie maskowania przyspiesza test „per_thread_ops”, który ocenia liczbę operacji, które można wykonać w jednym wątku, o 2.6%.
- Dodano nowy sterownik USB, który umożliwia wykorzystanie protokołu 9pfs jako transportu do wysyłania i odbierania danych z urządzenia USB podczas montowania systemu plików 9p przez USB (na przykład „mount -t 9p -o trans=usbg, aname=/ścieżka/do/fs /mnt/9"). Przykładem użycia nowego sterownika jest użycie go zamiast NFS do organizacji rozruchu partycji głównej podczas tworzenia urządzeń wbudowanych.
- Podsystem dyskowy, wejścia/wyjścia i systemy plików
- Do podsystemu VFS dodano możliwość współpracy z urządzeniami pamięci masowej, których rozmiar bloku jest większy niż rozmiar strony pamięci w systemie. W systemach plików ta funkcja jest obecnie obsługiwana tylko w XFS.
- Podsystem FUSE pozwalający na tworzenie implementacji systemów plików działających w przestrzeni użytkownika dodał obsługę mapowania identyfikatorów użytkowników zamontowanych systemów plików, służącą do dopasowania plików konkretnego użytkownika na zamontowanej partycji obcej z innym użytkownikiem na bieżącej system.
- Zaimplementowano nową operację fcntl, F_CREATED_QUERY, dającą aplikacji możliwość określenia, czy plik otwarty przy użyciu flagi O_CREAT został utworzony, czy też istniał już wcześniej.
- Dodano możliwość używania unikalnych 64-bitowych identyfikatorów punktów podłączenia do wywołania systemowego name_to_handle_at(), aby uniknąć sytuacji wyścigu podczas analizowania /proc/mountinfo.
- Rozmiar struktury „plików” w jądrze został zmniejszony z 232 do 184 bajtów, co zmniejsza zużycie pamięci w systemach aktywnie pracujących z plikami.
- Montowanie systemów plików w celu montowania punktów w hierarchii /proc, takich jak /proc/PID/fd, było zabronione, co stwarzało potencjalne problemy związane z bezpieczeństwem.
- Pseudo-FS NSFS (NameSpace FS), używany do pracy z przestrzeniami nazw, dostarcza dodatkowych informacji o przestrzeniach nazw punktów podłączenia.
- System plików EROFS (Extendable Read-Only File System), zaprojektowany do użytku na partycjach tylko do odczytu, obsługuje teraz montowanie systemów plików bezpośrednio z obrazów dysków zapisanych jako pliki.
- Nowe polecenia ioctl XFS_IOC_START_COMMIT i XFS_IOC_COMMIT_RANGE zostały dodane do XFS w celu wymiany zawartości pomiędzy dwoma plikami.
- W systemie NFS dodano obsługę protokołu „LOCALIO”, który umożliwia określenie, czy klient i Serwer NFS na tym samym hoście w celu włączenia odpowiednich optymalizacji.
- W systemie plików Btrfs zaproponowano optymalizację wydajności, dokonano refaktoryzacji kodu, zmniejszono obszar blokowania zakresu operacji odczytu, kontynuowano prace nad konwersją stron pamięci do korzystania z folio stron oraz poprawiono automatyczne zwalnianie pamięci zaimplementowany dla struktury btrfs_path.
- W systemie plików Ext4 naprawiono błędy związane z alokacją bloków, zarządzaniem zakresami, szybkim zatwierdzaniem i kronikowaniem.
- Wirtualizacja i bezpieczeństwo
- Dodano moduł LSM IPE (Integrity Policy Enforcement), opracowany przez firmę Microsoft w celu rozszerzenia istniejącego obowiązkowego systemu kontroli dostępu. Moduł umożliwia zdefiniowanie ogólnej polityki integralności dla całego systemu, wskazując, jakie operacje są dozwolone i w jaki sposób należy weryfikować autentyczność komponentów. Przykładowo za pomocą IPE można określić, które pliki wykonywalne mogą być uruchamiane, biorąc pod uwagę ich zgodność z wersją referencyjną przy użyciu skrótów kryptograficznych dostarczonych przez system dm-verity.
- Na etapie kompilacji jądra możliwe jest osobne włączenie dostępnych metod ochrony przed różnymi podatnościami klasy Spectre w procesorze. Kconfig oferuje nowe parametry: MITIGATE_MDS (ochrona przed luką Microarchitectural Data Sampling), MITIGATE_TAA (ochrona przed luką TSX Asynchronous Abort), MITIGATE_MMIO_STALE_DATA (ochrona przed luką MMIO Stale Data), MITIGATE_L1TF (ochrona przed luką L1 Terminal Fault), MITIGATE_RETBLEED (ochrona przed Retbleed), MITIGATE_SPECTRE_V1, MITIGATE_SPECTRE_V2 (ochrona przed podatnościami Spectre), MITIGATE_SRBDS (ochrona przed luką w zabezpieczeniach Special Register Buffer Data Sampling), MITIGATE_SSB (ochrona przed luką w zabezpieczeniach Speculative Store Bypass).
- Dodano opcję wiersza poleceń proc_mem.force_override i zestaw ustawień asemblera w Kconfig (PROC_MEM_FORCE_ALWAYS, PROC_MEM_FORCE_PTRACE i PROC_MEM_FORCE_NEVER), aby zapobiec zmianom pamięci poprzez /proc/pid/mem.
- Podsystem LSM (Linux moduł bezpieczeństwa) został przełączony na korzystanie ze statycznych wywołań, co poprawiło bezpieczeństwo i wydajność.
- Możliwość wykorzystania standardowych rdzeni dla architektury ARM64 w środowiskach gościnnych działających na Android-systemy ze zmodyfikowanym hiperwizorem KVM (chroniony KVM).
- Moduł Landlock LSM, który pozwala ograniczyć interakcję grupy procesów ze środowiskiem zewnętrznym, implementuje koncepcję „IPC scoping”, aby selektywnie ograniczać interakcję ze środowiskami typu sandbox za pomocą gniazd i sygnałów Unix. Można na przykład zabronić połączeń przy użyciu gniazd uniksowych ze środowiska piaskownicy z procesami, które nie mają zastosowanej izolacji, ale zezwolić na połączenia z procesami w tym samym zakresie.
- W hiperwizorze KVM do identyfikatora CPUID dla systemów gościnnych dodano flagę wskazującą obsługę rozszerzeń AVX10.1.
- Podsystem sieciowy
- Dodano mechanizm Device Memory TCP, pozwalający na wykorzystanie gniazd sieciowych do bezpośredniego przesyłania przez sieć zawartości pamięci urządzeń peryferyjnych (tryb zerowej kopii) oraz bezpośredniego umieszczania zawartości pakietów sieciowych w obszarze pamięci urządzenia na strona odbiorcy. Dane przesyłane w pakietach przesyłane są z karty sieciowej do pamięci urządzenia peryferyjnego lub z pamięci urządzenia bezpośrednio na kartę sieciową z pominięciem procesora, a nagłówki pakietów trafiają do zwykłych buforów jądra.
- Rozszerzono możliwości wielu sterowników Ethernet i bezprzewodowych. Na przykład sterownik Intel iwlwifi dodał obsługę przenoszenia operacji RLC/SMPS na stronę oprogramowania sprzętowego, sterownik RealTek rtw89 zwiększył wydajność i dodał obsługę układów RTL8852BT/8852BE-VT (WiFi 6), sterownik microchip Ethernet dodał obsługę IEEE 802.3 bw (100BASE) -T1) i IEEE 802.3bp, ulepszone implementacje wirtualnej sieci Ethernet Microsoft vNIC i IBM veth. Dodano nowe sterowniki dla układów Realtek RTL9054, RTL9068, RTL9072, RTL9075, RTL9068, RTL9071 i Microchip LAN8650/1 10BASE-T1S MAC-PHY Ethernet.
- W MPTCP (MultiPath TCP), rozszerzeniu protokołu TCP do organizowania dostarczania pakietów TCP jednocześnie kilkoma trasami przez różne interfejsy sieciowe, wielkość wag stosowanych w routingu została zwiększona z 8 do 16 bitów. Zaimplementowano wykrywanie utraconego (czarnego) ruchu i zawieszanie na pewien czas prób nawiązania połączenia z systemami, co prowadziło do utraty ruchu.
- W przypadku protokołu IPv6 zaimplementowano obsługę flagi „p” w PIO (opcja informacji o prefiksie), używanej w ogłoszeniach RA (reklama routera IPv6) w celu wybrania modelu wdrożenia klienta za pośrednictwem protokołu DHCPv6-PD (delegowanie prefiksu DHCPv6, RFC9663) zamiast przypisywania indywidualne adresy w oparciu o prefiksy przy użyciu SLAAC (Autokonfiguracja adresu bezstanowego). IPv6 IOAM6 dodaje obsługę nowego trybu enkapsulacji tunsrc, który pozwala na lepszą wydajność.
- Poprawiona wydajność przetwarzania pakietów kontrolnych IPsec.
- Poprawiona wydajność opróżniania dużych zestawów reguł nftables. nfnetlink_queue poprawiono obsługę protokołu SCTP.
- API ethtool dodało obsługę wiązania wielu kart sieciowych z jednym interfejsem sieciowym.
- Sprzęt
- W sterowniku AMDGPU trwają prace nad wdrożeniem obsługi procesorów graficznych AMD RDNA4 („GFX12”). Dodano możliwość resetowania poszczególnych kolejek zadań bez resetowania całego procesora graficznego.
- Kontynuowano prace nad sterownikiem Xe drm (Direct Rendering Manager) dla procesorów graficznych opartych na architekturze Intel Xe, która jest wykorzystywana w kartach graficznych z rodziny Intel Arc i zintegrowanych grafikach, począwszy od procesorów Tiger Lake. Nowa wersja zawiera obsługę procesorów graficznych opartych na mikroarchitekturach Battlemage i Lunar Lake. Wprowadzono obsługę modyfikatorów Xe2 CCS (Color Control Surface) w celu kontrolowania parametrów zintegrowanych i dyskretnych procesorów graficznych.
- Sterownik i915 implementuje możliwość wysyłania informacji o prędkości wentylatora poprzez interfejs HWMON lub sysfs (atrybut „fan1_input”). Parametr „i915.modeset” stał się przestarzały; zamiast „i915.modeset=0” należy używać parametru „i915.nomodeset”.
- Dodano obsługę procesorów graficznych A615, A306 i A621 do sterownika msm DRM (GPU Qualcomm Adreno).
- Wewnętrzne konstrukcje przetwornika Nouveau zostały przerobione i oczyszczone.
- Sterownik intel_pstate kontrolujący parametry zużycia energii (P-state) na systemach z procesorami Intel, dodał obsługę systemów hybrydowych z procesorami asymetrycznymi (o różnej charakterystyce), a także obsługę zarządzania energią procesorów opartych na Granite Rapids i Sierra Forest mikroarchitektury. Dodano obsługę procesora Xeon Granite Rapids do sterownika intel_idle. Sterownik intel_rapl umożliwia rozpoznawanie procesów z rodziny AMD 1Ah i procesorów Intel ArrowLake-U.
- Dalsze wprowadzanie zmian w celu obsługi procesora ARM SoC Snapdragon X Elite, który wykorzystuje własny 12-rdzeniowy procesor Oryon firmy Qualcomm i procesor graficzny Qualcomm Adreno. Układ przeznaczony jest do stosowania w laptopach i komputerach stacjonarnych i w wielu testach wydajnościowych wyprzedza chipy Apple M3 i Intel Core Ultra 155H.
- Dodano obsługę płyt ARM, układów SoC i 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) CoolPi CM5 GenBook, Anbernic RG35XXSP, GameForce Ace, IBM P11, Kontron i.MX93 OSM-S, NanoPC-T6
- Dodano obsługę Anbernic RG28XX, On Tat Industrial Company KD50G21-40NT-A1, Innolux G070ACE-LH3, Melfas lmfbx101117480, Densitron DMT028VGHMCMI-1D, Microchip AC40T08A, AOU B116XTN02.3, panele ekranowe 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, Gwiaździsty er88577.
- Podsystem audio dodał obsługę chipów i kodeków RME Digiface USB, AMD ACP 7.1, Mediatek MT6367, MT8365, Realtek RTL1320, C-Media CM9825. Stare sterowniki dźwiękowe dla Intel ASoC zostały uznane za przestarzałe i zamiast nich zaleca się używanie sterowników AVS. W sterowniku SoundWire wprowadzono wiele ulepszeń.
Źródło: opennet.ru
