Wydanie jądra Linuksa 5.7

Po dwóch miesiącach prac nad Linusem Torvaldsem wprowadzono wydanie jądra Linux 5.7. Wśród najbardziej zauważalnych zmian: nowa implementacja systemu plików exFAT, moduł bareudp do tworzenia tuneli UDP, ochrona oparta na uwierzytelnianiu wskaźników dla ARM64, możliwość dołączania programów BPF do handlerów LSM, nowa implementacja Curve25519, split- wykrywacz blokad, kompatybilność BPF z PREEMPT_RT, usunięcie limitu 80-znakowego rozmiaru linii w kodzie, uwzględnienie wskaźników temperatury procesora w harmonogramie zadań, możliwość użycia clone() do spawnowania procesów w innej grupie c, ochrona przed zapisem do pamięci za pomocą userfaultfd.

Nowa wersja zawiera 15033 1961 poprawek od XNUMX programistów,
rozmiar poprawki - 39 MB (zmiany dotyczyły 11590 plików, dodano 570560 linii kodu,
Usunięto 297401 wierszy). Około 41% wszystkich przedstawionych w 5.7
zmiany dotyczą sterowników urządzeń, około 16% zmian dotyczy
nastawienie do aktualizacji kodu specyficznego dla architektur sprzętowych, 13%
związane ze stosem sieciowym, 4% z systemami plików i 4% z wewnętrznymi
podsystemy jądra.

Głównym innowacje:

  • Podsystem dyskowy, wejścia/wyjścia i systemy plików
    • Dodano nową implementację sterownika exFAT, założony w oparciu o aktualną bazę kodu „sdfat” (2.x) opracowaną przez firmę Samsung dla smartfonów z systemem Android. Sterownik dodany wcześniej do jądra był oparty na starszym kodzie Samsunga (wersja 1.2.9) i był o około 10% gorszy pod względem wydajności od nowego sterownika. Przypomnijmy, że dodanie do jądra obsługi exFAT stało się możliwe po Microsoftie опубликовала specyfikacji publicznych i udostępnił patenty exFAT do bezpłatnego użytku w systemie Linux.
    • Btrfs implementuje nową komendę ioctl() - BTRFS_IOC_SNAP_DESTROY_V2, która pozwala na usunięcie podsekcji według jej identyfikatora. Zapewniona jest pełna obsługa klonowania zakresów wbudowanych. Zwiększona została liczba punktów anulowania operacji redystrybucyjnych, co skróciło długi czas oczekiwania na wykonanie polecenia „skasowanie salda”. Przyspieszono określanie linków zwrotnych do zakresów (np. skrócono czas wykonania skryptu testowego z godziny do kilku minut). Dodano możliwość dołączenia drzewa zasięgu pliku do każdego i-węzła. Schemat blokowania używany podczas zapisu do podpartycji i przy wykluczaniu NOCOW został przeprojektowany. Poprawiona wydajność wykonywania fsync dla zakresów.
    • XFS ulepszył sprawdzanie metadanych i fsck dla aktywnych partycji. Zaproponowano bibliotekę do przebudowy struktur btree, która w przyszłości posłuży do przerobienia xfs_repair i zaimplementowania możliwości odzyskiwania bez odmontowywania partycji.
    • Do CIFS dodano eksperymentalną obsługę umieszczania partycji wymiany w magazynach SMB3. Zaimplementowano rozszerzenia POSIX do readdir, zdefiniowane w specyfikacji SMB3.1.1. Poprawiona wydajność zapisu dla stron o rozmiarze 64 KB, gdy włączony jest tryb cache=strict i używane są wersje protokołu 2.1 lub nowsze.
    • FS EXT4 został przeniesiony z bmap i iopoll do korzystania z iomap.
    • F2FS zapewnia opcjonalną obsługę kompresji danych przy użyciu algorytmu zstd. Domyślnie do kompresji używany jest algorytm LZ4. Dodano obsługę polecenia „chattr -c commit”. Dostępny jest wyświetlacz czasu montażu. Dodano ioctl F2FS_IOC_GET_COMPRESS_BLOCKS, aby uzyskać informacje o liczbie skompresowanych bloków. Dodano wyjście danych kompresji poprzez statx.
    • System plików Ceph dodał możliwość lokalnego wykonywania operacji tworzenia i usuwania plików (odłączania) bez oczekiwania na odpowiedź z serwera (praca w trybie asynchronicznym). Zmiana może na przykład znacznie poprawić wydajność podczas uruchamiania narzędzia rsync.
    • Do OVERLAYFS dodano możliwość używania virtiofs jako systemu plików najwyższego poziomu.
    • Przepisany kod przechodzenia ścieżki w VFS, przerobiono kod analizy dowiązania symbolicznego i ujednolicono przechodzenie przez punkt podłączenia.
    • W podsystemie scsi dla użytkowników nieuprzywilejowanych dozwolony wykonywanie poleceń ZBC.
    • W dm_writecache wdrożone możliwość stopniowego czyszczenia pamięci podręcznej na podstawie parametru max_age, który określa maksymalny czas życia bloku.
    • W dm_integrity dodany obsługa operacji „odrzuć”.
    • W null_blk dodany obsługa zastępowania błędów w celu symulowania awarii podczas testowania.
    • Dodany możliwość wysyłania powiadomień udev o zmianach rozmiaru urządzenia blokowego.
  • Podsystem sieciowy
    • Dołączony filtr sieciowy zmiany, znacznie przyspieszając przetwarzanie dużych list dopasowań (zestawów nftables), które wymagają sprawdzenia kombinacji podsieci, portów sieciowych, protokołu i adresów MAC.
      Optymalizacje zrobiony do modułu nft_set_pipapo (PIle PAcket POlicies), który rozwiązuje problem dopasowywania zawartości pakietu do dowolnych zakresów stanów pól używanych w regułach filtrowania, takich jak zakresy adresów IP i portów sieciowych (nft_set_rbtree i nft_set_hash manipulują dopasowywaniem przedziałów i bezpośrednim odbiciem wartości ). Wersja pipapo wektoryzowana przy użyciu 256-bitowych instrukcji AVX2 w systemie z procesorem AMD Epyc 7402 wykazała 420% wzrost wydajności podczas analizowania 30 tysięcy rekordów, w tym kombinacji port-protokół. Wzrost po porównaniu kombinacji podsieci i numeru portu podczas analizowania 1000 rekordów wyniósł 87% dla protokołu IPv4 i 128% dla protokołu IPv6.

    • обавлен moduł bareudp, który umożliwia hermetyzację różnych protokołów L3, takich jak MPLS, IP i NSH, w tunelu UDP.
    • Kontynuowana jest integracja komponentów MPTCP (MultiPath TCP), stanowiących rozszerzenie protokołu TCP do organizowania działania połączenia TCP z dostarczaniem pakietów jednocześnie kilkoma trasami przez różne interfejsy sieciowe powiązane z różnymi adresami IP.
    • Dodany obsługa mechanizmów akceleracji sprzętowej do enkapsulacji ramek Ethernet w standardzie 802.11 (Wi-Fi).
    • Podczas przenoszenia urządzenia z jednej przestrzeni nazw sieciowych do drugiej dostosowywane są prawa dostępu i własność odpowiednich plików w sysfs.
    • Dodano możliwość użycia flagi SO_BINDTODEVICE dla użytkowników innych niż root.
    • Zaakceptowano trzecią część poprawek, konwertującą zestaw narzędzi ethtool z ioctl() do korzystania z interfejsu netlink. Nowy interfejs ułatwia dodawanie rozszerzeń, poprawia obsługę błędów, umożliwia wysyłanie powiadomień w przypadku zmiany stanu, upraszcza interakcję pomiędzy jądrem a przestrzenią użytkownika oraz zmniejsza liczbę nazwanych list wymagających synchronizacji.
    • Dodano możliwość wykorzystania specjalnych akceleratorów sprzętowych do wykonywania operacji śledzenia połączeń.
    • W filtrze sieciowym dodany hak do łączenia klasyfikatorów pakietów wychodzących (egress), który uzupełnił istniejący wcześniej hook dla pakietów przychodzących (ingres).
  • Wirtualizacja i bezpieczeństwo
    • Dodano sprzętową implementację uwierzytelniania wskaźników (Uwierzytelnianie wskaźnika), który wykorzystuje wyspecjalizowane instrukcje procesora ARM64 do ochrony przed atakami z wykorzystaniem technik programowania zwrotnego (ROP), w których atakujący nie próbuje umieścić swojego kodu w pamięci, ale działa na fragmentach instrukcji maszynowych dostępnych już w załadowanych bibliotekach, kończąc z instrukcją powrotu sterującego. Bezpieczeństwo sprowadza się do używania podpisów cyfrowych do weryfikacji adresów zwrotnych na poziomie jądra. Podpis jest przechowywany w nieużywanych górnych bitach samego wskaźnika. W przeciwieństwie do wdrożeń oprogramowania, tworzenie i weryfikacja podpisów cyfrowych odbywa się za pomocą specjalnych instrukcji procesora.
    • Dodany możliwość ochrony obszaru pamięci przed zapisem za pomocą wywołania systemowego userfaultfd(), zaprojektowanego do obsługi błędów stron (dostęp do nieprzydzielonych stron pamięci) w przestrzeni użytkownika. Pomysł polega na tym, aby użyć userfaultfd() zarówno do wykrywania naruszeń dostępu do stron oznaczonych jako chronione przed zapisem, jak i do wywoływania procedury obsługi, która może odpowiedzieć na takie próby zapisu (na przykład do obsługi zmian podczas tworzenia migawek działających procesów, stanu przechwytywanie podczas zrzucania zrzutów pamięci na dysk, wdrażanie pamięci współdzielonej, śledzenie zmian w pamięci). Funkcjonalność równowartość używając mprotect() w połączeniu z procedurą obsługi sygnału SIGSEGV, ale działa ona zauważalnie szybciej.
    • SELinux wycofał parametr „checkreqprot”, który umożliwia wyłączenie kontroli ochrony pamięci podczas przetwarzania reguł (umożliwiając korzystanie z wykonywalnych obszarów pamięci, niezależnie od reguł określonych w regułach). Dowiązania symboliczne Kernfs mogą dziedziczyć kontekst swoich katalogów nadrzędnych.
    • Struktura dołączony moduł KRSI, który pozwala na dołączanie programów BPF do dowolnych zaczepów LSM w jądrze. Zmiana umożliwia tworzenie modułów LSM (Linux Security Module) w postaci programów BPF w celu rozwiązywania problemów audytowych i obowiązkowej kontroli dostępu.
    • Przeprowadzone Optymalizuje wydajność /dev/random poprzez grupowanie wartości CRNG zamiast indywidualnego wywoływania instrukcji RNG. Poprawiono wydajność getrandom i /dev/random na systemach ARM64 dostarczających instrukcje RNG.
    • Implementacja krzywej eliptycznej Curve25519 zastąpiony dla opcji z biblioteki HACL, dla którego dany matematyczny dowód formalnej weryfikacji wiarygodności.
    • обавлен mechanizm informowania o wolnych stronach pamięci. Korzystając z tego mechanizmu, systemy gościa mogą przesyłać informacje o stronach, które nie są już używane do systemu hosta, a host może odebrać dane strony.
    • W vfio/pci dodany obsługa SR-IOV (wirtualizacja we/wy z jednym korzeniem).
  • Usługi pamięci i systemu
    • Od 80 do 100 znaków zwiększony ograniczenie maksymalnej długości wiersza w tekstach źródłowych. Jednocześnie programistom nadal zaleca się, aby nie przekraczali 80 znaków w wierszu, ale nie jest to już sztywny limit. Ponadto przekroczenie limitu rozmiaru linii będzie teraz skutkować ostrzeżeniem o kompilacji tylko wtedy, gdy łatka kontrolna zostanie uruchomiona z opcją „--strict”. Zmiana pozwoli nie odwracać uwagi programistów manipulacja ze spacjami i poczuj większą swobodę podczas wyrównywania kodu, a także zapobiegnie nadmierne łamanie linii, niepokojący zrozumienie kodu i wyszukiwanie.
    • Dodany obsługa mieszanego trybu rozruchu EFI, który umożliwia załadowanie 64-bitowego jądra z 32-bitowego oprogramowania sprzętowego działającego na 64-bitowym procesorze bez użycia specjalistycznego programu ładującego.
    • Dołączony system identyfikacji i debugowania dzielonych zamków („zamek dzielony"), co ma miejsce podczas uzyskiwania dostępu do niewyrównanych danych w pamięci, ponieważ podczas wykonywania instrukcji atomowej dane przecinają dwie linie pamięci podręcznej procesora. Takie blokowanie powoduje znaczny spadek wydajności (1000 cykli wolniej niż operacja atomowa na danych mieszczących się w jednej linii pamięci podręcznej). W zależności od parametru startowego „split_lock_detect”, jądro może wykryć takie blokady na bieżąco i wydać ostrzeżenie lub wysłać sygnał SIGBUS do aplikacji powodującej blokadę.
    • Harmonogram zadań zapewnia śledzenie czujników temperatury (Ciśnienie termiczne) i wdrożono z uwzględnieniem przegrzania podczas umieszczania zadań. Korzystając z dostarczonych statystyk, regulator termiczny może dostosować maksymalną częstotliwość procesora w przypadku przegrzania, a harmonogram zadań uwzględnia teraz zmniejszenie mocy obliczeniowej spowodowane takim zmniejszeniem częstotliwości podczas planowania uruchamiania zadań (wcześniej harmonogram odpowiadał na zmiany częstotliwością z pewnym opóźnieniem, przez pewien czas podejmując decyzje w oparciu o zawyżone założenia co do dostępnych zasobów obliczeniowych).
    • Harmonogram zadań zawiera wskaźniki niezmienne śledzenie obciążenia, umożliwiające prawidłowe oszacowanie obciążenia, niezależnie od aktualnej częstotliwości pracy procesora. Zmiana pozwala dokładniej przewidzieć zachowanie zadań w warunkach dynamicznych zmian napięcia i częstotliwości procesora. Na przykład zadanie, które pochłonęło 1/3 zasobów procesora przy 1000 MHz, pochłonie 2/3 zasobów, gdy częstotliwość spadnie do 500 MHz, co wcześniej stworzyło fałszywe założenie, że działało z pełną wydajnością (tj. zadania pojawiły się większy dla programu planującego jedynie poprzez zmniejszenie częstotliwości, co doprowadziło do podejmowania błędnych decyzji w regulatorze schedutil cpufreq).
    • Sterownik Intel P-state, który odpowiada za wybór trybów wydajności, został przełączony na użycie harmonogram.
    • Zaimplementowano możliwość wykorzystania podsystemu BPF, gdy jądro pracuje w czasie rzeczywistym (PREEMPT_RT). Poprzednio, gdy był włączony PREEMPT_RT, wymagane było wyłączenie BPF.
    • Dodano nowy typ programu BPF - BPF_MODIFY_RETURN, który można podpiąć do funkcji w jądrze i zmienić wartość zwracaną przez tę funkcję.
    • Dodany okazja Użycie wywołania systemowego clone3() do utworzenia procesu w grupie c, która różni się od nadrzędnej grupy c, umożliwiając procesowi nadrzędnemu zastosowanie ograniczeń i włączenie rozliczania natychmiast po utworzeniu nowego procesu lub wątku. Na przykład menedżer usług może bezpośrednio przydzielić nowe usługi do oddzielnych grup, a nowe procesy umieszczone w „zamrożonych” grupach zostaną natychmiast zatrzymane.
    • w Kbuild dodany obsługa zmiennej środowiskowej „LLVM=1”, aby przełączyć się na zestaw narzędzi Clang/LLVM podczas budowania jądra. Podniesiono wymagania dla wersji binutils (2.23).
    • Do debugfs dodano sekcję /sys/kernel/debug/kunit/ z wynikami testów kunit.
    • Dodano parametr rozruchowy jądra pm_debug_messages (analogiczny do /sys/power/pm_debug_messages), który umożliwia wyprowadzanie informacji debugowania o działaniu systemu zarządzania energią (przydatne podczas debugowania problemów z hibernacją i trybem gotowości).
    • Do asynchronicznego interfejsu we/wy io_uring dodano wsparcie splatać() и wybór buforu atomowego.
    • Ulepszone profilowanie grup cgroup przy użyciu zestawu narzędzi perf. Wcześniej perf mógł profilować zadania tylko w określonej grupie c i nie mógł dowiedzieć się, do której grupy c należy bieżąca próbka. perf otrzymuje teraz informacje o grupie cgroup dla każdej próbki, co pozwala na profilowanie więcej niż jednej grupy cgroup i stosowanie sortowania według
      cgroup w raportach.

    • cgroupfs, pseudo-FS do zarządzania grupami cgroup, dodał obsługę rozszerzonych atrybutów (xattrs), dzięki którym możesz na przykład pozostawić dodatkowe informacje dla procedur obsługi w przestrzeni użytkownika.
    • W kontrolerze pamięci cgroup dodanyoraz wsparcie dla rekurencyjnej ochrony wartości „memory.low”, która reguluje minimalną ilość pamięci RAM udostępnianej członkom grupy. Podczas montowania hierarchii cgroup z opcją „memory_recursiveprot”, wartość „memory.low” ustawiona dla niższych węzłów zostanie automatycznie rozesłana do wszystkich węzłów podrzędnych.
    • обавлен Struktura Uacce (Unified/User-space-access-intended Accelerator Framework) do współdzielenia adresów wirtualnych (SVA, Shared Virtual Addressing) pomiędzy procesorem a urządzeniami peryferyjnymi, umożliwiając akceleratorom sprzętowym dostęp do struktur danych w głównym procesorze.
  • Architektury sprzętowe
    • Dla architektury ARM zaimplementowano możliwość pobierania pamięci na gorąco.
    • Dla architektury RISC-V dodano obsługę podłączania i usuwania procesorów podczas pracy (CPU hotplug). W przypadku 32-bitowego RISC-V zaimplementowano eBPF JIT.
    • Usunięto możliwość używania 32-bitowych systemów ARM do uruchamiania środowisk gościnnych KVM.
    • Usunięto „fikcyjną” implementację NUMA dla architektury s390, dla której nie znaleziono żadnych przypadków użycia pozwalających uzyskać poprawę wydajności.
    • Dla ARM64 dodano obsługę rozszerzenia AMU (Activity Monitors Unit), zdefiniowanego w ARMv8.4 i udostępniającego liczniki wydajności, które są używane do obliczania współczynników korekcji skalowania częstotliwości w harmonogramie zadań.
  • Sprzęt
    • Dodany obsługa urządzeń vDPA korzystających z kanału wymiany danych zgodnego ze specyfikacjami virtio. Urządzenia vDPA mogą być fizycznie podłączonymi urządzeniami lub urządzeniami wirtualnymi emulowanymi programowo.
    • W podsystemie GPIO pojawił się nowa komenda ioctl() służąca do monitorowania zmian, pozwalająca informować proces o zmianach stanu dowolnej linii GPIO. Jako przykład użycia nowego polecenia zaproponowane Narzędzie gpio-watch.
    • W sterowniku i915 DRM dla kart graficznych Intel w zestawie domyślna obsługa chipów Tigerlake („Gen12”) i dodana wstępna obsługa sterowania podświetleniem OLED. Ulepszona obsługa chipów Ice Lake, Elkhart Lake, Baytrail i Haswell.
    • W sterowniku amdgpu dodany możliwość załadowania oprogramowania sprzętowego do układu USBC dla ASIC. Ulepszona obsługa układów AMD Ryzen 4000 „Renoir”. Dostępna jest teraz obsługa sterowania panelami OLED. Udostępniono wyświetlanie stanu oprogramowania sprzętowego w debugfs.
    • Do sterownika vmwgfx DRM dla systemów wirtualizacji VMware dodano możliwość wykorzystania OpenGL 4 w systemach gościnnych (wcześniej obsługiwany był OpenGL 3.3).
    • Dodano nowe informacje o sterownikach DRM dla systemu wyświetlania platformy TI Keystone.
    • Dodano sterowniki do paneli LCD: Feixin K101 IM2BA02, Samsung s6e88a0-ams452ef01, Novatek NT35510, Elida KD35T133, EDT, NewEast Optoelectronics WJFH116008A, Rocktech RK101II01D-CT, Frida FRD350H54004.
    • Do systemu zarządzania energią dodany obsługa platformy Intel Jasper Lake (JSL) opartej na Atom.
    • Dodano obsługę laptopa Pinebook Pro opartego na Rockchip RK3399, tabletu i smartfona Pine64 PineTab PinePhone oparty na Allwinnerze A64.
    • Dodano obsługę nowych kodeków i układów audio:
      Amlogic AIU, Amlogic T9015, Texas Instruments TLV320ADCX140, Realtek RT5682, ALC245, Broadcom BCM63XX I2S, Maxim MAX98360A, Presonus Studio 1810c, MOTU MicroBook IIc.

    • Dodano obsługę płyt i platform ARM Qualcomm Snapdragon 865 (SM8250), IPQ6018, NXP i.MX8M Plus, Kontron „sl28”, 11 i.MX6 Opcje płyt TechNexion Pico, trzy nowe opcje Toradex Colibri, Samsung S7710 Galaxy Xcover 2 oparty na ST -Ericsson u8500, DH Electronics DHCOM SoM i PDK2, Renesas M3ULCB, Hoperun HiHope, Linutronix Testbox v2, PocketBook Touch Lux 3.

Źródło: opennet.ru

Dodaj komentarz