Po dwóch miesiącach prac Linus Torvalds wydał jądro . Wśród najbardziej zauważalnych zmian znajduje się detektor stanów wyścigu KCSAN, uniwersalny mechanizm dostarczania powiadomień do przestrzeni użytkownika, wsparcie dla sprzętu do szyfrowania inline, rozszerzone mechanizmy ochrony dla ARM64, wsparcie dla rosyjskiego procesora Baikal-T1, możliwość oddzielnego montowania instancji procfs oraz implementacja mechanizmów ochrony Shadow Call Stack i BTI dla ARM64.
Jądro 5.8 stało się największym pod względem liczby zmian ze wszystkich jąder w historii projektu. Przy tym zmiany nie są związane z jedną konkretną podsystemem, ale obejmują różne części jądra i głównie są związane z wewnętrznymi przeróbkami i oczyszczaniem. Najwięcej zmian dotyczy sterowników. W nowej wersji przyjęto 17606 poprawek od 2081 programistów, które dotknęły około 20% wszystkich plików w repozytorium z kodem jądra. Rozmiar łatki wynosi 65 MB (zmiany dotknęły 16180 plików, dodano 1043240 wierszy kodu, usunięto 489854 wierszy). Dla porównania, w gałęzi 5.7 wprowadzono 15033 poprawek, a rozmiar łatki wynosił 39 MB. Około 37% wszystkich przedstawionych w 5.8 zmian dotyczy sterowników urządzeń, około 16% zmian ma związek z aktualizacją kodu specyficznego dla architektur sprzętowych, 11% dotyczy stosu sieciowego, 3% — systemów plików, a 4% z wewnętrznymi podsystemami jądra.
:
- Wirtualizacja i bezpieczeństwo
- Zapewniono blokadę ładowania modułów jądra, które mają sekcje z kodem, w których jednocześnie ustalone są bity pozwalające na wykonanie i zapis. Zmiana została wdrożona w ramach większego projektu mającego na celu wyeliminowanie zastosowania stron pamięci w jądrze, które dopuszczają jednoczesne wykonanie i zapis.
- Pojawiła się możliwość tworzenia oddzielnych instancji procfs, które pozwalają na użycie wielu punktów montowania procfs, zamontowanych z różnymi opcjami, ale odzwierciedlających jedną przestrzeń nazw identyfikatorów procesów (pid namespace). Wcześniej wszystkie punkty montowania procfs tylko odzwierciedlały jedno wewnętrzne przedstawienie i każda zmiana parametrów montowania miała wpływ na wszystkie pozostałe punkty montowania związane z tą samą przestrzenią nazw identyfikatorów procesów. Z obszarów, w których może być wymagane montowanie z różnymi opcjami, wyróżnia się realizację lekkiej izolacji dla systemów wbudowanych z możliwością ukrycia w procfs określonych typów procesów i węzłów informacyjnych.
- Dla platformy ARM64 zaimplementowano wsparcie dla mechanizmu
, dostarczanego przez kompilator Clang, do ochrony przed nadpisywaniem adresu powrotu z funkcji w przypadku przepełnienia bufora na stosie. Istota ochrony polega na zachowaniu adresu powrotu w osobnym »cieniowym« stosie po przekazaniu sterowania do funkcji i wydobyciu tego adresu przed wyjściem z funkcji. - Dla platformy ARM64 dodano obsługę instrukcji (Branch Target Indicator) dla ochrony przed wykonywaniem zestawów instrukcji, na które nie powinny być wykonywane przejścia przy rozgałęzieniu. Zablokowanie przejść do dowolnych sekcji kodu zostało zrealizowane w celu przeciwdziałania tworzeniu gadżetów w exploitach, wykorzystujących techniki programowania orientowanego na zwroty (ROP - Return-Oriented Programming, atakujący nie stara się umieścić własnego kodu w pamięci, lecz operuje na już istniejących fragmentach instrukcji maszynowych, kończących się instrukcją powrotu, z których buduje łańcuch wywołań w celu uzyskania potrzebnej funkcjonalności).
- Dodano wsparcie sprzętowe dla inline-szyfrowania urządzeń blokowych (). Urządzenia inline-szyfrowania są zazwyczaj wbudowane w nośnik, ale logicznie umieszczają się między pamięcią systemową a dyskiem, dokonując przezroczystego szyfrowania i deszyfrowania wejścia/wyjścia na podstawie kluczy i algorytmu szyfrowania zdefiniowanych przez jądro.
- Dodano parametr wiersza poleceń jądra „initrdmem”, który pozwala wskazać fizyczny adres umiejscowienia initrd w pamięci przy umieszczaniu początkowego obrazu rozruchowego w RAM.
- Dodano nowe uprawnienie: CAP_PERFMON do uzyskiwania dostępu do podsystemu perf i monitorowania wydajności. , umożliwiające wykonywanie niektórych operacji z BPF (np. ładowanie programów BPF), które wcześniej wymagały uprawnień CAP_SYS_ADMIN (teraz uprawnienia CAP_SYS_ADMIN są podzielone na kombinację CAP_BPF, CAP_PERFMON i CAP_NET_ADMIN).
- nowe urządzenie virtio-mem, umożliwiające realizację gorącego podłączenia i odłączenia pamięci w systemach gościnnych.
- Zrealizowano wycofanie operacji mapowania w /dev/mem, jeśli sterownik urządzenia korzysta z nakładających się obszarów pamięci.
- Dodano ochronę przed luką , pozwalającą na odzyskanie wyników wykonywania niektórych instrukcji na innym rdzeniu CPU.
- Pamięć i usługi systemowe
- Do dokumentu określającego zasady formatowania kodu, dodano zalecenia dotyczące stosowania inkluzywnej terminologii. Programiści nie powinni używać wyrażeń 'master/slave' oraz 'blacklist/whitelist', a także słowa 'slave' osobno. Zalecenia dotyczą wyłącznie nowego użycia tych terminów. Istniejące w jądrze wzmianki o tych słowach pozostaną nietknięte. W nowym kodzie użycie wskazanych terminów jest dozwolone, jeśli wymaga tego utrzymanie dostarczanego w przestrzeń użytkownika API i ABI, oraz przy aktualizacji kodu dla wsparcia istniejącego sprzętu lub protokołów, których specyfikacje wymagają użycia określonych terminów.
- W skład wchodzi narzędzie do debugowania (Kernel Concurrency Sanitizer), przeznaczone do dynamicznego wykrywania wewnątrz jądra. Użycie KCSAN jest wspierane przy kompilacji w GCC i Clang i wymaga dodania specjalnych modyfikacji na etapie kompilacji do śledzenia dostępu do pamięci (stosowane są punkty przerwania, które działają przy odczycie lub modyfikacji pamięci). Główna uwaga przy opracowywaniu KCSAN skupiona jest na zapobieganiu fałszywym alarmom, skalowalności i prostocie użycia.
- Dodano powiadomienia o dostarczaniu z jądra do przestrzeni użytkownika. Mechanizm oparty jest na standardowym sterowniku pipe i pozwala efektywnie rozdzielać powiadomienia z jądra po kanałach otwartych w przestrzeni użytkownika. Punkty odbioru powiadomień to pipe'y otwarte w specjalnym trybie, umożliwiające gromadzenie przychodzących od jądra komunikatów w buforze pierścieniowym. Odczyt realizowany jest za pomocą standardowej funkcji read(). Właściciel kanału określa, które ze źródeł w jądrze należy obserwować i może ustalić filtr, aby ignorować komunikaty i zdarzenia określonego typu. Zdarzenia wspierają dotychczas tylko operacje na kluczach, takie jak dodawanie/usuwanie kluczy oraz zmiana ich atrybutów. Wskazane zdarzenia planuje się wykorzystać w GNOME.
- Kontynuowano rozwój funkcjonalności 'pidfd', która pomaga w obsłudze sytuacji związanych z ponownym użyciem PID (pidfd jest związany z konkretnym procesem i nie zmienia się, podczas gdy PID może być przypisany do innego procesu po zakończeniu bieżącego procesu powiązanego z tym PID). W nowej wersji dodano wsparcie dla użycia pidfd do przyczepiania procesu do przestrzeni nazw (zezwolono na wskazywanie pidfd przy wykonywaniu wywołania systemowego setns). Zastosowanie pidfd pozwala na zarządzanie przyczepieniem procesu do kilku typów przestrzeni nazw za pomocą jednego wywołania, znacznie redukując liczbę wymaganych wywołań systemowych i realizując przyczepienie w sposób atomowy (jeśli wystąpi błąd przy przyczepieniu do jednej z przestrzeni nazw, nie zostaną przyczepione inne).
- Dodano nowe wywołanie systemowe faccessat2(), które różni się od
dodatkowym argumentem z flagami odpowiadającymi zaleceniom POSIX (wcześniej flagi te były emulowane w bibliotece C, a nowe faccessat2 pozwala na ich realizację w jądrze). - W Cgroup ustawienie memory.swap.high, które można wykorzystać do spowalniania zadań zajmujących zbyt dużo miejsca w pamięci swap.
- W interfejsie asynchronicznego wejścia/wyjścia dodano wsparcie dla wywołania systemowego tee().
- Dodano mechanizm „, przeznaczone do wyprowadzania zawartości struktur jądra do przestrzeni użytkownika.
- możliwość wykorzystania bufora pierścieniowego do wymiany danych między programami BPF.
- W mechanizmie , przeznaczony do organizacji równoległego wykonywania zadań w jądrze, dodano wsparcie dla zadań wielowątkowych z równoważeniem obciążenia.
- Mechanizm pstore, pozwalający na zachowanie informacji o błędach w obszarze pamięci, które nie są tracone między restartami, backend do przechowywania informacji na urządzeniach blokowych.
- Z gałęzi jądra PREEMPT_RT implementacja lokalnych blokad.
- nowe API alokacji buforów (AF_XDP), mające na celu uproszczenie pisania sterowników sieciowych z wsparciem dla XDP (eXpress Data Path).
- Dla architektury RISC-V zaimplementowano wsparcie dla debugowania komponentów jądra za pomocą KGDB.
- Do wydania 4.8 zwiększono wymagania dotyczące wersji GCC, która może być używana do kompilacji jądra. W jednym z kolejnych wydań planowane jest podniesienie progu do GCC 4.9.
- Podsystem dyskowy, wejście/wyjście i systemy plików
- W Device Mapper nowy handler dm-ebs (emulate block size), który może być używany do emulacji mniejszego rozmiaru logicznego bloku (na przykład do emulacji 512-bajtowych sektorów na dyskach o rozmiarze sektora 4K).
- W systemie plików F2FS dodano wsparcie dla kompresji z użyciem algorytmu LZO-RLE.
- W dm-crypt wsparcie dla szyfrowanych kluczy.
- W Btrfs poprawiono obsługę operacji odczytu w trybie bezpośredniego dostępu. Przy montażu sprawdzanie usuniętych poddziałów i katalogów, które pozostały bez rodzica.
- W CIFS dodano parametr „nodelete”, który zezwala na standardową weryfikację uprawnień na serwerze, ale zabrania klientowi usuwania plików lub katalogów.
- W Ext4 poprawiono obsługę błędu podczas korzystania z wielowątkowości. W xattr dodano wsparcie dla przestrzeni nazw gnu.*, używanej w GNU Hurd.
- Dla Ext4 i XFS włączono wsparcie dla operacji DAX (bezpośredni dostęp do FS z pominięciem pamięci podręcznej stron bez użycia poziomu urządzeń blokowych) powiązane z pojedynczymi plikami i katalogami.
- Do wywołania systemowego dodano flagę , przy wskazaniu którego informacje są wydobywane z wykorzystaniem mechanizmu DAX.
- W EXFAT wsparcie dla weryfikacji obszaru rozruchowego.
- W FAT wstępne ładowanie elementów FS. Testowanie wolnego 2TB USB pokazuje skrócenie czasu testu z 383 do 51 sek.
- Subsystem sieciowy
- W kodzie zarządzania pracą mostów sieciowych wsparcie protokołu (Media Redundancy Protocol), który zapewnia odporność na błędy, łącząc kilka przełączników Ethernet.
- W system zarządzania ruchem (Tc) nowa funkcja „gate”, która pozwala na określenie czasowych interwałów dla przetwarzania i odrzucania określonych pakietów.
- Do jądra i narzędzia ethtool dodano wsparcie dla funkcji testowania podłączonego kabla sieciowego i samo-diagnozy urządzeń sieciowych.
- W stosie IPv6 dodano wsparcie dla algorytmu MPLS (Multiprotocol Label Switching) do routingu pakietów z wykorzystaniem przełączania etykiet (wcześniej wsparcie dla MPLS w IPv4 już istniało).
- Dodano wsparcie dla przesyłania pakietów IKE (Internet Key Exchange) i IPSec przez TCP () w celu obejścia ewentualnych blokad UDP.
- sieciowe urządzenie blokowe rnbd, pozwalające na zorganizowanie zdalnego dostępu do urządzenia blokowego za pomocą transportu RDMA (InfiniBand, RoCE, iWARP) i protokołu RTRS.
- W stosie TCP dodano wsparcie dla kompresji zakresów w odpowiedziach potwierdzenia wybiórczego (selective acknowledgment, SACK).
- Dla IPv6 dodano wsparcie dla TCP-LD (, Long Connectivity Disruptions).
- Sprzęt
- W sterowniku DRM i915 dla kart graficznych Intel domyślnie włączono wsparcie dla chipów Intel Tiger Lake (GEN12), dla których również możliwość wykorzystania systemu SAGV (System Agent Geyserville) do dynamicznego dostosowywania częstotliwości i napięcia w zależności od wymagań dotyczących zużycia energii lub wydajności.
- W sterowniku amdgpu dodano wsparcie dla formatu pikseli FP16 oraz wdrożono możliwość pracy z szyfrowanymi buforami w pamięci wideo (TMZ, Trusted Memory Zone).
- Dodano wsparcie dla czujników zużycia energii procesorów AMD Zen i Zen2, a także czujników temperatury AMD Ryzen 4000 Renoir. Dla AMD Zen i Zen2 zapewniono wsparcie dla wyciągania informacji o zużyciu energii za pośrednictwem interfejsu (Running Average Power Limit).
- W sterowniku Nouveau dodano wsparcie dla formatu modyfikatorów NVIDIA. Dla gv100 wprowadzono możliwość korzystania z trybów przeplatania. Dodano definicję vGPU.
- W sterowniku MSM (Qualcomm) dodano wsparcie dla GPU Adreno A405, A640 i A650.
- wewnętrzny framework do zarządzania zasobami DRM (Direct Rendering Manager).
- Dodano wsparcie dla smartfonów Xiaomi Redmi Note 7 i Samsung Galaxy S2, a także laptopów Elm/Hana Chromebook.
- Dodano sterowniki dla paneli LCD: ASUS TM5P5 NT35596, Starry KR070PE2T, Leadtek LTK050H3146W, Visionox rm69299, Boe tv105wum-nw0.
- Dodano wsparcie dla płyt ARM oraz platform Renesas „RZ/G1H”, Realtek RTD1195, Realtek RTD1395/RTD1619, Rockchips RK3326, AMLogic S905D, S905X3, S922XH, Olimex A20-OLinuXino-LIME-eMMC, Check Point L-50,
, Beacon i.MX8m-Mini, Qualcomm SDM660/SDM630, Xnano X5 TV Box, Stinger96, Beaglebone-AI. - Dodano wsparcie dla procesora MIPS Loongson-2K (skrócony Loongson64). Dla CPU Loongson 3 dodano wsparcie dla wirtualizacji z użyciem hipernadzorcy KVM.
-
wsparcie dla rosyjskiego procesora Baikal-T1 oraz opartego na nim systemu na chipie . Procesor Baikal-T1 zawiera dwa superskalarnie rdzenie P5600 MIPS 32 r5 działające z częstotliwością 1,2 GHz. Chip zawiera pamięć podręczną L2 (1 MB), kontroler pamięci DDR3-1600 ECC, 1 port 10Gb Ethernet, 2 porty 1Gb Ethernet, kontroler PCIe Gen.3 x4, 2 porty SATA 3.0, USB 2.0, GPIO, UART, SPI, I2C. Procesor zapewnia sprzętowe wsparcie dla wirtualizacji, instrukcje SIMD oraz zintegrowany sprzętowy akcelerator operacji kryptograficznych, obsługujący GOST 28147-89. Chip został zaprojektowany z wykorzystaniem licencjonowanego bloku rdzenia procesora MIPS32 P5600 Warrior od firmy Imagination Technologies.
Jednocześnie latynoamerykański Fundusz Wolnego Oprogramowania
wariant — , oczyszczone z elementów oprogramowania układowego i sterowników zawierających komponenty lub fragmenty kodu, które są ograniczone przez producenta. W nowym wydaniu wyłączono ładowanie blobów w sterownikach dla Atom ISP Video, MediaTek 7663 USB/7915 PCIe, Realtek 8723DE WiFi, Renesas PCI xHCI, HabanaLabs Gaudi, Enhanced Asynchronous Sample Rate Converter, Maxim Integrated MAX98390 Speaker Aimplifier, Microsemi ZL38060 Connected Home Audio Processor oraz I2C EEPROM Slave. Zaktualizowano kod czyszczenia blobów w sterownikach i podsystemach Adreno GPU, HabanaLabs Goya, x86 touchscreen, vt6656 oraz btbcm.
Źródło: opennet.ru
