Après deux mois de développement, Linus Torvalds a présenté la version du noyau Linux 6.1. Parmi les changements les plus notables : le support du développement de pilotes et de modules en Rust, la modernisation du mécanisme de détermination des pages mémoire utilisées, un gestionnaire de mémoire spécifique pour les programmes BPF, un système de diagnostic des problèmes de mémoire KMSAN, un mécanisme de protection KCFI (Kernel Control-Flow Integrity), et l'implémentation de la structure Maple tree.
La nouvelle version intègre 15 115 corrections provenant de 2 139 développeurs, la taille du patch étant de 51 Mo, ce qui est environ deux fois moins que les tailles des patches des noyaux 6.0 et 5.19. Les changements ont touché 13 165 fichiers, avec 716 247 lignes de code ajoutées et 304 560 lignes supprimées. Environ 45 % de toutes les modifications présentées dans 6.1 concernent les pilotes matériels, environ 14 % des changements sont liés à la mise à jour du code spécifique aux architectures matérielles, 14 % concernent la pile réseau, 3 % se rapportent aux systèmes de fichiers et 3 % aux sous-systèmes internes du noyau.
Les principales nouveautés du noyau 6.1 :
- Mémoire et services système
- Ajout de la possibilité d'utiliser le langage Rust comme deuxième langage pour le développement de pilotes et de modules du noyau. Le principal motif de la prise en charge de Rust est de faciliter l'écriture de pilotes de périphériques sûrs et de haute qualité en réduisant la probabilité d'erreurs lors de la gestion de la mémoire. Le support de Rust est inactif par défaut et n'entraîne pas l'inclusion de Rust parmi les dépendances de construction obligatoires du noyau. Une version minimale et réduite des patches a été acceptée, diminuée de 40 à 13 milliers de lignes de code, offrant seulement le minimum nécessaire pour assembler un simple module de noyau écrit en Rust. Dans un avenir proche, la fonctionnalité existante sera progressivement développée en intégrant d'autres modifications de la branche Rust-for-Linux. Parallèlement, des projets sont en cours pour utiliser l'infrastructure proposée pour le développement de pilotes pour les disques NVMe, le protocole réseau 9p et le GPU Apple M1.
- Pour les systèmes basés sur les architectures AArch64, RISC-V et LoongArch avec EFI, il est désormais possible de démarrer directement à partir d'images de noyau compressées. Des gestionnaires ont été ajoutés pour charger, démarrer et décharger les images de noyau, appelés directement à partir de l'EFI zboot. Des gestionnaires pour l'installation et la suppression des protocoles de la base de données des protocoles EFI ont également été ajoutés. Auparavant, le déballage était effectué par un chargeur distinct, mais cela peut maintenant être géré directement par le noyau — l'image du noyau est formée sous la forme d'une application EFI.
- Une partie des correctifs a été intégrée, mettant en œuvre un modèle de gestion de la mémoire à plusieurs niveaux qui permet de séparer les banques de mémoire avec différentes caractéristiques de performance. Par exemple, les pages les plus intensivement utilisées peuvent être placées dans la mémoire la plus rapide, tandis que celles utilisées rarement peuvent être stockées dans une mémoire relativement plus lente. Dans le noyau 6.1, un mécanisme a été introduit pour identifier les pages intensivement utilisées dans la mémoire lente afin de les transférer vers la mémoire rapide, ainsi qu'un concept général de niveaux de mémoire et de leur performance relative.
- Le mécanisme MGLRU (Multi-Generational LRU) a été inclus, remplaçant l'ancienne mise en œuvre LRU (Least Recently Used) basée sur deux files d'attente par une structure en plusieurs niveaux, mieux à même de déterminer quelles pages de mémoire sont réellement utilisées et lesquelles peuvent être évacuées vers l'espace d'échange.
- Le support de la structure de données « maple tree » proposée par les ingénieurs d'Oracle a été ajouté, qui est présentée comme un remplacement plus efficace de la structure « red-black tree ». Le maple tree est une variante du B-tree, prenant en charge l'indexation par plages de valeurs et conçue pour une utilisation efficace du cache. processeurs modernes. Certaines sous-systèmes de gestion de la mémoire ont déjà été convertis vers le maple tree, ce qui a eu un impact positif sur leurs performances. À l'avenir, le maple tree pourrait être utilisé pour mettre en œuvre des verrouillages par plage (range locking).
- Le sous-système BPF a ajouté la possibilité de créer des programmes BPF « destructifs », spécifiquement conçus pour initier un arrêt d'urgence via l'appel crash_kexec(). De tels programmes BPF peuvent être nécessaires à des fins de débogage pour initier la création d'un crash dump à un moment précis. Pour accéder aux opérations destructives lors du chargement d'un programme BPF, il est nécessaire d'indiquer le drapeau BPF_F_DESTRUCTIVE, d'activer sysctl kernel.destructive_bpf_enabled et de disposer des droits CAP_SYS_BOOT.
- Pour les programmes BPF, une possibilité de parcourir les éléments cgroup, ainsi que de parcourir les ressources (fichiers, vma, processus, etc.) d'un certain thread ou tâche, a été fournie. Un nouveau type de map a été mis en place pour la création de buffers circulaires personnalisés (user ring buffer).
- Un appel spécial pour l'allocation de mémoire dans les programmes BPF a été ajouté (memory allocator), qui assure une distribution de mémoire plus sécurisée dans le contexte BPF que l'allocation standard kmalloc().
- La première partie des modifications permettant de créer des pilotes pour des dispositifs d'entrée avec interface HID (Human Interface Device), réalisés sous forme de programmes BPF, a été intégrée.
- Le code pour le support du format de fichier exécutable a.out a été complètement supprimé du noyau, ayant été classé comme obsolète dans la version 5.1, et depuis les versions 5.18 et 5.19, il a été désactivé pour les principales architectures. Le format a.out n'est plus utilisé dans les systèmes Linux, et la génération de fichiers a.out n'est pas prise en charge par les outils modernes dans les configurations Linux par défaut. Le chargeur pour les fichiers a.out peut être entièrement réalisé dans l'espace utilisateur.
- Pour les systèmes basés sur l'architecture du jeu d'instructions LoongArch, utilisée dans les processeurs Loongson 3 5000 et réalisant un nouvel ISA RISC, similaire à MIPS et RISC-V, un support pour les événements de mesure de performance (perf event), kexec, kdump et la compilation JIT pour BPF a été mis en œuvre.
- Dans l'interface d'entrée/sortie asynchrone io_uring, un nouveau mode IORING_SETUP_DEFER_TASKRUN a été proposé, permettant de retarder temporairement l'exécution des travaux liés au buffer circulaire jusqu'à ce qu'une demande soit reçue de l'application, ce qui peut être utilisé pour organiser l'exécution des travaux en mode batch et prévenir des problèmes de latence dus à l'éjection de l'application à un moment inapproprié.
- Les processus dans l'espace utilisateur ont maintenant la possibilité d'initier la conversion d'une plage de pages mémoire ordinaires en un ensemble de grandes pages mémoire (Transparent Huge-Pages).
- Ajout de la mise en œuvre de l'appareil /dev/userfaultfd, permettant d'organiser l'accès à la fonctionnalité de l'appel système userfaultfd() en utilisant les droits d'accès dans le système de fichiers. La fonctionnalité userfaultfd permet de créer des gestionnaires pour les exceptions de pages non allouées (page faults) dans l'espace utilisateur.
- Les exigences concernant la version de l'outil GNU Make ont été élevées : pour compiler le noyau, la version minimale requise est désormais 3.82.
- Sous-système de disque, entrée/sortie et systèmes de fichiers
- Des optimisations de performance significatives ont été apportées au système de fichiers Btrfs, notamment une augmentation considérable des performances de l'appel ioctl FIEMAP. Ajout du support pour l'écriture tamponnée asynchrone pour les applications utilisant io_uring. La fonction « send » a été dotée de la prise en charge des fichiers protégés par fs-verity.
- Le système de fichiers ext4 a reçu des optimisations de performance liées à la maintenance du journal et à l'exploitation en mode lecture seule.
- Dans le système de fichiers EROFS (Enhanced Read-Only File System), conçu pour être utilisé sur des partitions accessibles en mode lecture seule, une possibilité de stockage commun des données, dupliquées dans différents systèmes de fichiers, a été mise en œuvre.
- L'appel système statx() a été enrichi de la capacité à fournir des informations sur la possibilité d'appliquer des entrées/sorties directes à un fichier.
- Le sous-système FUSE (Filesystems in User Space) a été mis à jour pour prendre en charge la création de fichiers temporaires avec le drapeau O_TMPFILE.
- Virtualisation et sécurité
- L'implémentation du mécanisme de protection CFI (Control Flow Integrity) a été remplacée, ajoutant une vérification avant chaque appel indirect de fonction pour détecter certaines formes de comportement indéfini, qui pourraient potentiellement conduire à des violations de l'ordre normal d'exécution (control flow) en raison de l'utilisation d'exploits modifiant les pointeurs fonctionnels stockés en mémoire. L'implémentation standard de CFI du projet LLVM a été remplacée par une variante également basée sur l'utilisation de Clang, mais spécialement adaptée pour protéger les sous-systèmes à bas niveau et les noyaux des systèmes d'exploitation. Dans LLVM, une nouvelle implémentation sera proposée dans la version Clang 16 et pourra être activée avec l'option « -fsanitize=kcfi ». La principale différence de la nouvelle implémentation est qu'elle n'est pas liée aux optimisations au moment de la liaison (LTO) et ne conduit pas à remplacer les pointeurs de fonctions par des références dans la table de transition.
- Pour les modules LSM (Linux Security Module), il est désormais possible de créer des gestionnaires interceptant les opérations de création d'espaces de noms.
- Des moyens ont été fournis pour vérifier les signatures numériques PKCS#7 dans les programmes BPF.
- Dans /dev/random, la possibilité d'ouvrir en mode non-bloquant (O_NONBLOCK), qui avait été accidentellement supprimée dans le noyau 5.6, a été rétablie.
- Sur les systèmes avec architecture x86, un avertissement a été ajouté en cas de mappage par les sous-systèmes du noyau de pages mémoire permettant simultanément l'exécution et l'écriture. Il est envisagé de prohiber complètement ce type de mappage mémoire à l'avenir.
- Un mécanisme de débogage KMSAN (Kernel Memory Sanitizer) a été ajouté pour détecter l'utilisation de mémoire non initialisée dans le noyau, ainsi que les fuites de mémoire non initialisée entre l'espace utilisateur et les périphériques.
- Des améliorations ont été apportées au générateur de nombres pseudo-aléatoires CRNG, utilisé dans l'appel getrandom. Les modifications ont été préparées par Jason Donenfeld, l'auteur de WireGuard, et visent à renforcer la sécurité de l'extraction de nombres entiers pseudo-aléatoires. VPN Dans la pile TCP, la possibilité d'utiliser séparément les tables de hachage des sockets pour chaque espace de noms a été mise en œuvre (désactivée par défaut), ce qui permet d'améliorer la performance des systèmes avec un grand nombre d'espaces de noms.
- Sous-système réseau
- Dans la pile TCP, une fonctionnalité (désactivée par défaut) a été mise en œuvre, permettant l'utilisation de tables de hachage des sockets séparées pour chaque espace de noms, ce qui augmente la performance des systèmes comportant de nombreux espaces de noms.
- Le support du protocole obsolète DECnet a été supprimé. Des substituts API sont laissés pour l'espace utilisateur, permettant de compiler des applications utilisant DECnet, mais ces applications ne pourront pas se connecter au réseau.
- Le protocole netlink a été documenté.
- Matériel
- Le pilote amdgpu a ajouté la prise en charge du passthrough DSC (Display Stream Compression) pour la compression sans perte des données lors des échanges d'informations avec des écrans supportant de très hautes résolutions. Le travail se poursuit pour assurer la prise en charge des plateformes AMD RDNA3 (RX 7000) et CDNA (Instinct). La prise en charge des composants IP DCN 3.2, SMU 13.x, NBIO 7.7, GC 11.x, PSP 13.x, SDMA 6.x et GMC 11.x a été ajoutée. Le pilote amdkfd (pour les GPU discrets AMD, tels que Polaris) a mis en œuvre la prise en charge de GFX 11.0.3.
- Le pilote i915 (Intel) a activé la prise en charge des GPU Meteor Lake. Pour Meteor Lake et les GPU plus récents, la prise en charge de l'interface DP 2.0 (DisplayPort) a été ajoutée. Des identifiants pour les cartes graphiques basées sur l'architecture Alder Lake S ont été ajoutés.
- Le support des sous-systèmes audio intégrés dans les processeurs Apple Silicon, Intel SkyLake et Intel KabyLake a été ajouté. Le pilote audio CS35L41 HDA prend désormais en charge le passage en mode veille. Le support d'ASoC (ALSA System on Chip) pour les puces audio intégrées à Apple Silicon, AMD Rembrandt DSPs, AMD Pink Sardine ACP 6.2, Everest ES8326, Intel Sky Lake et Kaby Lake, Mediatek MT8186, NXP i.MX8ULP DSPs, Qualcomm SC8280XP, SM8250, SM8450 et Texas Instruments SRC4392 a été ajouté.
- Le support des panneaux LCD Samsung LTL101AL01, B120XAN01.0, R140NWF5 RH, Densitron DMT028VGHMCMI-1A TFT, AUO B133UAN02.1, IVO M133NW4J-R3, Innolux N120ACA-EA1, AUO B116XAK01.6, BOE NT116WHM-N21, INX N116BCA-EA2, INX N116BCN-EA1, Multi-Inno Technology MI0800FT-9 a été ajouté.
- Le support des contrôleurs AHCI SATA utilisés dans le SoC Baikal-T1 a été ajouté.
- Le support des puces Bluetooth MediaTek MT7921, Intel Magnetor (CNVi, connectivité intégrée), Realtek RTL8852C, RTW8852AE et RTL8761BUV (Edimax BT-8500) a été ajouté.
- Le pilote ath11k pour les modules sans fil Qualcomm a ajouté le support du balayage spectral dans la bande de 160 MHz, mis en œuvre le NAPI multithreading et amélioré le support des puces Wi-Fi Qualcomm WCN6750.
- Des pilotes pour les claviers du PinePhone, des pavés tactiles InterTouch (ThinkPad P1 G3), du contrôleur adaptatif X-Box, du contrôleur de vol PhoenixRC, du contrôleur de voiture VRC-2, du contrôleur IBM (IBM Operation Panel), des télécommandes XBOX One Elite, des tablettes XP-PEN Deco Pro S et Intuos Pro Small (PTH-460) ont été ajoutés.
- Un pilote pour les accélérateurs cryptographiques Aspeed HACE (Hash and Crypto Engine) a été ajouté.
- Le support des contrôleurs intégrés Thunderbolt/USB4 Intel Meteor Lake a été ajouté.
- Le support des smartphones Sony Xperia 1 IV, Samsung Galaxy E5, E7 et Grand Max, Pine64 Pinephone Pro a été ajouté.
- Le support des SoC ARM et des cartes a été ajouté : AMD DaytonaX, Mediatek MT8186, Rockchips RK3399 et RK3566, TI AM62A, NXP i.MX8DXL, Renesas R-Car H3Ne-1.7G, Qualcomm IPQ8064-v2.0, IPQ8062, IPQ8065, Kontron SL/BL i.MX8MM OSM-S, MT8195 (Acer Tomato), Radxa ROCK 4C+, NanoPi R4S Enterprise Edition, JetHome JetHub D1p. Les pilotes pour les SoC Samsung, Mediatek, Renesas, Tegra, Qualcomm, Broadcom et NXP ont été mis à jour.
Parallèlement, la Fondation latino-américaine pour le logiciel libre a formé une version entièrement libre du noyau 6.1 — Linux-libre 6.1-gnu, débarrassée des éléments de firmware et de pilotes contenant des composants non libres ou des portions de code dont l'utilisation est limitée par le fabricant. Dans cette nouvelle version, un nettoyage du nouveau pilote rtw8852b et des fichiers DTS pour différents SoC Qualcomm et MediaTek avec des processeurs basés sur l'architecture AArch64 a été réalisé. Le code de nettoyage des blobs dans les pilotes et sous-systèmes amdgpu, i915, brcmfmac, r8188eu, rtw8852c, Intel ACPI a été mis à jour. Le nettoyage des pilotes obsolètes des cartes TV tm6000, cpia2 v4l, sp8870, av7110 a été corrigé.
Source : opennet.ru
