Odyssey-Fahrplan: Was wir vom Connection-Puller noch wollen. Andrei Borodin (2019)

Nach zwei Monaten der Entwicklung präsentierte Linus Torvalds vor die Kernel-Version Linux 5.9. Unter den bemerkenswertesten Änderungen: Einschränkung des Imports von Symbolen aus proprietären Modulen in GPL-Module, Beschleunigung der Kontextwechseloperationen durch die Prozessoranweisung FSGSBASE, Unterstützung der Kompression des Kernel-Images mit Zstd, Überarbeitung der Priorisierung von Threads im Kernel, Unterstützung des PRP-Protokolls (Parallel Redundancy Protocol), bandbreitenbewusstes Scheduling im Deadline-Scheduler, vorausschauende Speicherseitenkompression, Capability-Flag CAP_CHECKPOINT_RESTOR, Systemaufruf close_range(), Leistungsteigerung von dm-crypt, Entfernung von Code für 32-Bit Gastsysteme Xen PV, neuer Slab-Speicherverwaltung, Option „rescue“ in Btrfs, Unterstützung von Inline-Verschlüsselung in ext4 und F2FS.

In die neue Version wurden 16074 Korrekturen von 2011 Entwicklern übernommen,
die Patch-Größe beträgt 62 MB (Änderungen betrafen 14548 Dateien, 782155 neue Codezeilen wurden hinzugefügt, 314792 Zeilen wurden gelöscht). Ungefähr 45% aller Änderungen in 5.9
Änderungen stehen im Zusammenhang mit Gerätetreibern, rund 15 % der Änderungen betreffen
beziehen sich auf die Aktualisierung von kodera spezifisch für Hardwarearchitekturen, 13%
gehört zum Netzwerk-Stack, 3% – zu Dateisystemen und 3% zu internen
Subsystemen des Kernels.

Haupt- Neuheiten:

  • Speicher und Systemdienste
    • Verschärft Schutz vor der Verwendung von GPL-Schichten zur Verknüpfung proprietärer Treiber mit Kernelkomponenten, die nur für GPL-lizenzierte Module exportiert werden. Das Flag TAINT_PROPRIETARY_MODULE wird nun in allen Modulen vererbt, die Symbole aus Modulen mit diesem Flag importieren. Wenn ein GPL-Modul versucht, Symbole aus einem nicht-GPL-Modul zu importieren, erbt dieses GPL-Modul das Label TAINT_PROPRIETARY_MODULE und kann nicht auf Kernelkomponenten zugreifen, die nur für GPL-lizenzierte Module verfügbar sind, selbst wenn das Modul zuvor Symbole aus der Kategorie „gplonly“ importiert hat. Eine Rückwärtsblockade (Export nur von EXPORT_SYMBOL_GPL in Modulen, die EXPORT_SYMBOL_GPL importiert haben), die die Funktionsweise proprietärer Treiber beeinträchtigen könnte, wurde nicht implementiert (nur das Flag des proprietären Moduls wird vererbt, jedoch nicht die GPL-Bindung).
    • Hinzugefügt Unterstützung des kcompactd-Mechanismus für vorausschauende Speicherseitenkompression Im Hintergrund ermöglicht es, die Anzahl der großen Speicherseiten, die dem Kernel zur Verfügung stehen, zu erhöhen. Vorausichtlich ermöglicht die Hintergrundverpackung mit minimalen Overheadkosten eine Reduzierung der Verzögerungen bei der Zuweisung großer Speicherseiten (huge-page) um das 70-80-fache im Vergleich zu dem zuvor verwendeten Verpackungsmechanismus, der nach Bedarf aktiviert wird (on-demand). Um die Grenzen der externen Fragmentierung, die kcompactd bereitstellt, festzulegen, wurde sysctl vm.compaction_proactiveness hinzugefügt.
    • Hinzugefügt Unterstützung der Kernel-Image-Komprimierung mit dem Algorithmus Zstandard (zstd).
    • Für x86-Systeme wurde die Unterstützung der Prozessoranweisung FSGSBASE, die es ermöglicht, den Inhalt der FS/GS-Register aus dem Benutzerspeicher zu lesen und zu ändern, implementiert. Im Kernel wird FSGSBASE verwendet, um die Kontextwechseloperationen zu beschleunigen, indem unnötige MSR-Schreiboperationen für GSBASE vermieden werden. Im Benutzerspeicher ermöglicht es, ohne unnötige Systemaufrufe zur Änderung von FS/GS auszukommen.
    • Hinzugefügt Der Parameter „allow_writes“, der das Ändern der MSR-Register des Prozessors aus dem Benutzerspeicher verbietet und den Zugriff auf den Inhalt dieser Register auf Leseoperationen beschränkt, da das Ändern der MSR zu Problemen führen kann. Standardmäßig ist das Schreiben derzeit nicht verboten, und die Änderung der MSR wird im Protokoll festgehalten, aber in Zukunft ist geplant, den Standardzugriff in den Nur-Lese-Modus zu versetzen.
    • In die Schnittstelle für asynchrone Eingabe/Ausgabe io_uring wurde die vollständige Unterstützung asynchroner Operationen für gepufferte Lesevorgänge, die keine Einbindung von Kernel-Threads erfordern, hinzugefügt. Die Unterstützung für das Schreiben wird in der nächsten Version erwartet.
    • Im I/O-Planer Deadline wurde implementiert werden Planungsstrategien unter Berücksichtigung der Bandbreite implementiert, die es ermöglichen, korrekte Entscheidungen auf asymmetrischen Systemen zu treffen, wie z.B. ARM-Systeme basierend auf den Architekturen DynamIQ und big.LITTLE, die leistungsstarke und weniger leistungsfähige energieeffiziente CPU-Kerne in einem Chip kombinieren. Insbesondere ermöglicht der neue Modus, Planungsinkonsistenzen zu vermeiden, wenn ein langsamer CPU-Kern nicht über die erforderlichen Ressourcen verfügt, um eine Aufgabe fristgerecht auszuführen.
    • Das Energieverbrauchsmodell im Kernel (Energy Model Framework) deckt jetzt beschreibt nicht nur das Verhalten des Energieverbrauchs der CPU ab, sondern auch die Peripheriegeräte.
    • Der Systemaufruf close_range() wurde implementiert, der es einem Prozess ermöglicht, einen gesamten Bereich von offenen Dateideskriptioren gleichzeitig zu schließen.
    • Aus der Implementierung der Textkonsole und des Treibers fbcon wurde der Code, der die Möglichkeit der programmgesteuerten Rückwärtsblättern von Text (CONFIG_VGACON_SOFT_SCROLLBACK) über den verfügbaren Videoramumfang des VGA-Textmodus hinaus ermöglichte, entfernt.
    • Überarbeitet ein Algorithmus zur Zuweisung von Prioritäten für Threads innerhalb des Kernels. Die neue Variante sorgt für eine bessere Konsistenz in allen Subsystemen des Kernels bei der Zuweisung von Prioritäten für Echtzeitarbeiten.
    • Ein neuer sysctl sched_uclamp_util_min_rt_default wurde hinzugefügt, um die Parameter der CPU-Taktfrequenzzuweisung für Echtzeitsysteme zu steuern (z. B. kann das Verhalten bei der Ausführung von Echtzeitarbeiten zur Energieeinsparung beim Wechsel auf Batteriestrom oder in mobilen Systemen dynamisch angepasst werden).
    • Die Vorbereitung zur Implementierung der Unterstützung für die Technologie Transparent Huge Pages im Seiten-Cache wurde abgeschlossen.
    • Im Mechanismus fanotify wurden neue Flags FAN_REPORT_NAME und FAN_REPORT_DIR_FID implementiert, um Informationen über den übergeordneten Namen und die eindeutige FID-Identifikation bei den Ereignissen von Erstellen, Löschen oder Verschieben von Katalogelementen und nicht kataloggebundenen Objekten zu übertragen.
    • Für cgroups wurde implementiert wurde ein neuer Slab-Speichercontroller (slab memory controller) implementiert, der bemerkenswerterweise die Zählung von Slab vom Seitenlevel auf die Objektebene des Kernels verlagert, was die gemeinsame Nutzung von Slab-Seiten in verschiedenen cgroups ermöglicht, anstatt separate Slab-Caches für jede cgroup zu reservieren. Der vorgeschlagene Ansatz ermöglicht eine effizientere Nutzung von Slab und verringert den für Slab verwendeten Speicher um 30-45%, reduziert den Gesamtspeicherverbrauch des Kernels erheblich und verringert die Speicherfragmentierung.
    • Im Audiosubsystem ALSA und USB-Stack, in Übereinstimmung mit kürzlich angenommenen den Empfehlungen zur Verwendung inklusiver Terminologie im Linux-Kernel wurde eine Bereinigung von politisch nicht korrekten Begriffen durchgeführt. Der Code wurde von den Verwendungen der Begriffe „slave“, „master“, „blacklist“ und „whitelist“ befreit.
  • Virtualisierung und Sicherheit
    • Bei der Kernel-Kompilierung mit dem Compiler Clang ein kann die Option zur automatischen Initialisierung aller Variablen im Stack mit null (CONFIG_INIT_STACK_ALL_ZERO) konfiguriert werden (bei der Kompilierung wird „-ftrivial-auto-var-init=zero“ angegeben).
    • Im Seccomp-Subsystem, bei der Verwendung des Modus zur Prozesskontrolle im Benutzermodus, hinzugefügt die Möglichkeit Ersatz in den überwachten Prozess von Dateideskriptoren zur vollständigen Emulation von Systemaufrufen, die zur Erstellung von Dateideskriptoren führen. Diese Funktionalität ist in Systemen mit isolierten Containern und in der Realisierung von Sandboxes für Chrome gefragt.
    • Für die Architekturen xtensa und csky wurde die Unterstützung für die Begrenzung von Systemaufrufen über das seccomp-Subsystem hinzugefügt. Für xtensa wurde zusätzlich die Unterstützung für den Audit-Mechanismus implementiert.
    • Hinzugefügt neues Fähigkeit-Flag CAP_CHECKPOINT_RESTORE, das erlaubt, ohne zusätzliche Privilegien auf Funktionen im Zusammenhang mit dem Einfrieren und der Wiederherstellung des Zustands von Prozessen zuzugreifen.
    • In GCC 11 wurden alle notwendigen Funktionen realisiert für
      das Debugging-Tool KCSAN (Kernel Concurrency Sanitizer), das zur dynamischen Erkennung von Race Conditions im Kernel dient. Somit kann KCSAN jetzt mit in GCC kompilierten Kernen verwendet werden.
    • Für AMD Zen und neuere CPU-Modelle hinzugefügt wurde die Unterstützung der P2PDMA-Technologie hinzugefügt, die es ermöglicht, DMA für die direkte Datenübertragung zwischen dem Speicher zweier an den PCI-Bus angeschlossenen Geräte zu nutzen.
    • In dm-crypt wurde ein Modus hinzugefügt, der die Latenzzeit reduziert, indem die kryptographische Datenverarbeitung ohne Verwendung von Worker-Queues durchgeführt wird. Der angegebene Modus ist auch notwendig für die korrekte Arbeit mit zonalisierten Blockgeräten (Geräte mit Bereichen, die sequentiell mit der vollständigen Aktualisierung aller Blockgruppen geschrieben werden müssen). Es wurden Arbeiten zur Verbesserung der Durchsatzrate und zur Reduzierung der Latenzzeit in dm-crypt durchgeführt.
    • Der Code zur Unterstützung von 32-Bit-Gastsystemen, die im Paravirtualisierungsmodus unter dem Xen-Hypervisor betrieben werden, wurde entfernt. Benutzer solcher Systeme sollten auf die Verwendung von 64-Bit-Kernen in Gastsystemen umsteigen oder anstelle von Paravirtualisierung (PV) die Modi der vollständigen (HVM) oder kombinierten (PVH) Virtualisierung verwenden.
  • Festplattensubsystem, Ein-/Ausgabe und Dateisysteme
    • Im Btrfs-Dateisystem wurde wurde die Mount-Option „rescue“ eingeführt, die den Zugang zu allen anderen Wiederherstellungsoptionen vereinheitlicht. Die Unterstützung für die Optionen „alloc_start“ und „subvolrootid“ wurde entfernt, und die Option „inode_cache“ wurde für veraltet erklärt. Es wurden Leistungsoptimierungen durchgeführt, insbesondere das fsync()-Operationen deutlich beschleunigt. Hinzugefügt die Möglichkeit, alternative Prüfzifferntypen anders als CRC32c zu verwenden.
    • Hinzugefügt Die Möglichkeit der Verwendung von Inline-Verschlüsselung (Inline Encryption) in den Dateisystemen ext4 und F2FS, für die eine Montageoption "inlinecrypt" vorgesehen ist. Der Modus der Inline-Verschlüsselung ermöglicht es, die in den Speichercontroller integrierten Verschlüsselungsmechanismen zu nutzen, die eine transparente Verschlüsselung und Entschlüsselung von Ein- und Ausgaben ermöglichen.
    • In XFS sicherstellt Asynchrone Rücksetzung von Inodes (flush), die die Prozesse während der Speicherbereinigung nicht blockiert. Ein langjähriges Problem mit Quoten wurde behoben, bei dem Warnungen über das Überschreiten der weichen Grenzen und der Einschränkungen für die Anzahl von Inodes nicht korrekt überwacht wurden. Die Implementierung der DAX-Unterstützung für ext4 und xfs wurde vereinheitlicht.
    • In Ext4 wurde Vorausschauendes Laden der Bitmaps zur Blockverteilung. In Kombination mit der Einschränkung des Scannens von nicht initialisierten Gruppen hat diese Optimierung die Zeit für das Mounten sehr großer Partitionen verkürzt.
    • In F2FS wurde hinzugefügt ioctl F2FS_IOC_SEC_TRIM_FILE, das die Verwendung von TRIM-/discard-Befehlen zum physischen Löschen der angegebenen Daten in einer Datei ermöglicht, beispielsweise zur Entfernung von Zugriffsschlüsseln ohne verbleibende Daten auf dem Speicher.
      In F2FS ebenfalls wurde hinzugefügt ein neuer Modus der Müllsammlung GC_URGENT_LOW, der aggressiver arbeitet, indem er einige Kontrollen des Leerlaufs (idle) vor dem Start des Müllsammlers ausschließt.
    • In bcache wurde die Größe von bucket_size für Extents von 16 auf 32 Bit erhöht, um die Möglichkeit der Anwendung auf den Cache von zonierten Geräten vorzubereiten.
    • In das SCSI-Subsystem wurde die Möglichkeit der Verwendung von Inline-Verschlüsselung auf Basis integrierter Hardware-Verschlüsselungsfunktionen, die von UFS-Controllern bereitgestellt werden, hinzugefügt (Universal Flash Storage).
    • Ein neuer Kernel-Befehlszeilenparameter "debugfs" wurde hinzugefügt, um die Verfügbarkeit des gleichnamigen Pseudo-Dateisystems zu steuern.
    • Im NFSv4.2-Client wurden erweiterte Dateiattribute (xattr) unterstützt.
    • In dm-dust wurde hinzugefügt eine Schnittstelle zur sofortigen Ausgabe aller identifizierten Bad Blocks auf der Festplatte ("dmsetup message dust1 0 listbadblocks").
    • Für md/raid5 wurde der Parameter /sys/block/md1/md/stripe_size zur Anpassung der STRIPE-Blockgröße hinzugefügt.
    • Für NVMe-Speichergeräte hinzugefügt wurde die Unterstützung von Befehlen zum Zonieren von Speicher (ZNS, NVM Express Zoned Namespace) hinzugefügt, die es ermöglichen, den Speicherbereich in Zonen zu unterteilen, die Gruppen von Blöcken bilden, um die Datenplatzierung auf dem Speicher besser zu steuern.
  • Netzwerksubsystem
    • In Netfilter hinzugefügt Möglichkeit der Paketverweigerung vor der Überprüfung der Weiterleitung (der Ausdruck REJECT kann jetzt nicht nur in den Ketten INPUT, FORWARD und OUTPUT, sondern auch in der PREROUTING-Phase für icmp und tcp verwendet werden).
    • In nftables hinzugefügt Möglichkeit zur Überwachung von Ereignissen, die mit der Änderung von Konfigurationen verbunden sind.
    • In nftables im netlink-API hinzugefügt Unterstützung anonymer Ketten, deren Namen dynamisch vom Kernel vergeben werden. Beim Löschen der zugehörigen Regel wird auch die anonyme Kette automatisch gelöscht.
    • In BPF wurde Unterstützung für Iteratoren hinzugefügt, um Elemente von assoziativen Arrays (map) ohne Kopieren der Daten in den Benutzerspeicher zu durchlaufen, zu filtern und zu ändern. Iteratoren können für TCP- und UDP-Sockets verwendet werden, was es BPF-Programmen ermöglicht, Listen offener Sockets zu durchlaufen und benötigte Informationen daraus zu extrahieren.
    • Ein neuer Typ von BPF-Programmen BPF_PROG_TYPE_SK_LOOKUP wurde hinzugefügt, der ausgeführt wird, wenn der Kernel nach einem geeigneten hörenden Socket für eine eingehende Verbindung sucht. Mit einem solchen BPF-Programm können Handler erstellt werden, die Entscheidungen darüber treffen, mit welchem Socket die Verbindung verknüpft werden soll, ohne an den Systemaufruf bind() gebunden zu sein. Beispielsweise kann eine Zuordnung eines Sockets zu einem Adress- oder Portbereich eingerichtet werden. Außerdem wurde in bpf_setsockopt() die Unterstützung für das Flag SO_KEEPALIVE hinzugefügt und die Möglichkeit zur Einrichtung von BPF_CGROUP_INET_SOCK_RELEASE-Handlern realisiert, die beim Freigeben des Sockets aufgerufen werden.
    • Unterstützung für das Protokoll PRP (Parallel Redundancy Protocol), das es ermöglicht, auf Basis von Ethernet einen nahtlosen Wechsel zu einem Backup-Kanal im Falle eines Ausfalls eines Netzwerkkomponenten zu realisieren.
    • Im Stack mac80211 hinzugefügt Unterstützung für das vierstufige Aushandlungsverfahren WPA/WPA2-PSK im Access-Point-Modus.
    • Die Möglichkeit wurde hinzugefügt, den Scheduler qdisc (queuing discipline) standardmäßig auf den Algorithmus FQ-PIE (Flow Queue PIE) einzustellen, der darauf abzielt, die negativen Auswirkungen von Zwischenpufferung von Paketen in grenzwertigen Netzgeräten (bufferbloat) in Kabelmodemnetzwerken zu verringern.
    • Neue Funktionen in MPTCP (MultiPath TCP), eine Erweiterung des TCP-Protokolls, die es ermöglicht, TCP-Verbindungen gleichzeitig über mehrere Routen über verschiedene Netzwerk-Schnittstellen zu realisieren, die an unterschiedliche IP-Adressen gebunden sind. Unterstützung für syn cookie, DATA_FIN, automatische Puffereinstellungen, Socket-Diagnose und die Verwendung der Flags REUSEADDR, REUSEPORT und V6ONLY in setsockopt wurde hinzugefügt.
    • Für virtuelle Routing-Tabellen VRF (Virtual Routing and Forwarding), die den Betrieb mehrerer Routing-Domänen auf einem System ermöglichen, wurde der Modus „strict“ implementiert. In diesem Modus kann die virtuelle Tabelle nur mit einer Routing-Tabelle assoziiert werden, die nicht in anderen virtuellen Tabellen verwendet wird.
    • Im drahtlosen Treiber ath11k hinzugefügt wurde die Unterstützung für die Frequenz 6GHz und Spektral-Scanning.
  • Ausrüstung
    • Der Code zur Unterstützung der UniCore-Architektur, die im Mikroprozessorzentrum der Peking-Universität entwickelt und 2011 in den Linux-Kernel aufgenommen wurde, wurde entfernt. Diese Architektur wird seit 2014 nicht mehr unterstützt und hat keine Unterstützung in GCC.
    • Für die RISC-V-Architektur wurde Unterstützung für kcov (debugfs-Schnittstelle zur Analyse der Codeabdeckung des Kernels), kmemleak (System zur Erkennung von Speicherlecks), Stackschutz, Sprungmarken und tickless-Operationen (signalunabhängige Zeitschaltbarkeit des Multitasking).
    • Für die PowerPC-Architektur wurde Unterstützung für Warteschlangen für Spinlock implementiert, was die Leistung in Konfliktsituationen erheblich verbessert hat.
    • Für die Architekturen ARM und ARM64 wurde standardmäßig der Mechanismus zur Regelung der Prozessorgeschwindigkeit aktiviert, schedutil (cpufreq governor), der zur Entscheidungsfindung über die Änderung der Frequenz direkt Informationen vom Task-Scheduler nutzt und sofort auf cpufreq-Treiber zugreifen kann, um die Frequenz sofort anzupassen und die CPU-Leistung an die aktuelle Last anzupassen.
    • Im DRM-Treiber i915 für Intel-Grafikkarten wurde Unterstützung für Chips auf Basis der Mikroarchitektur Rocket Lake hinzugefügt und eine erste Unterstützung für diskrete Karten Intel Xe DG1.
    • wurde implementiert. Der Treiber amdgpu unterstützt jetzt zunächst die AMD GPU Navi 21 (Navy Flounder) und Navi 22 (Sienna Cichlid). Unterstützung für die Video-Encoding- und Decoding-Beschleunigung UVD/VCE für GPUs der Southern Islands (Radeon HD 7000) wurde hinzugefügt.
      Eine Eigenschaft zur Drehung der Anzeige um 90, 180 oder 270 Grad wurde hinzugefügt.

      Es ist interessant, dass der Treiber für AMD-GPUs ist Der größte Treiber im Kern — er umfasst etwa 2,71 Millionen Codezeilen, was etwa 10 % der Gesamtgröße des Kerns (27,81 Millionen Zeilen) entspricht. Davon entfallen 1,79 Millionen Zeilen auf automatisch generierte Header-Dateien mit Daten für GPU-Register, während C-Code 366.000 Zeilen ausmacht (zum Vergleich: Der Intel i915-Treiber umfasst 209.000 Zeilen und Nouveau 149.000).

    • die anfängliche Unterstützung für die GPU NVIDIA GA100 auf der Basis der Mikroarchitektur Ampere hinzugefügt. hinzugefügt Unterstützung der frame-by-frame Integritätsprüfung mittels CRC (Cyclic Redundancy Checks) in den Display-Treibern von NVIDIA GPUs. Die Implementierung basiert auf der von NVIDIA bereitgestellten Dokumentation.
    • Treiber für LCD-Panels hinzugefügt: Frida FRD350H54004, KOE TX26D202VM0BWA, CDTech S070PWS19HP-FC21, CDTech S070SWV29HG-DC44, Tianma TM070JVHG33 und Xingbangda XBD599.
    • Im ALSA-Audiosubsystem wurde Unterstützung für (Modus zur dauerhaften Energieversorgung für externe HDMI-Geräte, um Verzögerungen beim Start der Wiedergabe auszuschließen) und ein neues Gerät ein neues Gerät zur Steuerung der Hintergrundbeleuchtung der Mikrofonaktivierungstasten und zur Stummschaltung hinzugefügt, ebenso wie Unterstützung für neue Hardware, einschließlich des Controllers Loongson 7A1000.
    • Unterstützung von ARM-Plattformen, Geräten und Plattformen hinzugefügt: Pine64 PinePhone v1.2, Lenovo IdeaPad Duet 10.1, ASUS Google Nexus 7, Acer Iconia Tab A500, Qualcomm Snapdragon SDM630 (verwendet in Sony Xperia 10, 10 Plus, XA2, XA2 Plus und XA2 Ultra), Jetson Xavier NX, Amlogic WeTek Core2, Aspeed EthanolX, fünf neue Boards basierend auf NXP i.MX6, MikroTik RouterBoard 3011, Xiaomi Libra, Microsoft Lumia 950, Sony Xperia Z5, MStar, Microchip Sparx5, Intel Keem Bay, Amazon Alpine v3, Renesas RZ/G2H.

Gleichzeitig hat die lateinamerikanische Free Software Foundation ein vollständig freies Kernels 5.6
Variante vollständig freies Kernel 5.9Linux-libre 5.9-gnu, bereinigt von Firmware-Elementen und Treibern, die nicht-freie Komponenten oder Codeabschnitte enthalten, deren Verwendung durch den Hersteller eingeschränkt ist. In der neuen Version wurde das Laden von Blobs in den Treibern für WiFi rtw8821c und MediaTek SoC mt8183 deaktiviert. Der Code zur Bereinigung von Blobs in Treibern und Subsystemen von Habanalabs, Wilc1000, amdgpu, mt7615, i915 CSR, Mellanox mlxsw (Spectrum3), r8169 (rtl8125b-2) und x86 Touchscreen wurde aktualisiert.

Quelle: opennet.ru

60GB SSD 8Gb DDR4