Wydanie jądra Linuksa 6.2

Po dwóch miesiącach prac Linus Torvalds przedstawił wydanie jądra Linuksa 6.2. Do najbardziej godnych uwagi zmian należą: dopuszczenie akceptacji kodu na licencji Copyleft-Next, poprawiono implementację RAID5/6 w Btrfs, kontynuowano integrację obsługi języka Rust, zmniejszono obciążenie związane z ochroną przed atakami Retbleed, dodano możliwość regulowania zużycia pamięci podczas writebacku, dodano mechanizm równoważenia TCP PLB (Protective Load Balancing), dodano hybrydowy mechanizm ochrony przepływu poleceń (FineIBT), BPF ma teraz możliwość definiowania własnych obiektów i struktur danych , narzędzie rv (Runtime Verification) jest dołączone, zużycie energii podczas wdrażania blokad RCU zostało zmniejszone.

Nowa wersja zawiera 16843 2178 poprawek od 62 14108 programistów, rozmiar łatki to 730195 MB (zmiany dotyczyły 409485 42 plików, dodano 6.2 16 linii kodu, usunięto 12 4 linii). 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.2:

  • Usługi pamięci i systemu
    • Dopuszczalne jest włączanie do jądra kodu i zmian udostępnianych w ramach licencji Copyleft-Next 0.3.1. Licencja Copyleft-Next została stworzona przez jednego z autorów GPLv3 i jest w pełni kompatybilna z licencją GPLv2, co potwierdzają prawnicy SUSE i Red Hat. W porównaniu do GPLv2, licencja Copyleft-Next jest znacznie bardziej zwarta i łatwiejsza do zrozumienia (usunięto część wprowadzającą i wzmiankę o przestarzałych kompromisach), określa ramy czasowe i procedurę eliminacji naruszeń oraz automatycznie usuwa wymagania copyleft dla przestarzałego oprogramowania, które ma więcej niż 15 lat.

      Copyleft-Next zawiera także klauzulę o przyznaniu autorskiej technologii, która w odróżnieniu od GPLv2 czyni tę licencję kompatybilną z licencją Apache 2.0. Aby zapewnić pełną kompatybilność z GPLv2, Copyleft-Next wyraźnie stwierdza, że ​​dzieło pochodne może być dostarczane na podstawie licencji GPL oprócz oryginalnej licencji Copyleft-Next.

    • Struktura zawiera narzędzie „rv”, które zapewnia interfejs do interakcji z przestrzeni użytkownika z procedurami obsługi podsystemu RV (Runtime Verification), przeznaczony do sprawdzania poprawności działania na wysoce niezawodnych systemach, gwarantujących brak awarii. Weryfikacja odbywa się w czasie wykonywania poprzez dołączenie procedur obsługi do punktów śledzenia, które sprawdzają rzeczywisty postęp wykonywania w porównaniu z wcześniej określonym referencyjnym deterministycznym modelem maszyny, który definiuje oczekiwane zachowanie systemu.
    • Urządzenie zRAM, które umożliwia przechowywanie partycji wymiany w pamięci w postaci skompresowanej (w pamięci tworzone jest urządzenie blokowe, do którego następuje zamiana z kompresją), implementuje możliwość przepakowywania stron przy użyciu alternatywnego algorytmu w celu osiągnięcia wyższego poziomu uciskowy. Główną ideą jest zapewnienie wyboru pomiędzy kilkoma algorytmami (lzo, lzo-rle, lz4, lz4hc, zstd), oferującymi własne kompromisy pomiędzy szybkością kompresji/dekompresji a poziomem kompresji lub optymalne w specjalnych sytuacjach (na przykład do kompresji dużych strony pamięci).
    • Dodano API „iommufd” do zarządzania systemem zarządzania pamięcią I/O - IOMMU (I/O Memory-Management Unit) z przestrzeni użytkownika. Nowe API umożliwia zarządzanie tablicami stron pamięci we/wy za pomocą deskryptorów plików.
    • BPF zapewnia możliwość tworzenia typów, definiowania własnych obiektów, budowania własnej hierarchii obiektów oraz elastycznego tworzenia własnych struktur danych, takich jak listy połączone. Dla programów BPF przechodzących w tryb uśpienia (BPF_F_SLEEPABLE) dodano obsługę blokad bpf_rcu_read_{,un}lock(). Zaimplementowano obsługę zapisywania obiektów task_struct. Dodano typ mapy BPF_MAP_TYPE_CGRP_STORAGE, zapewniający lokalną pamięć dla grup cgroup.
    • Dla mechanizmu blokującego RCU (Read-copy-update) zaimplementowano opcjonalny mechanizm „leniwych” wywołań zwrotnych, w którym kilka wywołań zwrotnych jest przetwarzanych jednocześnie przy użyciu timera w trybie wsadowym. Zastosowanie proponowanej optymalizacji pozwala nam zmniejszyć zużycie energii na urządzeniach z Androidem i ChromeOS o 5-10% poprzez odkładanie żądań RCU w okresach bezczynności lub niskiego obciążenia systemu.
    • Dodano sysctl split_lock_mitigate, aby kontrolować reakcję systemu po wykryciu blokad podziału, które występują podczas uzyskiwania dostępu do niewyrównanych danych w pamięci z powodu przechodzenia danych przez dwie linie pamięci podręcznej procesora podczas wykonywania instrukcji atomowej. Takie blokady prowadzą do znacznego spadku wydajności. Ustawienie split_lock_mitigate na 0 powoduje jedynie ostrzeżenie, że wystąpił problem, podczas gdy ustawienie split_lock_mitigate na 1 powoduje również spowolnienie procesu, który spowodował spowolnienie blokady, aby zachować wydajność reszty systemu.
    • Dla architektury PowerPC zaproponowano nową implementację qspinlock, która wykazuje wyższą wydajność i rozwiązuje niektóre problemy z blokowaniem, które pojawiają się w wyjątkowych przypadkach.
    • Kod obsługi przerwań MSI (Message-Signaled Interrupts) został przerobiony, eliminując nagromadzone problemy architektoniczne i dodając obsługę wiązania poszczególnych procedur obsługi z różnymi urządzeniami.
    • 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 ftrace, ochrony stosu, trybów uśpienia i gotowości.
    • Dodano możliwość nadawania nazw obszarom współdzielonej pamięci anonimowej (wcześniej nazwy można było nadawać jedynie prywatnej pamięci anonimowej przypisanej do konkretnego procesu).
    • Dodano nowy parametr wiersza poleceń jądra „trace_trigger”, przeznaczony do aktywowania wyzwalacza śledzenia używanego do wiązania poleceń warunkowych wywoływanych, gdy wyzwalane jest sprawdzanie kontroli (na przykład trace_trigger=”sched_switch.stacktrace jeśli prev_state == 2″).
    • Zwiększono wymagania dotyczące wersji pakietu binutils. Budowa jądra wymaga teraz co najmniej binutils 2.25.
    • Przy wywołaniu exec() dodano możliwość umieszczenia procesu w przestrzeni nazw czasu, w której czas różni się od czasu systemowego.
    • Rozpoczęliśmy przenoszenie dodatkowej funkcjonalności z gałęzi Rust-for-Linux, związanej z wykorzystaniem języka Rust jako drugiego języka do tworzenia sterowników i modułów jądra. Obsługa Rusta jest domyślnie wyłączona i nie powoduje uwzględnienia Rusta jako wymaganej zależności kompilacji jądra. Podstawowa funkcjonalność oferowana w ostatniej wersji została rozszerzona o obsługę kodu niskiego poziomu, takiego jak typ Vec i makra pr_debug!(), pr_cont!() i pr_alert!(), a także makro proceduralne „#[vtable ]”, co upraszcza pracę z tabelami wskaźników na funkcjach. W przyszłych wydaniach spodziewane jest dodanie wysokopoziomowych powiązań Rusta do podsystemów jądra, które umożliwią tworzenie pełnoprawnych sterowników w Rust.
    • Typ „char” używany w jądrze jest teraz domyślnie deklarowany jako niepodpisany dla wszystkich architektur.
    • Объявлен устаревшим механизм распределения памяти slab — SLOB (slab allocator), который был спроектирован для система с небольшим объёмом памяти. Вместо SLOB в обычных условиях рекомендуется использовать SLUB или SLAB. Для систем с небольшим объёмом памяти рекомендуется применять SLUB в режиме SLUB_TINY.
  • Podsystem dyskowy, wejścia/wyjścia i systemy plików
    • Wprowadzono ulepszenia w Btrfs, mające na celu naprawienie problemu „dziury zapisu” w implementacjach RAID 5/6 (próba przywrócenia RAID, jeśli podczas zapisu nastąpi awaria i nie można zrozumieć, w którym bloku, na którym urządzeniu RAID zostało zapisane poprawnie, co może prowadzić do zniszczenia bloku, odpowiadającego blokom gwarantowanym). Ponadto dyski SSD teraz domyślnie włączają asynchroniczną operację odrzucania, jeśli to możliwe, co pozwala na lepszą wydajność dzięki wydajnemu grupowaniu operacji odrzucania w kolejki i przetwarzaniu kolejki przez procesor działający w tle. Poprawiona wydajność operacji send i lseek, a także ioctl FIEMAP.
    • Rozszerzono możliwości zarządzania zapisem odroczonym (zapisywanie zwrotne, zapisywanie zmienionych danych w tle) dla urządzeń blokowych. W niektórych sytuacjach, na przykład podczas korzystania z urządzeń blokowych sieci lub dysków USB, leniwe zapisy mogą powodować duże zużycie pamięci RAM. Aby kontrolować zachowanie leniwych zapisów i utrzymać wielkość pamięci podręcznej strony w określonych granicach, w sysfs (/sys/class/bdi/) wprowadzono nowe parametry strict_limit, min_bytes, max_bytes, min_ratio_fine i max_ratio_fine.
    • В файловой системе F2FS реализована ioctl-операция атомарной замены, позволяющая выполнить запись данных в файл в рамках одной атомарной операции. В F2FS также добавлен блочный кэш экстентов, помогающий определить активно используемые данные или данные к которым давно не было обращений.
    • В ФС ext4 отмечается только исправление ошибок.
    • System plików ntfs3 oferuje kilka nowych opcji montowania: „nocase” do kontrolowania rozróżniania wielkości liter w nazwach plików i katalogów; nazwa_okna, aby zabronić tworzenia nazw plików zawierających znaki nieprawidłowe w systemie Windows; hide_dot_files, aby kontrolować przypisanie ukrytej etykiety pliku dla plików zaczynających się od kropki.
    • System plików Squashfs implementuje opcję montowania „threads=”, która pozwala zdefiniować liczbę wątków w celu zrównoleglenia operacji dekompresji. Squashfs wprowadził także możliwość mapowania identyfikatorów użytkowników zamontowanych systemów plików, służącą do dopasowywania plików konkretnego użytkownika na zamontowanej partycji zagranicznej z innym użytkownikiem w bieżącym systemie.
    • Implementacja list kontroli dostępu POSIX (list ACL POSIX) została przerobiona. Nowa implementacja eliminuje problemy architektoniczne, upraszcza konserwację bazy kodu i wprowadza bezpieczniejsze typy danych.
    • Podsystem fscrypt służący do przezroczystego szyfrowania plików i katalogów dodał obsługę algorytmu szyfrowania SM4 (chiński standard GB/T 32907-2016).
    • Udostępniono możliwość zbudowania jądra bez obsługi NFSv2 (w przyszłości planują całkowicie zaprzestać obsługi NFSv2).
    • Zmieniono organizację sprawdzania uprawnień dostępu do urządzeń NVMe. Zapewnia możliwość odczytu i zapisu na urządzeniu NVMe, jeśli proces zapisu ma dostęp do dedykowanego pliku urządzenia (poprzednio proces musiał mieć uprawnienie CAP_SYS_ADMIN).
    • Usunięto sterownik pakietu CD/DVD, który stał się przestarzały w 2016 roku.
  • Wirtualizacja i bezpieczeństwo
    • W procesorach Intel i AMD zaimplementowano nową metodę ochrony przed podatnością Retbleed, wykorzystującą śledzenie głębokości wywołań, która nie spowalnia pracy tak bardzo, jak dotychczasowe zabezpieczenie przed Retbleed. Aby włączyć nowy tryb, zaproponowano parametr wiersza poleceń jądra „retbleed=stuff”.
    • Dodano hybrydowy mechanizm ochrony przepływu instrukcji FineIBT, który łączy wykorzystanie instrukcji sprzętowych Intel IBT (Indirect Branch Tracking) i ochrony oprogramowania kCFI (kernel Control Flow Integrity) w celu blokowania naruszeń przepływu kontroli wynikających z wykorzystania exploitów modyfikujących wskaźniki przechowywane w pamięci Funkcje. FineIBT umożliwia wykonanie poprzez skok pośredni tylko w przypadku skoku do instrukcji ENDBR, która jest umieszczona na samym początku funkcji. Dodatkowo, analogicznie do mechanizmu kCFI, sprawdzane są następnie skróty, aby zagwarantować niezmienność wskaźników.
    • Dodano ograniczenia blokowania ataków manipulujących generowaniem stanów „oops”, po których problematyczne zadania zostaną zakończone, a stan zostanie przywrócony bez zatrzymywania systemu. Przy bardzo dużej liczbie wywołań stanu „oops” następuje przepełnienie licznika referencji (refcount), co pozwala na wykorzystanie podatności spowodowanych dereferencjami wskaźnika NULL. Aby zabezpieczyć się przed tego typu atakami, do jądra dodano limit maksymalnej liczby wyzwalaczy „oops”, po przekroczeniu którego jądro zainicjuje przejście w stan „paniki”, po którym nastąpi ponowne uruchomienie, co nie pozwoli na osiągnięcie liczba iteracji wymagana do przekroczenia licznika. Domyślnie limit jest ustawiony na 10 tysięcy „oops”, ale w razie potrzeby można go zmienić za pomocą parametru oops_limit.
    • Dodano parametry konfiguracyjne LEGACY_TIOCSTI i sysctllega_tiocsti, aby wyłączyć możliwość umieszczania danych w terminalu za pomocą ioctl TIOCSTI, ponieważ tej funkcjonalności można używać do zastępowania dowolnych znaków w buforze wejściowym terminala i symulowania danych wprowadzanych przez użytkownika.
    • Zaproponowano nowy typ struktury wewnętrznej, encoded_page, w której dolne bity wskaźnika służą do przechowywania dodatkowych informacji służących zabezpieczeniu przed przypadkowym wyłuskaniem wskaźnika (jeżeli wyłuskanie jest rzeczywiście konieczne, te dodatkowe bity muszą zostać najpierw wyczyszczone). .
    • Na platformie ARM64 na etapie bootowania istnieje możliwość włączenia lub wyłączenia programowej implementacji mechanizmu Shadow Stack, który służy do zabezpieczenia przed nadpisaniem adresu zwrotnego z funkcji w przypadku przepełnienia bufora na stosie ( istotą zabezpieczenia jest zapisanie adresu zwrotnego na osobnym stosie „cienia” po przekazaniu sterowania do funkcji i odzyskaniu podanego adresu przed wyjściem z funkcji). Obsługa implementacji sprzętowych i programowych Shadow Stack w jednym zestawie jądra pozwala na użycie jednego jądra w różnych systemach ARM, niezależnie od ich obsługi instrukcji uwierzytelniania wskaźników. Włączenie implementacji oprogramowania odbywa się poprzez podstawienie niezbędnych instrukcji w kodzie podczas ładowania.
    • Dodano obsługę wykorzystania asynchronicznego mechanizmu powiadamiania o wyjściu na procesorach Intel, który umożliwia wykrywanie jednoetapowych ataków na kod wykonywany w enklawach SGX.
    • Zaproponowano zestaw operacji, które umożliwiają hiperwizorowi obsługę żądań z systemów gościa Intel TDX (Trusted Domain Extensions).
    • Ustawienia kompilacji jądra RANDOM_TRUST_BOOTLOADER i RANDOM_TRUST_CPU zostały usunięte na rzecz odpowiednich opcji wiersza poleceń random.trust_bootloader i random.trust_cpu.
    • Mechanizm Landlock, pozwalający na ograniczenie interakcji grupy procesów ze środowiskiem zewnętrznym, dodał obsługę flagi LANDLOCK_ACCESS_FS_TRUNCATE, która umożliwia kontrolę wykonywania operacji obcinania plików.
  • Podsystem sieciowy
    • W przypadku protokołu IPv6 dodano obsługę PLB (Protective Load Balancing), mechanizmu równoważenia obciążenia pomiędzy łączami sieciowymi, mającego na celu zmniejszenie punktów przeciążenia przełączników w centrum danych. Zmieniając etykietę przepływu IPv6, PLB losowo zmienia ścieżki pakietów, aby zrównoważyć obciążenie portów przełącznika. Aby ograniczyć konieczność zmiany kolejności pakietów, operację tę wykonuje się po okresach bezczynności, jeśli jest to możliwe. Zastosowanie PLB w centrach danych Google zmniejszyło nierównowagę obciążenia na portach przełączników średnio o 60%, zmniejszyło utratę pakietów o 33% i zmniejszyło opóźnienia o 20%.
    • Dodano sterownik dla urządzeń MediaTek obsługujących Wi-Fi 7 (802.11be).
    • Dodano obsługę łączy 800-gigabitowych.
    • Добавлена возможность переименования сетевых интерфейсов на лету, без остановки работы.
    • Do komunikatów dziennika o powodzi SYN dodano wzmiankę o adresie IP, na który przybył pakiet.
    • W przypadku protokołu UDP zaimplementowano możliwość używania oddzielnych tablic skrótów dla różnych sieciowych przestrzeni nazw.
    • Dla mostów sieciowych zaimplementowano obsługę metody uwierzytelniania MAB (MAC Authentication Bypass).
    • Dla protokołu CAN (CAN_RAW) zaimplementowano obsługę trybu gniazda SO_MARK w celu dołączania filtrów ruchu opartych na fwmark.
    • ipset implementuje nowy parametr maski bitowej, który umożliwia ustawienie maski na podstawie dowolnych bitów adresu IP (na przykład „ipset create set1 hash:ip bitmask 255.128.255.0”).
    • Dodano obsługę przetwarzania wewnętrznych nagłówków wewnątrz tunelowanych pakietów do nf_tables.
  • Sprzęt
    • Podsystem „accel” został dodany wraz z implementacją frameworka dla akceleratorów obliczeniowych, które mogą być dostarczane albo w postaci pojedynczych układów ASIC, albo w postaci bloków IP wewnątrz SoC i GPU. Akceleratory te mają na celu głównie przyspieszenie rozwiązywania problemów uczenia maszynowego.
    • Sterownik amdgpu obsługuje komponenty GC, PSP, SMU i NBIO IP. W przypadku systemów ARM64 zaimplementowano obsługę DCN (Display Core Next). Implementacja chronionego wyjścia ekranowego została przeniesiona z DCN10 na DCN21 i można jej teraz używać podczas podłączania wielu ekranów.
    • Sterownik i915 (Intel) ma ustabilizowaną obsługę dyskretnych kart graficznych Intel Arc (DG2/Alchemist).
    • Sterownik Nouveau obsługuje procesory graficzne NVIDIA GA102 (RTX 30) oparte na architekturze Ampere. Dla kart nva3 (GT215) dodana została możliwość sterowania podświetleniem.
    • Dodano obsługę kart bezprzewodowych opartych na układach Realtek 8852BE, Realtek 8821CU, 8822BU, 8822CU, 8723DU (USB) i MediaTek MT7996, interfejsach Bluetooth Broadcom BCM4377/4378/4387, a także kontrolerach Motorcomm yt8521, NVIDIA Tegra GE Ethernet.
    • Dodano obsługę ASoC (ALSA System on Chip) dla wbudowanych układów dźwiękowych HP Stream 8, Advantech MICA-071, Dell SKU 0C11, Intel ALC5682I-VD, Xiaomi Redmi Book Pro 14 2022, i.MX93, Armada 38x, RK3588. Dodano obsługę interfejsu audio Focusrite Saffire Pro 40. Dodano kodek audio Realtek RT1318.
    • Dodano obsługę smartfonów i tabletów Sony (Xperia 10 IV, 5 IV, X i X Compact, OnePlus One, 3, 3T i Nord N100, Xiaomi Poco F1 i Mi6, Huawei Watch, Google Pixel 3a, Samsung Galaxy Tab 4 10.1.
    • Dodano obsługę ARM SoC i Apple T6000 (M1 Pro), T6001 (M1 Max), T6002 (M1 Ultra), Qualcomm MSM8996 Pro (Snapdragon 821), SM6115 (Snapdragon 662), SM4250 (Snapdragon 460), SM6375 (Snapdragon 695) płyty , SDM670 (Snapdragon 670), MSM8976 (Snapdragon 652), MSM8956 (Snapdragon 650), RK3326 Odroid-Go/rg351, Zyxel NSA310S, InnoComm i.MX8MM, Odroid Go Ultra.

W tym samym czasie Latin American Free Software Foundation stworzyła wersję całkowicie darmowego jądra 6.2 - Linux-libre 6.2-gnu, oczyszczoną z elementów oprogramowania sprzętowego i sterowników zawierających zastrzeżone komponenty lub sekcje kodu, których zakres jest ograniczony przez wytwórca. Nowa wersja usuwa nowe plamy w sterowniku nouveau. Ładowanie obiektów BLOB jest wyłączone w sterownikach Bluetooth mt7622, ​​mt7996 i bcm4377. Wyczyszczono nazwy obiektów blob w plikach dts dla architektury Aarch64. Zaktualizowano kod czyszczenia obiektów blob w różnych sterownikach i podsystemach. Zatrzymano czyszczenie sterownika s5k4ecgx, ponieważ został on usunięty z jądra.

Źródło: opennet.ru

Dodaj komentarz