Po dwóch miesiącach prac Linus Torvalds wydał jądro . Wśród najważniejszych zmian znajdują się: ograniczenie importu symboli z modułów proprietary do modułów GPL, przyspieszenie operacji przełączania kontekstów za pomocą instrukcji procesora FSGSBASE, wsparcie dla kompresji obrazu jądra za pomocą Zstd, przeprojektowanie priorytetów dla wątków w jądrze, wsparcie dla protokołu PRP (Parallel Redundancy Protocol), harmonogramowanie z uwzględnieniem przepustowości w harmonogramie deadline, prognozowane pakowanie stron pamięci, flaga capability CAP_CHECKPOINT_RESTOR, wywołanie systemowe close_range(), zwiększenie wydajności dm-crypt, usunięcie kodu dla 32-bitowych systemów gościnnych Xen PV, nowy mechanizm zarządzania pamięcią slab, opcja „rescue” w Btrfs, wsparcie dla szyfrowania inline w ext4 i F2FS.
W nowej wersji uwzględniono 16074 poprawek od 2011 programistów,
rozmiar poprawki wynosi 62 MB (zmiany dotyczyły 14548 plików, dodano 782155 linijek kodu, usunięto 314792 linijek). Około 45% wszystkich przedstawionych w 5.9
zmian dotyczy sterowników urządzeń, około 15% zmian dotyczy
związek z aktualizacją kodu specyficznego dla architektur sprzętowych, 13%
stosu sieciowego, 3% dotyczy systemów plików i 3% dotyczą wewnętrznych
podsystemami jądra.
:
- Pamięć i usługi systemowe
- ochrona przed używaniem nakładek GPL do wiązania proprietary sterowników z komponentami jądra dostępnymi tylko dla modułów na licencji GPL. Flaga TAINT_PROPRIETARY_MODULE teraz dziedziczy we wszystkich modułach, które importują symbole z modułów z tą flagą. Jeśli moduł GPL spróbuje zaimportować symbole z modułu nie-GPL, ten moduł GPL odziedziczy znacznik TAINT_PROPRIETARY_MODULE i nie będzie mógł uzyskiwać dostępu do komponentów jądra dostępnych tylko dla modułów na licencji GPL, nawet jeśli moduł wcześniej zaimportował symbole z kategorii „gplonly”. Wsteczna blokada (eksport tylko EXPORT_SYMBOL_GPL w modułach, które zaimportowały EXPORT_SYMBOL_GPL), która mogła wpłynąć na działanie proprietary sterowników, nie została wdrożona (dziedziczona jest tylko flaga modułu proprietary, ale nie związki GPL).
- wsparcie dla mechanizmu kcompactd dla w tle, umożliwiając zwiększenie liczby dużych stron pamięci dostępnych dla jądra. Wstępne szacunki pokazują, że pakowanie w tle z minimalnymi kosztami transakcyjnymi pozwala na 70-80 razy zmniejszyć opóźnienia przy alokacji dużych stron pamięci (huge-page) w porównaniu do wcześniej stosowanego mechanizmu pakowania, aktywowanego w razie potrzeby (on-demand). Dodano sysctl vm.compaction_proactiveness, aby ustalić granice zewnętrznej fragmentacji, którą zapewni kcompactd.
- wsparcie dla kompresji obrazu jądra z wykorzystaniem algorytmu (zstd).
- Dla systemów x86 zaimplementowano wsparcie instrukcji procesora , pozwalającej na odczyt i modyfikację zawartości rejestrów FS/GS z przestrzeni użytkownika. W jądrze FSGSBASE jest używane do przyspieszenia operacji przełączania kontekstu poprzez wyeliminowanie zbędnych operacji zapisu MSR dla GSBASE, a w przestrzeni użytkownika pozwala uniknąć zbędnych wywołań systemowych do zmiany FS/GS.
- parametr „allow_writes”, który pozwala na zablokowanie zmian rejestrów MSR procesora z przestrzeni użytkownika i ogranicza dostęp do zawartości tych rejestrów do operacji odczytu, ponieważ zmiana MSR może prowadzić do problemów. Domyślnie zapis nie jest jeszcze zabroniony, a zmiana MSR jest rejestrowana w logach, ale w przyszłości planuje się przestawić dostęp domyślny w tryb tylko do odczytu.
- W interfejsie asynchronicznego wejścia/wyjścia dodano pełne wsparcie dla asynchronicznych operacji buforowanego odczytu, które nie wymagają angażowania wątków jądra. Wsparcie dla zapisu oczekiwane jest w następnej wersji.
- W planowaniu wejścia/wyjścia deadline planowanie z uwzględnieniem przepustowości, podejmować prawidłowe decyzje w systemach asymetrycznych, takich jak systemy ARM oparte na architekturach i big.LITTLE, łączące w jednym chipie potężne i mniej wydajne, energooszczędne rdzenie CPU. W szczególności nowy tryb pozwala uniknąć niespójności w planowaniu, kiedy wolne rdzenie CPU nie mają odpowiednich zasobów do wykonania zadania w wyznaczonym terminie.
- Model zużycia energii w jądrze (framework Energy Model) teraz nie tylko zachowanie zużycia energii CPU, ale także obejmuje urządzenia peryferyjne.
- Zrealizowano wywołanie systemowe close_range(), które pozwala procesowi zamknąć cały zakres otwartych deskryptorów plików na raz.
- Z implementacji tekstowej konsoli i sterownika fbcon , który zapewnia możliwość programowego przewijania tekstu wstecz (CONFIG_VGACON_SOFT_SCROLLBACK) o więcej niż objętość pamięci wideo trybu tekstowego VGA.
- algorytm przydzielania priorytetów dla wątków wewnątrz jądra. Nowa wersja zapewnia lepszą spójność we wszystkich podsystemach jądra przy przydzielaniu priorytetów dla zadań czasu rzeczywistego.
- Dodano sysctl do zarządzania parametrami wymuszania częstotliwości CPU dla zadań czasu rzeczywistego (na przykład można na bieżąco zmieniać zachowanie podczas wykonywania zadań czasu rzeczywistego, aby oszczędzać energię po przełączeniu na zasilanie z akumulatora lub w systemach mobilnych).
- Przeprowadzono przygotowanie do implementacji wsparcia dla technologii Transparent Huge Pages w pamięci podręcznej stron.
- W mechanizmie fanotify wprowadzono nowe flagi FAN_REPORT_NAME i FAN_REPORT_DIR_FID do przesyłania informacji o nazwie nadrzędnej i unikalnym identyfikatorze FID podczas zdarzeń tworzenia, usuwania lub przenoszenia elementów katalogu oraz obiektów niezwiązanych z katalogami.
- Dla cgroups nowy kontroler przydzielania pamięci slab (kontroler pamięci slab), który wyróżnia się przeniesieniem rachunkowości slab z poziomu stron pamięci na poziom obiektów jądra, co pozwala na współdzielenie stron slab w różnych cgroup, zamiast przydzielania oddzielnych pamięci podręcznych slab dla każdej cgroup. Proponowane podejście pozwala zwiększyć efektywność wykorzystania slab, zmniejszyć o 30-45% rozmiar używanej pamięci dla slab, znacznie zmniejszyć całkowite zużycie pamięci przez jądro i zmniejszyć fragmentację pamięci.
- W podsystemie dźwięku i , zgodnie z zaleceniami dotyczącymi użycia inkluzywnej terminologii w jądrze Linux, przeprowadzono czyszczenie niepoprawnych terminów. Kod został oczyszczony z użycia słów „slave”, „master”, „blacklist” i „whitelist”.
- Wirtualizacja i bezpieczeństwo
- Podczas kompilacji jądra z użyciem kompilatora Clang możliwość konfiguracji (CONFIG_INIT_STACK_ALL_ZERO) automatycznej inicjalizacji zerowym wartościami wszystkich zmiennych przechowywanych na stosie (podczas kompilacji wskazuje się „-ftrivial-auto-var-init=zero”).
- W podsystemie seccomp, podczas korzystania z trybu monitorowania procesu w przestrzeni użytkownika, podstawienia w monitorowanym procesie deskryptorów plików, aby w pełni emulować wywołania systemowe prowadzące do tworzenia deskryptorów plików. Funkcjonalność ta jest poszukiwana w systemach izolowanych kontenerów i realizacji sandbox dla Chrome.
- Dla architektur xtensa i csky dodano wsparcie dla ograniczania wywołań systemowych za pomocą podsystemu seccomp. Dla xtensa dodatkowo zrealizowano wsparcie dla mechanizmu audytu.
- nowy flaga capability CAP_CHECKPOINT_RESTORE, pozwalająca na uzyskanie dostępu do możliwości związanych z zamrażaniem i przywracaniem stanu procesów bez przekazywania dodatkowych uprawnień.
- W GCC 11 zrealizowano wszystkie możliwości niezbędne dla
narzędzia do debugowania KCSAN (Kernel Concurrency Sanitizer), przeznaczonego do dynamicznego wykrywania stanów wyścigowych w jądrze. Tak więc, KCSAN może być teraz używany z jądrami skompilowanymi w GCC. - Dla AMD Zen i nowszych modeli CPU wsparcie dla technologii P2PDMA, pozwalającej na użycie DMA do bezpośredniego przesyłania danych między pamięcią dwóch urządzeń podłączonych do magistrali PCI.
- W dm-crypt dodano tryb umożliwiający skrócenie opóźnień, wykonując przetwarzanie kryptograficzne danych bez wykorzystania kolejek roboczych. Wskazany tryb jest również niezbędny do prawidłowego działania z urządzeniami blokowymi (urządzenia z obszarami, które muszą być zapisywane sekwencyjnie z aktualizacją całej grupy bloków). Przeprowadzono prace nad zwiększeniem przepustowości i zmniejszeniem opóźnień w dm-crypt.
- Usunięto kod do obsługi 32-bitowych systemów gościnnych działających w trybie parawirtualizacji pod zarządzaniem hipernadzorcy Xen. Użytkownicy takich systemów powinni przejść na użycie 64-bitowych jąder w środowiskach gościnnych lub zastosować do uruchamiania środowisk zamiast parawirtualizacji (PV) tryby pełnej (HVM) lub połączonej (PVH) wirtualizacji.
- Podsystem dyskowy, wejście/wyjście i systemy plików
- W systemie plików Btrfs opcja montowania „rescue”, ujednolicająca dostęp do wszystkich innych opcji do odzyskiwania. Usunięto wsparcie dla opcji „alloc_start” i „subvolrootid”, ogłoszono przestarzałą opcję „inode_cache”. Przeprowadzono optymalizację wydajności, szczególnie zauważalnie przyspieszono wykonywanie operacji fsync(). możliwość wykorzystania alternatywnych typów sum kontrolnych, różnych od CRC32c.
- możliwość korzystania z inline-szyfrowania (Inline Encryption) w systemach plików ext4 i F2FS, którego włączenie przewiduje opcja montowania «inlinecrypt». Tryb inline-szyfrowania pozwala wykorzystać wbudowane w kontroler dysku mechanizmy szyfrowania, które dokonują przezroczystego szyfrowania i deszyfrowania operacji wejścia/wyjścia.
- W XFS czyszczenie inode (flush) w całkowicie asynchronicznym trybie, nie blokując procesów podczas wykonywania operacji czyszczenia pamięci. Rozwiązano stary problem z kwotami, przez który nieprawidłowo śledzono ostrzeżenia o przekroczeniu miękkiego limitu i ograniczeń liczby inode. Ujednolicono realizację wsparcia DAX dla ext4 i xfs.
- W Ext4 wyprzedzające ładowanie bitmap rozkładu bloków. W połączeniu z ograniczeniem skanowania nieinicjowanych grup, optymalizacja pozwoliła skrócić czas montowania bardzo dużych partycji.
- W F2FS ioctl F2FS_IOC_SEC_TRIM_FILE, umożliwiający wykorzystanie komend TRIM/discard do fizycznego zerowania wskazanych danych w pliku, na przykład do usuwania kluczy dostępu bez pozostawiania na dysku danych residualnych.
W F2FS również nowy tryb zbierania śmieci GC_URGENT_LOW, działający bardziej agresywnie poprzez wyłączenie niektórych kontroli stanu bezczynności (idle) przed uruchomieniem zbieracza śmieci. - W bcache rozmiar bucket_size dla rozszerzeń zwiększono z 16 do 32 bitów w ramach przygotowań do zapewnienia możliwości stosowania dla pamięci podręcznej zróżnicowanych urządzeń.
- W podsystemie SCSI dodano możliwość korzystania z inline-szyfrowania na podstawie wbudowanych środków sprzętowego szyfrowania, oferowanych przez kontrolery UFS ().
- Dodano nowy parametr wiersza poleceń jądra «debugfs», umożliwiający zarządzanie dostępnością o tej samej nazwie pseudo-FS.
- W kliencie NFSv4.2 zapewniono wsparcie dla rozszerzonych atrybutów plików (xattr).
- W dm-dust interfejs do wyświetlania jednorazowej listy wszystkich wykrytych bad-bloków na dysku («dmsetup message dust1 0 listbadblocks»).
- Dla md/raid5 dodano parametr /sys/block/md1/md/stripe_size do konfiguracji rozmiaru bloku STRIPE.
- Dla urządzeń magazynujących NVMe wsparcie dla komend do strefowania pamięci (ZNS, NVM Express Zoned Namespace), umożliwiające podział przestrzeni na strefy, stanowiące grupy bloków, dla pełniejszego zarządzania rozmieszczeniem danych na dysku.
- Subsystem sieciowy
- W Netfilter możliwość odrzucania pakietów na etapie przed sprawdzeniem trasowania (wyrażenie REJECT może być używane nie tylko w łańcuchach INPUT, FORWARD i OUTPUT, ale także na etapie PREROUTING dla icmp i tcp).
- W nftables możliwość audytu zdarzeń związanych ze zmianą konfiguracji.
- W nftables w interfejsie API netlink wsparcie dla anonimowych łańcuchów, których nazwy są dynamicznie nadawane przez jądro. Po usunięciu reguły związanej z anonimowym łańcuchem, sam łańcuch również zostaje usunięty.
- W BPF dodano wsparcie dla iteratorów do przeszukiwania, filtrowania i modyfikacji elementów tablic asocjacyjnych (map) bez kopiowania danych do przestrzeni użytkownika. Iteratory mogą być używane dla gniazd TCP i UDP, co pozwala programom BPF przeszukiwać listy otwartych gniazd i wydobywać z nich potrzebne informacje.
- Dodano nowy typ programów BPF BPF_PROG_TYPE_SK_LOOKUP, uruchamianych w momencie, gdy jądro szuka odpowiedniego gniazda nasłuchującego dla przychodzącego połączenia. Dzięki temu typowi programu BPF można tworzyć handlery podejmujące decyzje, z którym gniazdem połączyć nowe połączenie, bez ograniczeń wynikających z wywołania systemowego bind(). Na przykład, można zorganizować powiązanie jednego gniazda z zakresem adresów lub portów. Ponadto, w bpf_setsockopt() dodano wsparcie dla flagi SO_KEEPALIVE oraz umożliwiono ustawienie handlerów BPF_CGROUP_INET_SOCK_RELEASE, wywoływanych przy zwalnianiu gniazda.
- Zaimplementowano wsparcie dla protokołu (Parallel Redundancy Protocol), który umożliwia na bazie Ethernet realizację przejrzystego dla aplikacji przełączania na zapasowy kanał w przypadku awarii jakichkolwiek komponentów sieci.
- W stosie mac80211 wsparcie dla czteroetapowego uzgadniania kanału WPA/WPA2-PSK w trybie punktu dostępowego.
- Dodano możliwość przełączania planowania qdisc (queuing discipline) na domyślne użycie algorytmu zarządzania kolejkami FQ-PIE (Flow Queue PIE), mającego na celu zmniejszenie negatywnego wpływu pośredniego buforowania pakietów na sprzęcie sieciowym (bufferbloat) w sieciach z modemami kablowymi.
- Dodano nowe możliwości w MPTCP (MultiPath TCP), rozszerzeniu protokołu TCP, które umożliwia jednoczesne przesyłanie pakietów przez kilka tras za pośrednictwem różnych interfejsów sieciowych przypisanych do różnych adresów IP. Dodano wsparcie dla syn cookie, DATA_FIN, automatycznego dostosowywania buforów, diagnostyki gniazd oraz używania flag REUSEADDR, REUSEPORT i V6ONLY w setsockopt.
- Dla wirtualnych tabel routingu VRF (Virtual Routing and Forwarding), które pozwalają na organizację pracy wielu domen routingu w jednym systemie, wprowadzono tryb „strict”. W tym trybie wirtualna tabela może być skojarzona tylko z tabelą routingu, która nie jest używana w innych wirtualnych tabelach.
- W bezprzewodowym sterowniku ath11k wsparcie dla częstotliwości 6 GHz i .
- Sprzęt
- Usunięto kod dla wsparcia architektury UniCore, opracowanej w mikroprocesorowym centrum Uniwersytetu Pekińskiego i włączonej do jądra Linuksa w 2011 roku. Ta architektura od 2014 roku jest nieaktualizowana i nie ma wsparcia w GCC.
- Dla architektury RISC-V wprowadzono wsparcie dla (interfejs debugfs do analizy pokrycia kodu jądra), kmemleak (system wykrywania wycieków pamięci), ochrony stosu, znaczników przejścia oraz operacji bezczasowych (niezależny od sygnałów timera wielozadaniowość).
- Dla architektury PowerPC wprowadzono wsparcie dla kolejek spinlock, co znacznie zwiększyło wydajność w sytuacjach konfliktów blokad.
- Dla architektur ARM i ARM64 domyślnie wykorzystano mechanizm regulacji częstotliwości procesora (cpufreq governor), który do podejmowania decyzji o zmianie częstotliwości bezpośrednio korzysta z informacji od planisty zadań i może natychmiast kontaktować się z sterownikami cpufreq w celu natychmiastowej zmiany częstotliwości, dostosowując parametry pracy CPU do bieżącego obciążenia.
- W sterowniku DRM i915 dla kart graficznych Intel dodano wsparcie dla chipów opartych na mikroarchitekturze i dodano początkowe wsparcie dla dyskretnych kart .
- W sterowniku amdgpu dodano początkowe wsparcie dla GPU AMD (Navy Flounder) i (Sienna Cichlid). Dodano wsparcie dla silników przyspieszających kodowanie i dekodowanie wideo UVD/VCE dla GPU Southern Islands (Radeon HD 7000).
Dodano właściwość do obracania wyświetlania o 90, 180 lub 270 stopni.Ciekawe, że sterownik dla GPU AMD największym sterownikiem w jądrze — zawiera około 2,71 miliona linii kodu, co stanowi około 10% całkowitego rozmiaru jądra (27,81 miliona linii). Z tego 1,79 miliona linii dotyczy automatycznie generowanych plików nagłówkowych z danymi dla rejestrów GPU, a kod w C to 366 tysięcy linii (dla porównania, sterownik Intel i915 zawiera 209 tysięcy linii, a Nouveau — 149 tysięcy).
- W sterowniku Nouveau wsparcie dla ramkowej weryfikacji integralności za pomocą (Cyclic Redundancy Checks) w silnikach graficznych GPU NVIDIA. Implementacja opiera się na dokumentacji dostarczonej przez firmę NVIDIA.
- Dodano sterowniki dla paneli LCD: Frida FRD350H54004, KOE TX26D202VM0BWA, CDTech S070PWS19HP-FC21, CDTech S070SWV29HG-DC44, Tianma TM070JVHG33 i Xingbangda XBD599.
- W systemie dźwiękowym ALSA dodano wsparcie do kontroli podświetlenia przycisków aktywacji mikrofonu i wyciszenia dźwięku. do zarządzania podświetleniem przycisków aktywacji mikrofonu i wyciszenia, a także dodano wsparcie dla nowego sprzętu, w tym kontrolera .
- Dodano wsparcie dla platform ARM, urządzeń i platform: Pine64 PinePhone v1.2, Lenovo IdeaPad Duet 10.1, ASUS Google Nexus 7, Acer Iconia Tab A500, Qualcomm Snapdragon SDM630 (stosowany w Sony Xperia 10, 10 Plus, XA2, XA2 Plus i XA2 Ultra), Jetson Xavier NX, Amlogic WeTek Core2, Aspeed EthanolX, pięć nowych płytek opartych na NXP i.MX6, MikroTik RouterBoard 3011, Xiaomi Libra, Microsoft Lumia 950, Sony Xperia Z5, MStar, Microchip Sparx5, Intel Keem Bay, Amazon Alpine v3, Renesas RZ/G2H.
Jednocześnie latynoamerykański Fundusz Wolnego Oprogramowania
wariant — , oczyszczone z elementów firmware i sterowników zawierających nieswoiste komponenty lub fragmenty kodu, których zastosowanie jest ograniczone przez producenta. W nowym wydaniu zablokowano ładowanie blobów w sterownikach dla WiFi rtw8821c i SoC MediaTek mt8183. Zaktualizowano kod czyszczenia blobów w sterownikach i podsystemach Habanalabs, Wilc1000, amdgpu, mt7615, i915 CSR, Mellanox mlxsw (Spectrum3), r8169 (rtl8125b-2) oraz x86 touchscreen.
Źródło: opennet.ru
