Release des Linux-Kernels 6.11

Nach zwei Monaten Entwicklung stellte Linus Torvalds die Veröffentlichung des Linux-Kernels 6.11 vor. Zu den auffälligsten Änderungen gehören: Unterstützung von atomaren Schreiboperationen auf Blockebene, Unterstützung der Bind()- und Listen()-Operationen in io_uring, ein neuer Mechanismus für die Sperrung von Interrupt-Handlern, die Möglichkeit, in gespiegelt im Speicher befindliche ausführbare Dateien zu schreiben, Unterstützung für das Schreiben von Treibern für Blockgeräte in Rust, die Optimierung des Aufrufs von getrandom() und 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 (Änderungen betrafen 13.282 Dateien, 985.857 Zeilen Code wurden hinzugefügt, 268.915 Zeilen wurden entfernt). In der vorherigen Version gab es 14.564 Korrekturen von 1.989 Entwicklern, die Patchgröße betrug 41 MB (zwei Mal kleiner als der Patch für Kernel 6.11). Ungefähr 46% aller Änderungen in 6.11 stehen im Zusammenhang mit Gerätetreibern, etwa 17% beziehen sich auf die Aktualisierung von architekturspezifischem Code, 10% betreffen den Netzwerk-Stack, 5% die Dateisysteme und 3% die internen Subsysteme des Kernels.

Die wichtigsten Neuerungen im Kernel 6.11:

  • Festplattensubsystem, Ein-/Ausgabe und Dateisysteme
    • Die Unterstützung für atomare Schreiboperationen auf Blockebene wurde umgesetzt, bei denen entweder das gesamte angegebene Set von Blöcken auf das Speichermedium geschrieben wird oder keiner der Blöcke, was Schutz vor Situationen bietet, in denen nach einem Hardwarefehler nur ein Teil der Blöcke geschrieben wird und in anderen Teilen alte Informationen verbleiben. Um den atomaren Schreibmodus im Systemaufruf pwritev() zu aktivieren, wurde das Flag RWF_ATOMIC hinzugefügt. Informationen über die Unterstützung atomarer Schreiboperationen (atomic_write_unit_min, atomic_write_unit_max und atomic_write_segments_max) in Bezug auf einzelne Dateien können mithilfe der Funktion statx() abgerufen werden.
    • Die Unterstützung für das Schreiben in ausführbare Dateien, die mit laufenden Prozessen verbunden sind, wurde bereitgestellt. 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 keinen praktischen Sinn hatte.
    • Die Möglichkeit zur Entwicklung von Blockgerätestreibern in der Programmiersprache Rust wurde umgesetzt. Als Beispiel wurde dem Kernel der Treiber rnull hinzugefügt, der ein Pendant zum Treiber null_blk ist, der in Rust geschrieben wurde.
    • Im Btrfs-Dateisystem unterstützt die Mount-Option „rescue=“ neue Modi wie „ignoremetacsums“ und „ignoresuperflags“, die genutzt werden können, um einige Prüfungen in den Benutzerraum beim Wiederherstellen des Dateisystems nach einem Ausfall zu verlagern. Die Implementierung der dynamischen Rückgabe von Blockgruppen wurde überarbeitet, um Situationen zu vermeiden, in denen nicht genügend Speicherplatz bei unvollständiger Auslastung des Dateisystems entsteht.
    • 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ß- und Kleinschreibung (casefold) durch die Speicherung der Namen in Form von qstr-Zeichenfolgen ohne unnötige Groß-/Kleinschreibungsumwandlungen vereinfacht.
    • Im Ext4-Dateisystem wurde die Funktion jbd2_transaction_committed optimiert, um die Leistung auf sehr schnellen Speichern zu steigern (in Tests wurde eine Steigerung der verarbeiteten Operationen pro Sekunde von bis zu 20 % festgestellt).
    • Im Systemaufruf statx() ist es erlaubt, einen NULL-Zeiger anstelle einer leeren Zeichenfolge mit dem Dateipfad zu übergeben, wenn das Flag AT_EMPTY_PATH gesetzt ist.
    • Im Systemaufruf open_by_handle_at() wurden die Überprüfungen der Zugriffsrechte auf die Datei gemindert, wenn die Berechtigung CAP_DAC_READ_SEARCH zum Durchsuchen des anfänglichen Namensraums fehlt. Zuvor ließ die Notwendigkeit der Berechtigung CAP_DAC_READ_SEARCH zum anfänglichen Namensraum den Systemaufruf open_by_handle_at() in Containern nicht zu.
    • Die Möglichkeiten der Systemaufrufe listmount() und statmount() wurden erweitert. In listmount() wurde das Flag LISTMOUNT_REVERSE hinzugefügt, um den Inhalt der Tabelle von Einhängepunkten in umgekehrter Reihenfolge auszugeben (neueste Einträge oben). In statmount() wurde die Ausgabe der beim Einhängen des Dateisystems festgelegten Optionen implementiert. In beiden Systemaufrufen ist die Ausführung ohne Zugriff auf den anfä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 fehlerhafter Daten implementiert, wobei Fehlerkorrekturcodes verwendet werden – wenn beim Lesen ein Ein-/Ausgabe-Fehler auftritt oder eine Prüfziffernüberprüfung nicht übereinstimmt, wird der fehlerhafte Datenblock automatisch neu geschrieben, sofern Redundanz zur Wiederherstellung vorhanden ist.
  • Speicher und Systemdienste
    • In die neuen Patches wurde ein Mechanismus zur Blockierung von Software-Interrupt-Handlern (BH, Bottom-Half) implementiert, der die verwendeten Datenstrukturen sperrt, jedoch keine blockierende Ausführung von nicht damit verbundenem Code verursacht. Es wird festgestellt, dass die Änderung nicht nur die Latenz für Kerne im Echtzeitbetrieb verringert hat, sondern auch die Leistung normaler Kerne erhöht hat (zum Beispiel wird für bestimmte Arten von Lasten eine Leistungssteigerung des Netzwerksubsystems um 14,5 % beobachtet).
    • Das asynchrone Eingabe-/Ausgabesystem io_uring hat Unterstützung für Operationen zur Implementierung der Funktionen bind() und listen() erhalten, die zur Erstellung von verbindenden Netzwerk-Sockets verwendet werden.
    • Ein Satz von ioctl-Operationen wurde für das Pseudo-Datei-System NSFS (NameSpace FS) hinzugefügt, das für die Arbeit mit Namensräumen verwendet wird. Neue ioctl ermöglichen die Umwandlung von Prozess-Identifikatoren und Thread-Gruppen-Identifikatoren zwischen verschiedenen Namensräumen der Prozess-Identifikatoren (PID-Namensraum). Ähnliche ioctl, die basierend auf pidfd-Identifikatoren die Dateideskriptoren von Prozessen in spezifischen Namensräumen bestimmen, wurden ebenfalls im Pseudo-Datei-System pidfd hinzugefügt.
    • Für BPF-Programme wurde die Unterstützung eines neuen Iterators hinzugefügt, der für die Arbeit mit Bitmasken verwendet werden kann, beispielsweise um einzelne Bits in Speicherbereichen wie cpumask zu durchlaufen. Ein Mechanismus wurde hinzugefügt, um Prozessen im Benutzerspace Benachrichtigungen über die Trennung (detach/unregister) von struct_ops-Objekten zu senden. Das Spektrum der Typen, die in Arrays verwendet werden können, wurde erweitert (zum Beispiel können Arrays mit Elementen der Typen kptr, bpf_rb_root und bpf_list_head deklariert werden). Ein zuverlässigerer Mechanismus für Split BTF (BPF Type Format) wurde vorgeschlagen, der für die Typüberprüfung im BPF-Pseudocode verwendet wird.
    • Ein neues System zur Stromversorgung von Geräten in einer bestimmten Reihenfolge wurde hinzugefügt. Dies ist nützlich, wenn ein Gerät vor einem anderen aktiviert werden muss (z. B. beim Aktivieren von drahtlosen Chips auf Qualcomm-Plattformen).
    • Das Modul 'Sloppy Logic Analyzer' wurde hinzugefügt, das die Erstellung einfacher logischer Signalschreiber ermöglicht, die GPIO verwenden und auf einem separaten CPU-Kern laufen.
    • Die Unterstützung für Laufzeit-Konstanten wurde eingeführt, die anstelle von einmalig initialisierten Variablen verwendet werden können. Zum Beispiel können Laufzeit-Konstanten anstelle von Variablen eingesetzt werden, die einen Zeiger und die Größe für den dentry-Cache speichern. Diese Variablen werden beim Laden festgelegt und ändern sich danach nie. Die Idee besteht darin, die Werte solcher Variablen direkt in den Codeanweisungen zu verwenden, um Overhead durch Zeigeroperationen zu vermeiden.
    • Die Übertragung der Änderungen aus dem Rust-for-Linux-Zweig, die die Verwendung von Rust als zweite Sprache für die Entwicklung von Treibern und Kernelmodulen betreffen, wird fortgesetzt (Die 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 hinzugefügt (Rust 1.78 bleibt jedoch als minimale Version unterstützt). Neben den zuvor genannten Mitteln zur Entwicklung von Blockgerätetreibern wurden in der neuen Version Abstraktionen für das Laden von Firmware, den Zugriff auf den Benutzerspeicher (uaccess) und die Arbeit mit der „page“-Struktur hinzugefügt.
    • Für x86-64-Systeme wurde ein neuer Systemaufruf uretprobe() implementiert, der die Funktion des uretprobe-Tracing-Mechanismus optimiert, der es ermöglicht, die von Funktionen in Benutzerspace-Anwendungen zurückgegebenen Werte zu verfolgen.
    • Es wurden neue Kernel-Befehlszeilenparameter hinzugefügt: "reserve_mem" zum Reservieren eines benannten Speicherbereichs während des Bootvorgangs und "ramoops.mem_name" zur Verwendung im pstore-Speicherbereich, der über reserve_mem erstellt wurde.
    • Im Speichercontroller basierend auf cgroup wurde dem Datei memory.reclaim der Parameter „swappiness“ hinzugefügt, der es ermöglicht, das Gleichgewicht zwischen dem Auslagern anonymer Speicherseiten in die Swap-Partition und der Freigabe von Speicherseiten, die für den Dateicache verwendet werden, zu ändern.
    • Es wurde eine ioctl-Schnittstelle PROCMAP_QUERY hinzugefügt, um virtuelle Speicherbereiche (Virtual Memory Area) in /proc/PID/maps effizienter zu durchsuchen.
    • Dem Systemaufruf mmap() wurde das Flag MAP_DROPPABLE hinzugefügt, um Speicher anzufordern, der niemals in die Swap-Partition zurückgeschrieben wird, aber im Falle von Speichermangel entfernt werden kann.
    • Für die ARM64-Architektur wurde die Unterstützung für das Hot-Plugging (Wechsel zwischen Online-/Offline-Modi) physischer und virtueller CPUs in Systemen mit ACPI implementiert.
    • Für die RISC-V-Architektur wurde die Unterstützung für das Hot-Plugging von Speicher hinzugefügt, und der GCC-Plugin STACKLEAK wurde integriert (er initialisiert alle im Stack gespeicherten Variablen, um das Auslaufen von Informationen aus dem Kernel durch nicht initialisierte Variablen zu verhindern, die Reste zuvor im Stack gespeicherter Daten enthalten können).
    • Der Mechanismus für die gefälschte EFI-Speicherabbildung wurde während des Bootvorgangs entfernt. Dieser Mechanismus wurde in der Praxis nicht verwendet und störte die Entwicklungen im Bereich der vertraulichen Ausführung. virtuellen Maschinen.
    • Die Unterstützung der PowerPC 40x-Plattform wurde eingestellt.
    • Die Anforderungen an die Version von GNU Make wurden erhöht — zur Kompilierung des Kernels ist mindestens eine Version von GNU Make erforderlich, die 2013 veröffentlicht wurde.
  • Virtualisierung und Sicherheit
    • Patches wurden integriert, die die Erzeugung von Zufallszahlen über den Systemaufruf getrandom() erheblich (bis zu 15-mal) beschleunigen. Diese Optimierung beruht auf der Nutzung des vDSO-Mechanismus (virtual dynamic shared object), der es ermöglicht, den Handler des Systemaufrufs aus dem Kernel in den Adressraum des Benutzers zu verlagern und Kontextwechsel zu vermeiden. Der Systemaufruf wird direkt vom Kernel in den Adressraum des Prozesses geladen.
    • Für x86-64-Systeme wurde eine neue Implementierung des AES-GCM-Verschlüsselungsalgorithmus hinzugefügt, die die Verwendung von Vektorbefehlen wie VAES, VPCLMULQDQ und AVX512/AVX10 zur Beschleunigung der Berechnungen unterstützt. In durchgeführten Tests wurde eine Leistungssteigerung von bis zu 156 % nach der Umstellung auf die neue Implementierung festgestellt. Die Assemblierung des AES-GCM wurde vollständig überarbeitet, um Korrektheit, Leistung, Größe und umfassende Dokumentation des Codes zu gewährleisten.
    • Die Möglichkeit, einen Kernel als Gastbetriebssystem in virtualisierten Umgebungen zu starten, die die Prozessorerweiterung AMD SEV-SNP (Secure Nested Paging) verwenden, wurde implementiert. Diese soll eine sichere Verwendung von verschachtelten Seitenverzeichnissen gewährleisten. Für zusätzliche Isolation des Zugriffs auf Ressourcen aus virtuellen Maschinen kann das SVSM-Modul (Linux Secure VM Service Module) verwendet werden. Im Hypervisor KVM wurde die anfängliche Unterstützung für den Start von Gastbetriebssystemen, die durch AMD SEV-SNP geschützt sind, hinzugefügt.
    • Ein separater Bucket-Slab-Allocator wurde hinzugefügt, der über die Option CONFIG_SLAB_BUCKETS aktiviert werden kann und einen Schutz gegen Angriffe mit der Methode "Heap Spraying" bietet.
    • Im KVM-Hypervisor wurde ein ioctl-Aufruf für die vorzeitige Zuweisung von Speicher an das Gastbetriebssystem bis zu dessen tatsächlichem Start hinzugefügt.
  • Netzwerksubsystem
    • Der sysctl-Parameter net.tcp_rto_min_us wurde hinzugefügt, mit dem der minimale Timeout für die erneute Übertragung (retransmission timeout) von TCP-Sockets konfiguriert werden kann.
    • Das ethtool-Utility erhält die Möglichkeit zur Feinabstimmung der Konfiguration von Interrupt-Handlern für Netzwerkschnittstellen, die das Net DIM-Interface verwenden.
  • Ausrüstung
    • Der AMDGPU-Treiber unterstützt jetzt anfänglich die GPU AMD RDNA4 („GFX12“). Unterstützung für Technologien wie DCN 4.0.x, GC 12.0, GMC 12.0, SDMA 7.0, MES12 und MMHUB 4.1 wurde hinzugefügt.
    • Die Arbeit am drm-Treiber (Direct Rendering Manager) Xe für GPUs auf Basis der Intel Xe-Architektur, die in Intel Arc-Grafikkarten und integrierter Grafik ab den Tiger Lake-Prozessoren verwendet wird, wurde fortgesetzt. Die Unterstützung für GPUs auf Basis der Mikroarchitekturen Battlemage, Arrow Lake und Lunar Lake wurde verbessert.
    • Im DRM-Subsystem (Direct Rendering Manager) wurde der Handler für die vom Monitor bereitgestellten EDID-Parameter (Extended Display Identification Data) neu geschrieben.
    • Im i915-Treiber wurde die Unterstützung für die GPU Battlemage Xe2 hinzugefügt, und der CMRR-Modus (Content Match Refresh Rate) ist jetzt standardmäßig aktiviert.
    • Im DRM-Treiber msm (GPU Qualcomm Adreno) wurde die Unterstützung für die Plattform SM7150 sowie die GPUs X185 und a505 hinzugefügt.
    • Die Unterstützung für die Lincoln Tech Sol LCD185-101CT Bildschirmpaneele, 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 und K&d kd101ne3-40ti wurde hinzugefügt.
    • Die 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 wurde in das Audiosystem integriert.
    • Die letzte Reihe von Änderungen wurde implementiert, um die Unterstützung des ARM SoC Snapdragon X Elite zu gewährleisten, der mit einer eigenen 12-Kern-CPU Qualcomm Oryon und einer GPU Qualcomm Adreno ausgestattet ist. Der Chip zielt auf den Einsatz in Laptops und PCs ab und übertrifft in vielen Leistungstests die Chips Apple M3 und Intel Core Ultra 155H. Die in den Kernel 6.11 eingefügten Änderungen beziehen sich auf die Unterstützung der GPU Adreno X1-85 und das Energiemanagement. Zu den Geräten, die auf dem SoC Snapdragon X Elite basieren, gehört die Unterstützung von Laptops wie dem ASUS Vivobook S15 und dem Lenovo Yoga Slim7x.

Gleichzeitig hat die lateinamerikanische Stiftung für freie Software eine vollständig freie Kernel-Version 6.11 – Linux-libre 6.10-gnu, die von Firmware-Elementen und Treibern befreit ist, die nicht-freie Komponenten oder Codebereiche enthalten, deren Verwendung vom Hersteller eingeschränkt ist, veröffentlicht. In der Version 6.11 wurde der Code zur Bereinigung von Blobs in den Treibern mdgpu, adreno, vgxy61, atomisp, btnxpuart, prueth und tas2781 aktualisiert. Neue Treiber wie amdgpu isp, tn40, rtl8192du, cs40l50, rt1320 und pcie-rcar-gen4 wurden bereinigt. Es wurde eine Bereinigung der Blob-Namen in dts-Dateien (Gerätbaum) für die Architektur Aarch64 vorgenommen. Eine Version der Primitives für das Laden von Firmware wurde hinzugefügt, die keine Warnungen und Anfragen ausgibt (nowait-nowarn). Code zur Erkennung der Primitives zum Laden von Firmware wurde im Rust-Code hinzugefügt.

Quelle: opennet.ru

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster