Informacje o wersji jądra

Ta strona zawiera podsumowanie najważniejszych funkcji w każdej wersji jądra oraz linki do dodatkowych informacji.

Nowe funkcje jądra 6.12

W tej sekcji opisujemy nowe funkcje jądra 6.12.

Profilowanie alokacji pamięci

Aby zrozumieć, jak wykorzystywana jest pamięć, trzeba wiedzieć, gdzie są dokonywane alokacje. Jądro 6.12 zawiera nowy system przypisywania alokacji pamięci o nazwie profilowanie alokacji pamięci (CONFIG_MEM_ALLOC_PROFILING w konfiguracji). Dzięki profilowaniu alokacji pamięci każda alokacja jest przypisywana do unikalnej linii kodu źródłowego, co pozwala szybko identyfikować problemy z alokacjami. Profilowanie alokacji pamięci:

  • jest używane w fazie projektowania, ale jest dostępne w standardowym obrazie GKI;

  • można je włączyć za pomocą parametru rozruchu sysctl.vm.mem_profiling;

  • działa zarówno w przypadku modułów wbudowanych w jądro, jak i załadowanych.

Szybsze io_uring z odczytem bez kopiowania i wielokrotnym

W jądrze 6.12 moduły statsd i logd używają funkcji sendfile bez kopiowania, co zwiększa ich wydajność.

Ta wersja jądra implementuje też odczyt wielokrotny, w którym jedna operacja odczytu może pobierać jednocześnie wiele fragmentów danych, co zwiększa wydajność.

Ulepszone możliwości i obsługa filtra Berkeley Packet Filter (BPF)

W jądrze 6.12 łańcuch narzędzi BPF został przeniesiony, aby obsługiwać CO-RE i kilka nowoczesnych funkcji. Dodatkowo nowy moduł wczytujący BPF umożliwia korzystanie z nowoczesnego BPF w programach, które są częścią AOSP.

Wykonanie proxy

Wykonanie proxy umożliwia harmonogramowi pożyczanie cykli procesora od procesów o wysokim priorytecie w celu odzyskania blokad utrzymywanych przez procesy o niższym priorytecie. Ta funkcja łagodzi problemy z inwersją priorytetów.

Nowe funkcje jądra 6.6

W tej sekcji opisujemy nowe funkcje jądra 6.6.

Obsługa języka Rust

Wiele projektów jądra 6.6 korzysta z języka Rust.

Blokady na obszar pamięci wirtualnej (VMA)

Jądro 6.6 używa blokad na obszar pamięci wirtualnej, aby rozwiązać problemy z rywalizacją z mmap_lock (wcześniej znanym jako mmap_sem). Dzięki temu aplikacje, które używają dużej liczby wątków, mogą skrócić czas uruchamiania nawet o 20%.

Harmonogram EEVDF (Earliest Eligible Virtual Deadline First) zastępuje CFS

EEVDF zastępuje harmonogram CFS (Completely Fair Scheduler), aby lepiej równoważyć dostęp do procesora między zadaniami krótkimi i długotrwałymi.

Zmniejszone zużycie energii przez wywołania zwrotne RCU (Read Copy Update)

Opcja RCU_LAZY używa metody grupowania wywołań zwrotnych RCU opartej na timerze, aby oszczędzać energię. W przypadku systemu o małym obciążeniu lub bezczynnego ta opcja może zmniejszyć zużycie energii o 5–10%.

Lepsza kompresja pamięci ZRAM

Nowe ustawienie kompilacji CONFIG_ZRAM_MULTI_COMP umożliwia ZRAM ponowne skompresowanie stron za pomocą jednego z 3 alternatywnych algorytmów. Ta rekompresja dodatkowo zmniejsza skompresowaną pamięć, zapewniając więcej wolnego miejsca na aktywne zadania.

Nowe funkcje jądra 6.1

W tej sekcji opisujemy nowe funkcje jądra 6.1.

Szybsze zabezpieczenia dzięki KCFI (Kernel Control Flow Integrity)

KCFI zastępuje CFI (Control Flow Integrity), co zmniejsza koszt działania i nie powoduje kosztów kompilacji. Zmniejszony koszt działania umożliwia włączenie KCFI w większej liczbie miejsc niż CFI, w tym w punktach śledzenia i hakach dostawcy.

Oprócz KCFI jądro 6.1 wprowadza kilka funkcji zabezpieczeń, takich jak ścisłe sprawdzanie granic memcpy i środki łagodzące ataki spekulacyjne.

Więcej informacji o KCFI znajdziesz w artykule Kernel control flow integrity.

MGLRU (Multi-Generational LRU)

MGLRU zostało dodane do jądra 6.1, aby poprawić zarządzanie pamięcią przez lepsze identyfikowanie, które strony są faktycznie używane. To ulepszenie zmniejsza potrzebę zatrzymywania aplikacji, gdy w systemie brakuje pamięci. Ta aktualizacja poprawia też wygodę użytkowników, ponieważ ogólna responsywność urządzenia jest lepsza.

Implementacja MGLRU obejmuje też obsługę nowego drzewa klonowego bezpiecznego dla RCU, które w niektórych przypadkach może zastąpić drzewo czerwono-czarne (rbtree). Drzewo klonowe bezpieczne dla RCU zwiększa wydajność dzięki mniejszemu rozmiarowi i braku blokad.

Więcej informacji o MGLRU znajdziesz w artykule Multi-Gen LRU.

Harmonogram

Utrzymywanie i aktualizowanie harmonogramu to kluczowy aspekt pracy nad ulepszaniem jądra. Aktualizacje jądra w wersji 6.1 obejmują:

  • Dodano harmonogram uwzględniający klaster, który zwiększa wydajność przez migrację do rdzeni współdzielących pamięć podręczną L2.
  • Usunięto niepotrzebną heurystykę marginesu energii. Ograniczając niektóre migracje, ta aktualizacja poprawia wykorzystanie energii nawet o 5%.
  • Ulepszono równoważenie obciążenia, aby zmniejszyć opóźnienie wybudzania.
  • Przeniesiono przyspieszone okresy karencji RCU do wątku kthread w czasie rzeczywistym. Ta aktualizacja znacznie zmniejszyła wartości odstające opóźnienia związane z RCU.

Grafika

Jądro 6.1 zawiera nowe metody dma-buf do eksportowania i importowania plików synchronizacji, co jest zgodne z potrzebami interfejsu Vulcan Video API.

Nowa metoda futex_waitv() upraszcza przenoszenie gier z innych platform, ponieważ czeka na wiele futeksów jednocześnie.

Narzędzia do debugowania

Używaj narzędzia KCSAN (Kernel Concurrency SANitizer) w kompilacjach debugowania, aby identyfikować wyścigi w kodzie jądra.

Dodatkowo używaj narzędzia KMSAN (Kernel Memory SANitizer), aby znajdować niezainicjowane wartości w jądrze.

Ulepszenia obsługi ARM64

Jądro 6.1 wprowadza kilka ulepszeń architektury ARM64, w tym:

  • Obsługa rozszerzeń timera ARMv8.6
  • Obsługa algorytmu uwierzytelniania wskaźników QARMA3
  • Wstępna obsługa rozszerzenia SME (Scalable Matrix Extension) ARMv9
  • Ulepszenia funkcji alternatywnej, które zmniejszają rozmiar obrazu jądra