Nach zwei Monaten Entwicklung präsentierte Linus Torvalds die Veröffentlichung des Linux-Kernels 6.11. Zu den bemerkenswertesten Änderungen gehören: Unterstützung für atomare Schreibvorgänge auf Blockebene, Unterstützung von bind()- und listen()-Operationen in io_uring, ein neuer Mechanismus zum Sperren von Interrupt-Handlern, die Möglichkeit, in im Speicher gespiegelt ausführbare Dateien zu schreiben, Unterstützung für das Schreiben von Treibern für Blockgeräte in Rust und Optimierung des Aufrufs von getrandom(), sowie eine neue Implementierung von AES-GCM.
In die neue Version wurden 15.130 Korrekturen von 2.078 Entwicklern aufgenommen, die Patchgröße beträgt 85 MB (die Änderungen betreffen 13.282 Dateien, hinzugefügt wurden 985.857 Codezeilen, 268.915 Zeilen wurden entfernt). In der vorherigen Version gab es 14.564 Korrekturen von 1.989 Entwicklern, die Patchgröße betrug 41 MB (zweimal weniger als der Patch für Kernel 6.11). Etwa 46 % aller in 6.11 vorgenommenen Änderungen beziehen sich auf Gerätetreiber, etwa 17 % betreffen Updates für architekturspezifischen Code, 10 % stehen im Zusammenhang mit dem Netzwerk-Stack, 5 % mit Dateisystemen und 3 % mit internen Subsystemen des Kernels.
Die wichtigsten Neuerungen im Kernel 6.11:
- Festplattensubsystem, Ein-/Ausgabe und Dateisysteme
- Es wurde Unterstützung für atomare Schreibvorgänge auf Blockebene implementiert, bei denen entweder das gesamte angegebene Set von Blöcken auf das Speichergerät geschrieben wird oder keiner der Blöcke, was vor Situationen schützt, in denen bei einem Hardwareausfall nur ein Teil der Blöcke geschrieben wird, während der andere Teil alte Informationen enthält. Um den atomaren Schreibmodus im Systemaufruf pwritev() zu aktivieren, wurde das Flag RWF_ATOMIC hinzugefügt. Informationen über die Unterstützung für atomares Schreiben (atomic_write_unit_min, atomic_write_unit_max und atomic_write_segments_max) in Bezug auf bestimmte Dateien können mit der Funktion statx() abgerufen werden.
- Es wird Unterstützung für das Schreiben in ausführbare Dateien bereitgestellt, die mit laufenden Prozessen verbunden sind. Früher gab das Kernel, wie in anderen Unix-ähnlichen Systemen, einen Fehler aus, wenn versucht wurde, in eine ausführbare Datei eines laufenden Prozesses zu schreiben. Diese Einschränkung wurde aufgehoben, da sie praktisch keinen Sinn machte.
- Die Möglichkeit zur Entwicklung von Treibern für Blockgeräte in Rust wurde umgesetzt. Als Beispiel wurde dem Kernel der rnull-Treiber hinzugefügt, der ein Pendant zum Treiber null_blk darstellt und in Rust geschrieben ist.
- Im Btrfs-Dateisystem wurde die Unterstützung für die neuen Mount-Optionen „ignoremetacsums“ und „ignoresuperflags“ in der Option „rescue=“ implementiert, die verwendet werden können, um einige Prüfungen während der Wiederherstellung des Dateisystems nach einem Ausfall in den Benutzermodus zu verlagern. Die Implementierung der dynamischen Rückgabe von Blockgruppen wurde überarbeitet, um Situationen zu vermeiden, in denen nicht genügend freier Speicherplatz bei unvollständiger Belegung des Dateisystems vorhanden ist.
- Im ntfs3-Dateisystem wurde die Unterstützung für die Attribute „compressed“ und „immutable“ implementiert, die komprimierte und unveränderliche Dateien definieren.
- Im F2FS- und Ext4-Dateisystem wurde die Verarbeitung von Dateinamen ohne Berücksichtigung der Großschreibung (casefold) durch die Speicherung der Namen in Form von qstr-Zeichenfolgen ohne unnötige Groß-/Kleinschreibung vereinfacht.
- Im Ext4-Dateisystem wurde die Implementierung der Funktion jbd2_transaction_committed optimiert, um die Leistung auf sehr schnellen Speichergeräten zu verbessern (in Tests wurde eine Steigerung der verarbeiteten Operationen pro Sekunde von bis zu 20 % festgestellt).
- Im Systemaufruf statx() wurde die Übertragung eines NULL-Zeigers anstelle eines leeren Strings mit dem Dateipfad erlaubt, wenn das Flag AT_EMPTY_PATH gesetzt ist.
- Im Systemaufruf open_by_handle_at() wurden die Zugriffsprüfungen auf die Datei gelockert, wenn die Berechtigung CAP_DAC_READ_SEARCH zum Suchen im ursprünglichen Namensraum fehlt. Zuvor erlaubte das Fehlen der Berechtigung CAP_DAC_READ_SEARCH im ursprünglichen Namensraum nicht die Verwendung des Systemaufrufs open_by_handle_at() in Containern.
- Die Möglichkeiten der Systemaufrufe listmount() und statmount() wurden erweitert. Im listmount() wurde die Option LISTMOUNT_REVERSE hinzugefügt, um den Inhalt der Mountpunkt-Tabelle in umgekehrter Reihenfolge (neueste Einträge oben) anzuzeigen. Im statmount() wurde die Ausgabe der Optionen, die beim Mounten des Dateisystems gesetzt wurden, implementiert. In beiden Systemaufrufen ist die Verwendung ohne Zugang zum ursprünglichen Namensraum erlaubt (wenn nur Zugriff auf den lokalen oder externen Namensraum besteht).
- Im Bcachefs-Dateisystem wurde die Unterstützung für die automatische transparente Wiederherstellung defekter Daten unter Verwendung von Fehlerkorrekturcodes implementiert – wenn beim Lesen ein Eingab-/Ausgabefehler auftritt oder eine Kontrollsummenabweichung festgestellt wird, wird der defekte Datenblock automatisch neu geschrieben, wenn Redundanz zur Wiederherstellung vorhanden ist.
- Speicher und Systemdienste
- In die neue Version wurden Patches implementiert, die einen neuen Mechanismus zur Blockierung von Interrupt-Handlern (BH, bottom-half) realisieren. Dieser gewährleistet die Blockierung der verwendeten Datenstrukturen, ohne jedoch die parallele Ausführung von nicht damit verbundenem Code zu blockieren. Es wird festgestellt, dass die Änderung nicht nur die Latenzzeiten für Kerne im Echtzeitbetrieb senkt, sondern auch die Leistung der normalen Kerne steigert (zum Beispiel zeigt die Netzwerk-Subsystem-Leistung bei bestimmten Lasten eine Steigerung von 14,5%).
- In das asynchrone Ein-/Ausgabe-System io_uring wurde die Unterstützung für Operationen zur Implementierung der Funktionen bind() und listen() hinzugefügt, die zum Erstellen von akzeptierenden Verbindungen für Netzwerksockets verwendet werden.
- Ein Satz von ioctl-Operationen für das Pseudo-Dateisystem NSFS (NameSpace FS) wurde hinzugefügt, das für die Arbeit mit Namensräumen verwendet wird. Die neuen ioctl erlauben es, Prozess- und Thread-Gruppen-IDs zwischen verschiedenen Namensräumen für Prozess-IDs (PID-Namespace) zu konvertieren. Ähnliche ioctl, die auf der Basis von pidfd-IDs Dateideskriptoren von Prozessen in einzelnen Namensräumen bestimmen, wurden ebenfalls im Pseudo-Dateisystem pidfd hinzugefügt.
- Für BPF-Programme wurde die Unterstützung für einen neuen Iterator zur Arbeit mit Bitmasken hinzugefügt, der beispielsweise verwendet werden kann, um einzelne Bits in Speicherbereichen wie cpumask zu durchlaufen. Ein Mechanismus wurde hinzugefügt, um Prozessen im Benutzerspeicher Benachrichtigungen über die Trennung (detach/unregister) eines Objekts struct_ops zu senden. Das Spektrum der Typen, die in Arrays verwendet werden können, wurde erweitert (zum Beispiel können jetzt Arrays mit Elementen der Typen kptr, bpf_rb_root und bpf_list_head deklariert werden). Ein robusterer Mechanismus für Split BTF (BPF Type Format) wurde vorgeschlagen, der zur Typüberprüfung im BPF-Pseudocode verwendet wird.
- Ein Subsystem wurde hinzugefügt, das die Stromversorgung von Geräten in einer bestimmten Reihenfolge ermöglicht, falls ein Gerät früher aktiviert werden muss als ein anderes (zum Beispiel bei der Aktivierung von drahtlosen Chips auf Qualcomm-Plattformen).
- Ein Modul 'Sloppy logic analyzer' wurde hinzugefügt, das die Erstellung einfacher logischer Signal-Analyzer ermöglicht, die GPIO verwenden und auf einem einzelnen CPU-Kern arbeiten.
- Es wurde Unterstützung für Runtime-Konstanten hinzugefügt, die anstelle von einmal initialisierten Variablen verwendet werden können. Beispielsweise können Runtime-Konstanten anstelle von Variablen angewendet werden, die einen Zeiger und die Größe für den dentry-Cache speichern. Diese Variablen werden während des Starts festgelegt und ändern sich danach nie. Die Idee ist, die Werte solcher Variablen direkt in den Anweisungen im Code zu verwenden und die damit verbundenen Overheadkosten, die mit Zeigeroperationen verbunden sind, zu eliminieren.
- Die Übertragung von Änderungen aus dem Rust-for-Linux-Zweig wurde fortgesetzt, die sich auf die Verwendung der Programmiersprache Rust als zweite Sprache für die Entwicklung von Treibern und Modulen im Kernel beziehen (Rust-Unterstützung ist standardmäßig nicht aktiv und führt nicht dazu, dass Rust zu den obligatorischen Build-Abhängigkeiten des Kernels gehört). Unterstützung für die Veröffentlichung von Rust 1.80 wurde hinzugefügt (als minimale Version bleibt Rust 1.78 unterstützt). Neben den zuvor genannten Mitteln zur Entwicklung von Blockgerätetreibern wurden in der neuen Version Abstraktionen zum Laden von Firmware, zum Zugriff auf den Benutzerspeicher (uaccess) und zur Arbeit mit der Struktur "page" hinzugefügt.
- Für x86-64-Systeme wurde ein neuer Systemaufruf uretprobe() implementiert, der den Betrieb des uretprobe-Tracking-Mechanismus optimiert, mit dem die von Funktionen in Benutzeranwendungen zurückgegebenen Werte verfolgt werden können.
- Es wurden Kernel-Befehlszeilenparameter hinzugefügt: "reserve_mem" zum Reservieren eines benannten Speicherbereichs beim Start und "ramoops.mem_name" zur Verwendung im pstore-Speicherbereich, der durch reserve_mem erstellt wurde.
- Dem cgroup-basierten Speicher-Controller wurde im Datei memory.reclaim, über die die Speicherauslagerungseinstellungen festgelegt werden, der Parameter "swappiness" hinzugefügt, der es ermöglicht, das Gleichgewicht zwischen dem Auslagern anonymer Speicherseiten in den Swap-Bereich und der Freigabe von Speicherseiten, die für den Dateicache verwendet werden, zu ändern.
- Ein ioctl-Interface PROCMAP_QUERY wurde hinzugefügt, um die Suche nach virtuellen Speicherbereichen (Virtual Memory Area) in /proc/PID/maps effizienter zu gestalten.
- Dem Systemaufruf mmap() wurde das Flag MAP_DROPPABLE hinzugefügt, um Speicher anzufordern, der niemals in den Swap-Bereich zurückgeschoben wird und bei Speichermangel gelöscht werden kann.
- Für die ARM64-Architektur wurde die Unterstützung für Hot-Plugging (Wechsel in die Online-/Offline-Modi) physischer und virtueller CPUs in ACPI-Systemen implementiert.
- Für die RISC-V-Architektur wird die Unterstützung für Hot-Plug-Speicher sichergestellt und die Unterstützung des GCC-Plugins STACKLEAK hinzugefügt (es initialisiert alle im Stack gespeicherten Variablen, um zu verhindern, dass Informationen aus dem Kernel über nicht initialisierte Variablen, die Reste zuvor im Stack gespeicherter Daten enthalten können, auslaufen).
- Der Mechanismus der Fake-EFI-Speichermapping während des Bootvorgangs wurde entfernt. Dieser Mechanismus wurde in der Praxis nicht verwendet und hinderte Entwicklungen im Bereich der vertraulichen Ausführung. virtuelle Maschinen.
- Die Unterstützung der PowerPC 40x-Plattform wurde eingestellt.
- Die Anforderungen an die GNU Make-Version wurden erhöht – für die Kernelkompilierung ist mindestens eine Version von GNU Make erforderlich, die im Jahr 2013 veröffentlicht wurde.
- Virtualisierung und Sicherheit
- Es wurden Patches integriert, die den Erhalt von Zufallszahlen durch den Systemaufruf getrandom() erheblich (um bis zu 15 Mal) beschleunigen. Die Optimierung basiert auf der Nutzung des vDSO (virtual dynamic shared object)-Mechanismus, der es ermöglicht, den Systemaufruf-Handler aus dem Kernel in den Benutzerspeicher zu verlagern und Kontextwechsel zu vermeiden. Die Implementierung des Systemaufrufs wird direkt von dem Kernel in den Adressraum des Prozesses geladen.
- Für x86-64-Systeme wurde eine neue Implementierung des AES-GCM-Verschlüsselungsalgorithmus aktiviert, die die Verwendung von Vektor-Befehlen VAES, VPCLMULQDQ und AVX512/AVX10 zur Beschleunigung der Berechnungen unterstützt. In durchgeführten Tests erreichte der Leistungszuwachs nach dem Wechsel zur neuen Implementierung bis zu 156%. Die Assemblierung des AES-GCM wurde vollständig unter Berücksichtigung von Korrektheit, Leistung, Größe und umfassender Dokumentation des Codes neu geschrieben.
- Die Möglichkeit, den Kernel als Gastsystem in virtualisierten Umgebungen zu starten, die die Prozessorerweiterung AMD SEV-SNP (Secure Nested Paging) verwenden, wurde implementiert, um einen sicheren Umgang mit verschachtelten Seitentabellen zu gewährleisten. Für zusätzliche Isolation des Zugriffs auf Ressourcen aus virtuellen Maschinen kann das Moduls SVSM (Linux Secure VM Service Module) verwendet werden. KVM Der Hypervisor hat die anfängliche Unterstützung für den Start von Gastsystemen hinzugefügt, die durch AMD SEV-SNP geschützt sind.
- Ein separater Bucket-Slab-Allocator wurde hinzugefügt, der über die OPTION CONFIG_SLAB_BUCKETS aktiviert wird und Schutz vor Angriffen durch die Technik des 'Heap Spraying' bietet.
- Im KVM-Hypervisor wurde ein ioctl-Aufruf hinzugefügt, um der Gastmaschine vor deren tatsächlichem Start Speicher proaktiv zuzuweisen.
- Netzwerksubsystem
- Ein sysctl-Parameter net.tcp_rto_min_us wurde hinzugefügt, über den das minimale Wiederübertragungszeitlimit (retransmission timeout) für TCP-Sockets konfiguriert werden kann.
- Das Tool ethtool erhielt die Möglichkeit zur feineren Anpassung der Interrupt-Handler-Konfiguration für Netzwerkinterfaces, die das Net DIM-Interface nutzen.
- Ausrüstung
- Im AMDGPU-Treiber wurde die erste Unterstützung für die GPU AMD RDNA4 ("GFX12") aktiviert. Unterstützung für die Technologien DCN 4.0.x, GC 12.0, GMC 12.0, SDMA 7.0, MES12 und MMHUB 4.1 wurde hinzugefügt.
- Die Arbeiten am DRM-Treiber (Direct Rendering Manager) Xe für GPUs auf Basis der Intel Xe-Architektur, die in den Grafikkarten der Intel Arc-Serie und in der integrierten Grafik seit Tiger Lake-Prozessoren verwendet wird, wurden fortgesetzt. Die Unterstützung für GPUs auf Basis der Mikroarchitekturen Battlemage, Arrow Lake und Lunar Lake wurde verbessert.
- Im DRM (Direct Rendering Manager) wurde der Handler für die Monitorparameter EDID (Extended Display Identification Data) neu geschrieben.
- Im i915-Treiber wurde die Unterstützung für die GPU Battlemage Xe2 hinzugefügt, und der CMRR (Content Match Refresh Rate)-Modus ist nun standardmäßig aktiviert.
- Im DRM-Treiber msm (GPU Qualcomm Adreno) wurde die Unterstützung für die Plattform SM7150 und die GPUs X185 und a505 hinzugefügt.
- Unterstützung für die folgenden Bildschirm-Panels wurde hinzugefügt: Lincoln Tech Sol LCD185-101CT, Microtips Technology 13-101HIEBCAF0-C, Microtips Technology MF-103HIEB0GA0, BOE nv110wum-l60, IVO t109nw41, WL-355608-A8, PrimeView PM070WL4, Lincoln Technologies LCD197, Ortustech COM35H3P70ULC, AUO G104STN01, K&d kd101ne3-40ti.
- Im Audiosubsystem wurde Unterstützung für die Chips und Codecs Intel Panther Lake, Asahi Kasei AK4619, Cirrus Logic CS530x, Everest Semiconductors ES8311, NXP i.MX95, LPC32xx, Qualcomm LPASS v2.5, WCD937x, Realtek RT1318, RT1320 und Texas Instruments PCM5242 hinzugefügt.
- Die letzte Charge von Änderungen zur Unterstützung des ARM SoC Snapdragon X Elite, der über die hauseigene 12-Kern-CPU Qualcomm Oryon und die GPU Qualcomm Adreno verfügt, wurde implementiert. Der Chip ist für den Einsatz in Laptops und PCs ausgelegt und übertrifft in vielen Leistungstests die Chips Apple M3 und Intel Core Ultra 155H. Die in den Kernel 6.11 eingebrachten Änderungen betreffen die Unterstützung der GPU Adreno X1-85 und das Energiemanagement. Zu den Geräten, die auf dem SoC Snapdragon X Elite basieren, zählen die Laptops ASUS Vivobook S15 und Lenovo Yoga Slim7x.
Zeitgleich hat die lateinamerikanische Free Software Foundation eine vollständig freie Kernel-Version 6.11 – Linux-libre 6.10-gnu – veröffentlicht, die von Firmware- und Treiberkomponenten befreit ist, die nicht-freie Elemente oder Codebereiche enthalten, deren Verwendung vom Hersteller eingeschränkt ist. In Version 6.11 wurde der Code zur Bereinigung von Blobs in den Treibern mdgpu, adreno, vgxy61, atomisp, btnxpuart, prueth und tas2781 aktualisiert. Es wurden neue Treiber für amdgpu isp, tn40, rtl8192du, cs40l50, rt1320 und pcie-rcar-gen4 bereinigt. Die Namen der Blobs in dts-Dateien (Device Tree) für die Architektur Aarch64 wurden bereinigt. Eine Version der Primitiven zum Laden von Firmware ohne Warnungen und Anfragen (nowait-nowarn) wurde hinzugefügt. Code zur Bestimmung der Primitiven zum Laden von Firmware in Rust wurde integriert.
Quelle: opennet.ru
