Po dwóch miesiącach prac rozwojowych Linus Torvalds zaprezentował wydanie jądra Linux 6.1. Wśród najbardziej zauważalnych zmian znajdują się: wsparcie dla programowania sterowników i modułów w języku Rust, modernizacja mechanizmu określania używanych stron pamięci, specjalny menedżer pamięci dla programów BPF, system diagnostyki problemów z pamięcią KMSAN, mechanizm ochrony KCFI (Kernel Control-Flow Integrity), wprowadzenie struktury Maple tree.
W nowej wersji wprowadzono 15115 poprawek od 2139 programistów, rozmiar łatki wynosi 51 MB, co jest około dwukrotnie mniej niż rozmiar łatki jądra 6.0 i 5.19. Zmiany objęły 13165 plików, dodano 716247 linii kodu, usunięto 304560 linii. Około 45% wszystkich zmian w wersji 6.1 związane jest z sterownikami urządzeń, około 14% zmian dotyczy aktualizacji kodu specyficznego dla architektur sprzętowych, 14% związane jest z stosami sieciowymi, 3% - z systemami plików, a 3% z wewnętrznymi podsystemami jądra.
Główne nowości w jądrze 6.1:
- Pamięć i usługi systemowe
- Dodano możliwość korzystania z języka Rust jako drugiego języka do tworzenia sterowników i modułów jądra. Głównym motywem wsparcia dla Rust jest uproszczenie pisania bezpiecznych i wysokiej jakości sterowników urządzeń poprzez zmniejszenie prawdopodobieństwa popełniania błędów podczas pracy z pamięcią. Wsparcie dla Rust jest domyślnie nieaktywne i nie prowadzi do włączenia Rust do liczby obowiązkowych zależności kompilacji jądra. Do jądra przyjęto na razie minimalną wersję łatek, która została zmniejszona z 40 do 13 tysięcy linii kodu i zapewnia tylko niezbędne minimum, wystarczające do kompilacji prostego modułu jądra napisanego w języku Rust. W przyszłości planowane jest stopniowe zwiększanie istniejącej funkcjonalności, przenosząc inne zmiany z gałęzi Rust-for-Linux. Równolegle rozwijane są projekty związane z wykorzystaniem proponowanej infrastruktury do tworzenia sterowników NVMe, protokołu sieciowego 9p oraz GPU Apple M1 w języku Rust.
- Dla systemów opartych na architekturach AArch64, RISC-V i LoongArch z EFI wprowadzono możliwość bezpośredniego ładowania skompresowanych obrazów jądra. Dodano obsługę ładowania, uruchamiania i wyładowywania obrazów jądra, wywoływanych bezpośrednio z EFI zboot. Dodano również obsługę instalacji i usuwania protokołów z bazy protokołów EFI. Wcześniej dekompresja odbywała się za pomocą osobnego ładowacza, a teraz może ją wykonać obsługa w samym jądrze – obraz jądra jest tworzony jako aplikacja EFI.
- W skład przyjęto część poprawek z wdrożeniem wielopoziomowego modelu zarządzania pamięcią, umożliwiającego podział banków pamięci o różnych charakterystykach wydajności. Na przykład najbardziej intensywnie używane strony mogą być umieszczane w najszybszej pamięci, natomiast rzadko używane strony mogą być przechowywane w stosunkowo wolnej pamięci. W jądrze 6.1 przyjęto mechanizm do określenia lokalizacji intensywnie używanych stron w wolnej pamięci w celu ich przeniesienia do szybkiej pamięci, a także zrealizowano ogólną koncepcję poziomów pamięci i ich względnej wydajności.
- W skład włączono mechanizm MGLRU (Multi-Generational LRU), który zastąpił starą implementację LRU (Least Recently Used) opartą na dwóch kolejkach na struktury wielu poziomów, lepiej określające, które strony pamięci są w rzeczywistości używane, a które można wyeliminować do obszaru wymiany.
- Dodano wsparcie dla proponowanej przez inżynierów Oracle struktury danych „maple tree”, która jest uważana za bardziej efektywną alternatywę dla struktury „red-black tree”. Maple tree jest wariantem B-drzewa, wspierającym indeksowanie według zakresów wartości i zaprojektowanym do efektywnego korzystania z pamięci podręcznej. nowoczesnych procesorów. Na maple tree już przetłumaczono niektóre podsystemy zarządzania pamięcią, co pozytywnie wpłynęło na ich wydajność. W przyszłości maple tree może być używane do wdrażania blokad w oparciu o zakresy (range locking).
- Dodano do podsystemu BPF możliwość tworzenia „destrukcyjnych” programów BPF, zaprojektowanych specjalnie do inicjowania awaryjnego zakończenia pracy za pomocą wywołania crash_kexec(). Takie programy BPF mogą być potrzebne w celach debugowania do inicjowania tworzenia zrzutu pamięci w określonym momencie. Aby uzyskać dostęp do operacji destrukcyjnych podczas ładowania programu BPF, należy określić flagę BPF_F_DESTRUCTIVE, aktywować sysctl kernel.destructive_bpf_enabled oraz posiadać uprawnienia CAP_SYS_BOOT.
- Dla programów BPF udostępniono możliwość przeszukiwania elementów cgroup oraz zasobów (pliki, vma, procesy itp.) określonego wątku lub zadania. Wprowadzono nowy typ mapy do tworzenia użytkowych ring bufferów (user ring buffer).
- Dodano specjalne wywołanie do alokacji pamięci w programach BPF (memory allocator), które zapewnia bezpieczniejszą alokację pamięci w kontekście BPF, niż standardowy kmalloc().
- Zintegrowano pierwszą część zmian, które umożliwiają tworzenie sterowników dla urządzeń wejściowych z interfejsem HID (Human Interface Device), realizowanych w formie programów BPF.
- Z jądra całkowicie usunięto kod wspierający format plików wykonywalnych a.out, który został uznany za przestarzały w wydaniu 5.1, a począwszy od wersji 5.18 i 5.19 został wyłączony dla głównych architektur. Format a.out dawno nie jest stosowany w systemach z Linuksem, a generowanie plików a.out nie jest wspierane przez nowoczesne narzędzia w konfiguracjach dla Linuksa domyślnie. Ładowarka dla plików a.out może być całkowicie wdrożona w przestrzeni użytkownika.
- Dla systemów opartych na architekturze zestawu instrukcji LoongArch, używanej w procesorach Loongson 3 5000 i realizującej nowy ISA RISC, podobny do MIPS i RISC-V, wprowadzono wsparcie dla zdarzeń mierzących wydajność (perf event), kexec, kdump i kompilacji JIT BPF.
- W interfejsie asynchronicznego wejścia/wyjścia io_uring zaproponowano nowy tryb IORING_SETUP_DEFER_TASKRUN, który pozwala na tymczasowe opóźnienie wykonania związanych z buforem ring prac do momentu pojawienia się żądania od aplikacji, co może być wykorzystywane do organizacji wykonywania prac w trybie wsadowym i zapobiegania problemom z opóźnieniami spowodowanymi wydaleniem aplikacji w nieodpowiednim momencie.
- Procesy w przestrzeni użytkownika otrzymały możliwość inicjowania konwersji zakresu zwykłych stron pamięci na zbiór dużych stron pamięci (Transparent Huge-Pages).
- Dodano implementację urządzenia /dev/userfaultfd, które umożliwia dostęp do funkcjonalności wywołania systemowego userfaultfd() z wykorzystaniem uprawnień w FS. Funkcjonalność userfaultfd pozwala na tworzenie obsługi błędów odwołań do nieprzydzielonych stron pamięci (page faults) w przestrzeni użytkownika.
- Podniesione zostały wymagania dotyczące wersji narzędzia GNU Make – do kompilacji jądra wymagana jest teraz co najmniej wersja 3.82.
- Podsystem dyskowy, wejście/wyjście i systemy plików
- W systemie plików Btrfs wprowadzono znaczące optymalizacje wydajności, w tym znacznie zwiększoną wydajność wywołania ioctl FIEMAP. Dodano wsparcie dla asynchronicznego zapisu buforowanego dla aplikacji korzystających z io_uring. Do operacji „send” dodano wsparcie dla plików zabezpieczonych za pomocą fs-verity.
- W systemie plików ext4 dodano optymalizacje wydajności związane z utrzymywaniem dziennika i pracą w trybie tylko do odczytu.
- W systemie plików EROFS (Enhanced Read-Only File System), przeznaczonym do użycia na partycjach dostępnych w trybie tylko do odczytu, zrealizowano możliwość wspólnego przechowywania danych, które są duplikowane w różnych systemach plików.
- Do wywołania systemowego statx() dodano możliwość wyświetlania informacji o stosowaniu do pliku bezpośredniego wejścia/wyjścia.
- W podsystemie FUSE (Filesystems in User Space) dodano wsparcie dla tworzenia tymczasowych plików z flagą O_TMPFILE.
- Wirtualizacja i bezpieczeństwo
- Zmieniono realizację mechanizmu ochrony CFI (Control Flow Integrity), który dodaje przed każdym pośrednim wywołaniem funkcji sprawdzenie w celu wykrycia niektórych form nieokreślonego zachowania, które potencjalnie mogą prowadzić do naruszenia normalnego porządku wykonania (control flow) w wyniku zastosowania exploitów zmieniających wskaźniki na funkcje przechowywane w pamięci. Standardowa realizacja CFI z projektu LLVM została zastąpiona wariantem, również opartym na Clangu, ale specjalnie dostosowanym do ochrony niskopoziomowych subsystems i jąder systemów operacyjnych. W LLVM nowa realizacja zostanie zaproponowana w wydaniu Clang 16 i będzie włączana za pomocą opcji „-fsanitize=kcfi”. Kluczową różnicą nowej realizacji jest to, że nie jest ona związana z optymalizacjami na etapie łączenia (LTO) i nie prowadzi do zamiany wskaźników funkcji na odniesienia w tabeli przejść.
- Dla modułów LSM (Linux Security Module) udostępniono możliwość tworzenia handlerów przechwytujących operacje tworzenia przestrzeni nazw.
- Udostępniono narzędzia do weryfikacji podpisów cyfrowych PKCS#7 w programach BPF.
- W /dev/random przywrócono możliwość otwarcia w trybie nieblokującym (O_NONBLOCK), która została niesłusznie usunięta w jądrze 5.6.
- Na systemach z architekturą x86 dodano ostrzeżenie w przypadku mapowania stron pamięci przez subsystemy jądra, które jednocześnie umożliwiają wykonanie i zapis. Inna przyszłość będzie rozważana, aby całkowicie zakazać takiego mapowania pamięci.
- Dodano mechanizm debugowania KMSAN (Kernel Memory Sanitizer) do wykrywania użycia nieinicjowanej pamięci w jądrze oraz wycieków nieinicjowanej pamięci między przestrzenią użytkownika a urządzeniami.
- Wprowadzono ulepszenia w kryptograficznie bezpiecznym generatorze liczb pseudolosowych CRNG, używanym w wywołaniu getrandom. Zmiany zostały przygotowane przez Jasona Donenfelda, autora VPN WireGuard i mają na celu zwiększenie bezpieczeństwa wydobywania liczb całkowitych pseudolosowych.
- Subsystem sieciowy
- W stosie TCP wdrożono możliwość (domyślnie wyłączoną) oddzielnego używania tabel haszowych gniazd dla każdej przestrzeni nazw, co pozwala poprawić wydajność systemów z dużą liczbą przestrzeni nazw.
- Usunięto kod wspierający przestarzały protokół DECnet. Dla przestrzeni użytkownika pozostawiono zastępcze API, które pozwalają na kompilację aplikacji korzystających z DECnet, jednak dane aplikacji nie będą mogły połączyć się z siecią.
- Dokumentowany jest protokół netlink.
- Sprzęt
- W sterowniku amdgpu dodano wsparcie dla przekazywania DSC (Display Stream Compression) w celu bezstratnej kompresji danych podczas wymiany informacji z ekranami, które obsługują bardzo wysoką rozdzielczość. Kontynuowano prace nad zapewnieniem wsparcia dla platform AMD RDNA3 (RX 7000) i CDNA (Instinct). Dodano wsparcie dla komponentów IP DCN 3.2, SMU 13.x, NBIO 7.7, GC 11.x, PSP 13.x, SDMA 6.x i GMC 11.x. W sterowniku amdkfd (dla dyskretnych GPU AMD, takich jak Polaris) wprowadzono wsparcie dla GFX 11.0.3.
- W sterowniku i915 (Intel) włączono wsparcie dla GPU Meteor Lake. Dla Meteor Lake oraz nowszych GPU zapewniono wsparcie dla interfejsu DP 2.0 (DisplayPort). Dodano identyfikatory dla kart graficznych opartych na mikroarchitekturze Alder Lake S.
- Dodano wsparcie dla subsystemów dźwiękowych w procesorach Apple Silicon, Intel SkyLake i Intel KabyLake. W sterowniku dźwiękowym CS35L41 HDA dodano wsparcie dla przejścia w tryb uśpienia. Dodano wsparcie dla ASoC (ALSA System on Chip) dla wbudowanych chipów dźwiękowych Apple Silicon, AMD Rembrandt DSPs, AMD Pink Sardine ACP 6.2, Everest ES8326, Intel Sky Lake i Kaby Lake, Mediatek MT8186, NXP i.MX8ULP DSPs, Qualcomm SC8280XP, SM8250, SM8450 oraz Texas Instruments SRC4392.
- Dodano wsparcie dla paneli LCD Samsung LTL101AL01, B120XAN01.0, R140NWF5 RH, Densitron DMT028VGHMCMI-1A TFT, AUO B133UAN02.1, IVO M133NW4J-R3, Innolux N120ACA-EA1, AUO B116XAK01.6, BOE NT116WHM-N21, INX N116BCA-EA2, INX N116BCN-EA1, Multi-Inno Technology MI0800FT-9.
- Dodano wsparcie dla kontrolerów AHCI SATA używanych w SoC Baikal-T1.
- Dodano wsparcie dla chipów Bluetooth MediaTek MT7921, Intel Magnetor (CNVi, zintegrowane połączenie), Realtek RTL8852C, RTW8852AE oraz RTL8761BUV (Edimax BT-8500).
- W sterowniku ath11k dla modułów bezprzewodowych Qualcomm dodano wsparcie dla skanowania spektralnego w zakresie 160 MHz, wprowadzono wielowątkowy NAPI, poprawiono wsparcie dla chipów Wi-Fi Qualcomm WCN6750.
- Dodano sterowniki dla klawiatury do PinePhone, touchpadów InterTouch (ThinkPad P1 G3), kontrolera X-Box Adaptive, kontrolera lotu PhoenixRC, kontrolera samochodu VRC-2, kontrolera DualSense Edge, paneli sterujących IBM (IBM Operation Panel), pilotów XBOX One Elite oraz tabletów XP-PEN Deco Pro S i Intuos Pro Small (PTH-460).
- Dodano sterownik dla akceleratorów kryptograficznych Aspeed HACE (Hash and Crypto Engine).
- Dodano wsparcie dla zintegrowanych kontrolerów Thunderbolt/USB4 Intel Meteor Lake.
- Dodano wsparcie dla smartfonów Sony Xperia 1 IV, Samsung Galaxy E5, E7 i Grand Max, Pine64 Pinephone Pro.
- Dodano wsparcie dla ARM SoC i płyt: AMD DaytonaX, Mediatek MT8186, Rockchips RK3399 i RK3566, TI AM62A, NXP i.MX8DXL, Renesas R-Car H3Ne-1.7G, Qualcomm IPQ8064-v2.0, IPQ8062, IPQ8065, Kontron SL/BL i.MX8MM OSM-S, MT8195 (Acer Tomato), Radxa ROCK 4C+, NanoPi R4S Enterprise Edition, JetHome JetHub D1p. Zaktualizowane sterowniki dla SoC Samsung, Mediatek, Renesas, Tegra, Qualcomm, Broadcom i NXP.
Jednocześnie latynoamerykański Fundusz Wolnego Oprogramowania opracował wersję w pełni wolnego jądra 6.1 — Linux-libre 6.1-gnu, oczyszczonego z elementów firmware i sterowników zawierających komponenty lub fragmenty kodu, których zastosowanie jest ograniczone przez producenta. W nowym wydaniu przeprowadzono czyszczenie nowego sterownika rtw8852b oraz plików DTS dla różnych SoC Qualcomm i MediaTek z procesorami opartymi na architekturze AArch64. Zaktualizowano kod czyszczenia blobów w sterownikach i subsystems amdgpu, i915, brcmfmac, r8188eu, rtw8852c, Intel ACPI. Skorygowano czyszczenie przestarzałych sterowników kart TV tm6000, cpia2 v4l, sp8870, av7110.
Źródło: opennet.ru
