Wydanie jądra Linuksa 6.1

Po dwóch miesiącach prac Linus Torvalds przedstawił wydanie jądra Linuksa 6.1. Do najważniejszych zmian należą: wsparcie rozwoju sterowników i modułów w języku Rust, unowocześnienie mechanizmu określania wykorzystanych stron pamięci, specjalny menedżer pamięci dla programów BPF, system diagnozowania problemów z pamięcią KMSAN, KCFI (Kernelk Control -Flow Integrity), wprowadzenie drzewa struktury Maple.

Nowa wersja zawiera 15115 2139 poprawek od 51 programistów, rozmiar łatki wynosi 2 MB, czyli około 6.0 razy mniej niż rozmiar łatek z jąder 5.19 i 13165. Zmiany dotyczyły 716247 304560 plików, dodano 45 6.1 linii kodu, a 14 14 linii usunięto. Około 3% wszystkich zmian wprowadzonych w wersji 3 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.1:

  • Usługi pamięci i systemu
    • Dodano możliwość używania Rusta jako drugiego języka do tworzenia sterowników i modułów jądra. Głównym powodem wspierania Rusta jest ułatwienie pisania bezpiecznych i wysokiej jakości sterowników urządzeń poprzez zmniejszenie prawdopodobieństwa popełnienia błędów podczas pracy z pamięcią. Obsługa Rusta jest domyślnie wyłączona i nie powoduje uwzględnienia Rusta jako wymaganej zależności kompilacji jądra. Jądro przyjęło dotychczas minimalną, okrojoną wersję łatek, która została zredukowana z 40 do 13 tysięcy linii kodu i zapewnia jedynie niezbędne minimum, wystarczające do zbudowania prostego modułu jądra napisanego w języku Rust. W przyszłości planowane jest stopniowe zwiększanie istniejącej funkcjonalności, przenoszenie pozostałych zmian z gałęzi Rust-for-Linux. Równolegle trwają prace nad projektami wykorzystania proponowanej infrastruktury do opracowania sterowników dla dysków NVMe, protokołu sieciowego 9p oraz procesora graficznego Apple M1 w języku Rust.
    • Dla systemów opartych na architekturach AArch64, RISC-V i LoongArch z EFI zaimplementowano możliwość bezpośredniego ładowania skompresowanych obrazów jądra. Dodano procedury obsługi ładowania, uruchamiania i rozładowywania obrazów jądra, wywoływane bezpośrednio z EFI zboot. Dodano także procedury obsługi instalowania i usuwania protokołów z bazy danych protokołów EFI. Wcześniej rozpakowywanie odbywało się za pomocą osobnego programu ładującego, ale teraz można to zrobić za pomocą modułu obsługi w samym jądrze - obraz jądra jest tworzony jako aplikacja EFI.
    • Kompozycja zawiera część poprawek z implementacją wielopoziomowego modelu zarządzania pamięcią, który pozwala na wyodrębnienie banków pamięci o różnej charakterystyce wydajnościowej. Na przykład najczęściej używane strony mogą być przechowywane w najszybszej pamięci, podczas gdy najrzadziej używane strony mogą być przechowywane w stosunkowo wolnej pamięci. Jądro 6.1 wprowadza mechanizm określania, gdzie w wolnej pamięci znajdują się często używane strony, aby można je było promować do szybkiej pamięci, a także wprowadza ogólną koncepcję warstw pamięci i ich względnej wydajności.
    • Zawiera mechanizm MGLRU (Multi-Generational LRU), który zastępuje starą implementację LRU (Least Ostatnio Używane) opartą na dwóch kolejkach o wielostopniowej strukturze, która lepiej określa, które strony pamięci są faktycznie używane, a które można wypchnąć do partycję wymiany.
    • Dodano obsługę struktury danych „drzewo klonowe” zaproponowanej przez inżynierów Oracle, która jest pozycjonowana jako skuteczniejszy zamiennik struktury „drzewa czerwono-czarnego”. Maple Tree to odmiana B-tree obsługująca indeksowanie zakresu i zaprojektowana tak, aby efektywnie wykorzystywać pamięć podręczną nowoczesnych procesorów. Część podsystemów zarządzania pamięcią została już przeniesiona do Maple Tree, co pozytywnie wpłynęło na ich wydajność. W przyszłości drzewo klonowe będzie można wykorzystać do wdrożenia blokowania zasięgu.
    • Do podsystemu BPF dodano możliwość tworzenia „destrukcyjnych” programów BPF specjalnie zaprojektowanych do inicjowania awaryjnego zamykania poprzez wywołanie Crash_kexec(). Takie programy BPF mogą być wymagane do celów debugowania, aby zainicjować tworzenie zrzutu awaryjnego w określonym momencie. Aby uzyskać dostęp do destrukcyjnych operacji podczas ładowania programu BPF, musisz określić flagę BPF_F_DESTRUCTIVE, aktywować sysctl kernel.destructive_bpf_enabled i posiadać uprawnienia CAP_SYS_BOOT.
    • W przypadku programów BPF możliwe jest wyliczenie elementów cgroup, a także wyliczenie zasobów (plików, vma, procesów itp.) konkretnego wątku lub zadania. Zaimplementowano nowy typ mapy w celu tworzenia buforów pierścieniowych użytkownika.
    • Dodano specjalne wywołanie alokacji pamięci w programach BPF (alokator pamięci), które zapewnia bezpieczniejszą alokację pamięci w kontekście BPF niż standardowe kmalloc().
    • Pierwsza część zmian została zintegrowana, zapewniając możliwość tworzenia sterowników dla urządzeń wejściowych z interfejsem HID (Human Interface Device), zaimplementowanych w postaci programów BPF.
    • Jądro całkowicie usunęło kod obsługujący format pliku wykonywalnego a.out, który był przestarzały w wersji 5.1 i został wyłączony dla głównych architektur od wersji 5.18 i 5.19. Format a.out od dawna jest przestarzały w systemach Linux, a generowanie plików a.out nie jest obsługiwane przez nowoczesne narzędzia w domyślnych konfiguracjach Linuksa. Moduł ładujący pliki a.out można zaimplementować całkowicie w przestrzeni użytkownika.
    • Dla systemów opartych na architekturze zestawu instrukcji LoongArch stosowanej w procesorach Loongson 3 5000 i implementujących nowy RISC ISA, podobny do MIPS i RISC-V, zaimplementowana jest obsługa zdarzeń pomiaru wydajności (perf eventów), kompilacji kexec, kdump i BPF JIT .
    • Asynchroniczny interfejs we/wy io_uring oferuje nowy tryb IORING_SETUP_DEFER_TASKRUN, który umożliwia tymczasowe odroczenie pracy związanej z buforem pierścieniowym do czasu wykonania żądania aplikacji, co można wykorzystać do pracy wsadowej i uniknąć problemów z opóźnieniami spowodowanych wywłaszczaniem. zły czas.
    • Procesy w przestrzeni użytkownika mają możliwość inicjowania konwersji zakresu normalnych stron pamięci na zestaw 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() przy wykorzystaniu praw dostępu w FS. Funkcjonalność userfaultfd umożliwia tworzenie procedur obsługi dostępu do nieprzydzielonych stron pamięci (błędów stron) w przestrzeni użytkownika.
    • Zwiększono wymagania dotyczące wersji narzędzia GNU Make - do zbudowania jądra wymagana jest teraz co najmniej wersja 3.82.
  • Podsystem dyskowy, wejścia/wyjścia i systemy plików
    • W systemie plików Btrfs dokonano znaczących optymalizacji wydajności; między innymi wydajność wywołania ioctl FIEMAP została zwiększona o rzędy wielkości. Dodano obsługę asynchronicznych zapisów buforowanych dla aplikacji korzystających z io_uring. Do operacji „wyślij” dodano obsługę plików chronionych za pomocą fs-verity.
    • W systemie plików ext4 dodano optymalizacje wydajności związane z obsługą dziennika i działaniem tylko do odczytu.
    • System plików EROFS (Enhanced Read-Only File System), przeznaczony do użytku na partycjach dostępnych w trybie tylko do odczytu, implementuje możliwość udostępniania danych zduplikowanych w różnych systemach plików.
    • Dodano wywołanie systemowe statx() w celu wyświetlenia informacji o tym, czy do pliku można zastosować bezpośrednie operacje wejścia/wyjścia.
    • Do podsystemu FUSE (Filesystems in User Space) dodano obsługę tworzenia plików tymczasowych z flagą O_TMPFILE.
  • Wirtualizacja i bezpieczeństwo
    • Zastąpiono implementację mechanizmu zabezpieczającego CFI (Control Flow Integrity), dodając kontrole przed każdym pośrednim wywołaniem funkcji w celu wykrycia pewnych form niezdefiniowanego zachowania, które może potencjalnie prowadzić do naruszenia normalnej kolejności wykonywania (przepływu kontroli) jako w wyniku wykorzystania exploitów zmieniających wskaźniki na funkcje przechowywane w pamięci. Standardowa implementacja CFI z projektu LLVM została zastąpiona opcją również opartą na wykorzystaniu Clang, ale specjalnie przystosowaną do ochrony podsystemów niskiego poziomu i jąder systemu operacyjnego. W LLVM nowa implementacja będzie oferowana w wersji Clang 16 i będzie włączana z opcją „-fsanitize=kcfi”. Kluczową różnicą w stosunku do nowej implementacji jest to, że nie jest ona powiązana z optymalizacją czasu łącza (LTO) i nie powoduje zastąpienia wskaźników funkcji łączami w tabeli skoków.
    • W przypadku modułów LSM (Linux Security Module) możliwe jest utworzenie procedur obsługi, które przechwytują operacje w celu utworzenia przestrzeni nazw.
    • Dostępne są narzędzia do weryfikacji podpisów cyfrowych PKCS#7 w programach BPF.
    • Możliwość otwierania w trybie nieblokującym (O_NONBLOCK), która została przypadkowo usunięta w jądrze 5.6, została przywrócona do /dev/random.
    • W systemach o architekturze x86 dodano ostrzeżenie w przypadku mapowania stron pamięci przez podsystemy jądra, które umożliwiają jednocześnie wykonanie i zapis. W przyszłości rozważana jest możliwość całkowitego zakazu takiego mapowania pamięci.
    • Dodano mechanizm debugowania KMSAN (Kernel Memory Sanitizer) w celu wykrywania niezainicjowanego użycia pamięci w jądrze, a także niezainicjowanych wycieków pamięci między przestrzenią użytkownika a urządzeniami.
    • Wprowadzono ulepszenia w krypto-zabezpieczonym generatorze liczb pseudolosowych CRNG używanym w wywołaniu getrandom. Zmiany przygotował Jason A. Donenfeld, autor VPN WireGuard i mają na celu poprawę bezpieczeństwa ekstrakcji pseudolosowych liczb całkowitych.
  • Podsystem sieciowy
    • Stos TCP zapewnia możliwość (domyślnie wyłączona) używania tabel skrótów gniazd oddzielnie dla każdej przestrzeni nazw, co poprawia wydajność w systemach z dużą liczbą przestrzeni nazw.
    • Usunięto kod obsługujący starszy protokół DECnet. Sekcje API przestrzeni użytkownika pozostają na miejscu, aby umożliwić kompilację aplikacji korzystających z DECnet, ale aplikacje te nie będą mogły łączyć się z siecią.
    • Protokół netlink jest udokumentowany.
  • Sprzęt
    • Sterownik amdgpu dodał obsługę przekazywania DSC (Display Stream Compression) w celu bezstratnej kompresji danych podczas wymiany informacji z ekranami obsługującymi bardzo wysokie rozdzielczości. Trwają prace nad zapewnieniem wsparcia dla platform AMD RDNA3 (RX 7000) i CDNA (Instinct). Dodano obsługę 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. Sterownik amdkfd (dla odrębnych procesorów graficznych AMD, takich jak Polaris) zapewnia obsługę GFX 11.0.3.
    • Sterownik i915 (Intel) obsługuje procesor graficzny Meteor Lake. Meteor Lake i nowsze procesory graficzne obsługują interfejs DP 2.0 (DisplayPort). Dodano identyfikatory kart graficznych opartych na mikroarchitekturze Alder Lake S.
    • Dodano obsługę podsystemów audio zaimplementowanych w procesorach Apple Silicon, Intel SkyLake i Intel KabyLake. Sterownik audio CS35L41 HDA obsługuje tryb uśpienia. Dodano obsługę ASoC (ALSA System on Chip) dla zintegrowanych układów audio Apple Silicon, AMD Rembrant DSP, AMD Pink Sardine ACP 6.2, Everest ES8326, Intel Sky Lake i Kaby Lake, Mediatek MT8186, NXP i.MX8ULP DSP, Qualcomm SC8280XP, SM8250, SM8450 i Texas Instruments SRC4392
    • Dodano obsługę 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 NT116WH M- N21, INX N116BCA- EA2, INX N116BCN-EA1, technologia Multi-Inno MI0800FT-9.
    • Dodano obsługę kontrolerów AHCI SATA używanych w SoC Baikal-T1.
    • Dodano obsługę układów Bluetooth MediaTek MT7921, Intel Magnetor (CNVi, Integrated Connectivity), Realtek RTL8852C, RTW8852AE i RTL8761BUV (Edimax BT-8500).
    • W sterowniku ath11k dla modułów bezprzewodowych Qualcomm dodano obsługę skanowania widmowego w zakresie 160 MHz, zaimplementowano wielowątkowe NAPI oraz ulepszoną obsługę chipów Wi-Fi Qualcomm WCN6750.
    • Dodano sterowniki dla klawiatury PinePhone, touchpadów InterTouch (ThinkPad P1 G3), kontrolera adaptacyjnego X-Box, kontrolera lotu PhoenixRC, kontrolera samochodu VRC-2, kontrolera DualSense Edge, panelu operacyjnego IBM, pilotów XBOX One Elite, tabletów XP-PEN Deco Pro S i Intuos Pro Small (PTH-460).
    • Dodano sterownik dla akceleratorów kryptograficznych Aspeed HACE (Hash i Crypto Engine).
    • Dodano obsługę zintegrowanych kontrolerów Thunderbolt/USB4 Intel Meteor Lake.
    • Dodano obsługę smartfonów Sony Xperia 1 IV, Samsung Galaxy E5, E7 i Grand Max, Pine64 Pinephone Pro.
    • Dodano obsługę 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. Zaktualizowano sterowniki dla SoC Samsung, Mediatek, Renesas, Tegra, Qualcomm, Broadcom i NXP.

W tym samym czasie Latin American Free Software Foundation stworzyła wersję całkowicie darmowego jądra 6.1 - Linux-libre 6.1-gnu, oczyszczoną z elementów oprogramowania sprzętowego i sterowników zawierających niewolne komponenty lub sekcje kodu, których zakres jest ograniczony przez producenta. Nowa wersja czyści nowy sterownik rtw8852b i pliki DTS dla różnych układów SoC Qualcomm i MediaTek z procesorami opartymi na architekturze AArch64. Zaktualizowano kod czyszczenia obiektów blob w sterownikach i podsystemach amdgpu, i915, brcmfmac, r8188eu, rtw8852c, Intel ACPI. Poprawiono czyszczenie nieaktualnych sterowników kart TV tm6000, cpia2 v4l, sp8870, av7110.

Źródło: opennet.ru

Dodaj komentarz