Nach zwei Monaten der Entwicklung präsentierte Linus Torvalds das Release des Linux-Kernels 5.16. Zu den auffälligsten Änderungen gehören: der Systemaufruf futex_waitv zur Leistungssteigerung von Windows-Spielen in Wine, Fehlerverfolgung im Dateisystem über fanotify, das Konzept der Folios im Speichermanagement, Unterstützung für AMX-Prozessoranweisungen, die Möglichkeit, Speicher für Netzwerk-Sockets zu reservieren, Unterstützung in netfilter für die Klassifizierung von Paketen in der Phase "Egress", der Einsatz des DAMON-Subsystems für die proaktive Auslagerung nicht benötigter Speicherbereiche, Verbesserungen bei der Verarbeitung von Überlastungen bei hohem Schreibaufkommen sowie Unterstützung für Mehrfachlaufwerke.
In die neue Version wurden 15.415 Korrekturen von 2.105 Entwicklern aufgenommen, die Größe des Patches beträgt 45 MB (Änderungen betreffen 12.023 Dateien, hinzugefügt wurden 685.198 Codezeilen, 263.867 Zeilen gelöscht). Etwa 44 % aller Änderungen in 5.16 sind mit Geräteschnittstellen verbunden, etwa 16 % der Änderungen beziehen sich auf die Aktualisierung von architekturspezifischem Code, 16 % sind Netzwerk-Stack bezogen, 4 % auf Dateisysteme und 4 % auf interne Kernsubsysteme.
Die wichtigsten Neuerungen im Kernel 5.16:
- Festplattensubsystem, Ein-/Ausgabe und Dateisysteme
- Der fanotify-Mechanismus wurde um Werkzeuge zur Überwachung des Zustands des Dateisystems und zur Verfolgung von Fehlern erweitert. Informationen über Fehler werden durch einen neuen Ereignistyp — FAN_FS_ERROR — übermittelt, die in Benutzerraum-Überwachungssystemen zur sofortigen Benachrichtigung des Administrators oder zur Einleitung von Wiederherstellungsprozessen abgefangen werden können. Bei kaskadierenden Fehlern stellt fanotify die Lieferung der Nachricht über den ersten Fehler zusammen mit einem Gesamtteller für die Probleme sicher, um die nachfolgende Analyse der Ursachen des Ausfalls zu erleichtern. Die Unterstützung der Fehlerverfolgung ist derzeit nur für das Ext4-Dateisystem implementiert.
- Die Verarbeitung von Überlastungen bei Schreiboperationen (write congestion) wurde verbessert, die auftreten, wenn das Volumen der Schreiboperationen die Speicherkapazität übersteigt und das System gezwungen ist, die Schreibanforderungen des Prozesses bis zum Abschluss der bereits übermittelten Anfragen zu blockieren. In der neuen Version wurde der Kernmechanismus, der zur Erfassung von Überlastungen und zur Blockierung von Aufgaben verwendet wird, vollständig überarbeitet, da bei der alten Implementierung Probleme mit der Synchronisation der Verarbeitung von Schreibüberlastungen und dem Auslagern von Speicherseiten auf den Swap-Speicher bei unzureichendem Speicher im System auftraten.
- In Btrfs wurde die Unterstützung der Zonenverwaltungstechnologie (Zoned Namespace) implementiert, die in Festplatten oder NVMe SSDs verwendet wird, um den Speicherraum in Zonen zu unterteilen, die aus Gruppen von Blöcken oder Sektoren bestehen, in die lediglich sequentielle Datenspeicherung mit vollständiger Aktualisierung der gesamten Gruppe von Blöcken erlaubt ist. Darüber hinaus wurden kleinere Optimierungen beim Logging von Inodes vorgenommen, die eine Erhöhung der Durchsatzleistung um 3 % im dbench-Test sowie eine Reduzierung der Latenz um 11 % ermöglichten. Der Logging-Mechanismus für Verzeichnisse wurde überarbeitet, um die Effizienz zu steigern, indem die Anzahl der Such- und Sperroperationen im Baum reduziert wurde. Das Einfügen von Elementen in die btree-Struktur im Batch-Modus wurde beschleunigt (die Zeit für das Masseneinfügen von Elementen wurde um 4 % und für das Löschen um 12 % verkürzt). Eine eingeschränkte Unterstützung für die Verwendung von Kompression beim Schreiben unvollständiger Seiten wurde hinzugefügt, sowie die Möglichkeit zur Defragmentierung von Unterseiten (subpage). Vorbereitungen zur Unterstützung der zweiten Version des Protokolls für den Befehl „send“ wurden getroffen.
- Im Dateisystem XFS wurde der Speicherverbrauch durch die Verwendung separater Slab-Caches für häufig verwendete Elemente und die Reduzierung bestimmter Datenstrukturen gesenkt.
- Im Dateisystem Ext4 wurden lediglich Fehlerbehebungen und eine genauere Berechnung der Parameter für die verzögerte Initialisierung der Inode-Tabelle festgestellt.
- Auf der Ebene der Blockgeräte wurden Optimierungen implementiert, die eine erhebliche Effizienzsteigerung bei der Zuweisung von Operationen zu CPU-Kernen ermöglichen.
- Erste Unterstützung für Festplatten mit mehreren unabhängigen Antrieben (multi-actuator) wurde hinzugefügt, die es ermöglichen, gleichzeitig auf mehrere Sektoren in verschiedenen Zonen der magnetischen Platte zuzugreifen.
- Ein neuer ioctl-Befehl CDROM_TIMED_MEDIA_CHANGE wurde hinzugefügt, um Ereignisse zum Wechsel von Medien in CD-Laufwerken zu erkennen.
- Im EROFS-Dateisystem (Enhanced Read-Only File System) wurde die Möglichkeit hinzugefügt, über mehrere Speichergeräte hinweg zu arbeiten. Verschiedene Geräte können in einem 32-Bit-Adressraum von Blöcken zusammengefasst werden. Zudem wurde die Unterstützung für die Kompression mittels LZMA-Algorithmus hinzugefügt.
- Im F2FS-Dateisystem wurden Montageoptionen hinzugefügt, um die Fragmentierung von Dateien bei der Ablage im Speicher zu steuern (zum Beispiel zur Fehlersuche bei der Optimierung der Arbeit mit fragmentierten Speichern).
- Im CEPH wurden standardmäßig die Operationen zum Erstellen und Löschen von Verzeichnissen im asynchronen Modus aktiviert (um das alte Verhalten wiederherzustellen, sollte beim Einhängen der Flag '-o wsync' verwendet werden). Zudem wurde die Erfassung von Metriken hinzugefügt, die die Kopieroperationen externer Objekte verfolgen.
- Im CIFS wurde die Montageoption tcpnodelay hinzugefügt, bei der für das Netzwerk-Socket der Modus tcp_sock_set_nodelay gesetzt wird, der das Warten auf die Auffüllung der Warteschlange im TCP-Stack deaktiviert. Zudem wurde die Unterstützung für verschachtelte DFS-Links (Distributed File System) beim Remounting hinzugefügt.
- Die Unterstützung für die Beendigung von Anfragen an Blockgeräte im Batch-Modus wurde hinzugefügt. Tests der Änderung zeigten eine Steigerung der Intensität der Ausführung von zufälligen Leseoperationen von Optane-Speichern von 6,1 auf 6,6 Millionen IOPS auf einem CPU-Kern.
- Speicher und Systemdienste
- Ein neuer Systemaufruf futex_waitv wurde hinzugefügt, der es ermöglicht, den Status mehrerer Futexe mit einem einzigen Systemaufruf zu überwachen. Diese Funktion ähnelt der in Windows verfügbaren Funktionalität WaitForMultipleObjects, deren Emulation über futex_waitv nützlich sein könnte, um die Leistung von Windows-Spielen zu steigern, die unter Wine oder Proton ausgeführt werden. Darüber hinaus kann das gleichzeitige Warten auf Futexe auch zur Optimierung der Leistung nativer Linux-Spielversionen verwendet werden.
- Die Konzept der Seitenfolianten (page folios) wurde umgesetzt, deren Verwendung in bestimmten Teilsystemen des Kerns die Speicherverwaltung bei typischen Lasten beschleunigen wird. Derzeit wurde das Hauptteilsystem zur Speicherverwaltung im Kern bereits auf Folianten umgestellt, ebenso wie die Implementierung des Seitencaches, und in Zukunft ist die Umstellung der Dateisysteme geplant. Zukünftig ist auch die Unterstützung für mehrseitige Folianten im Kern vorgesehen.
Folianten ähneln zusammengesetzten Seiten (compound pages), unterscheiden sich jedoch durch eine verbesserte Semantik und eine klarere Arbeitsorganisation. Für die Verwaltung des Systemspeichers wird der verfügbare RAM in Seiten unterteilt, deren Größe von der Architektur abhängt, jedoch in x86-Systemen in Kilobyte gemessen wird (gewöhnlich 4096 Byte). Moderne Systeme sind mit Dutzenden von Gigabyte RAM ausgestattet, was die Verwaltung des Speichers erschwert, da eine enorme Anzahl von Seiten bearbeitet werden muss. Um die Anzahl der Seiten zu reduzieren, wurde im Kern früher das Konzept der zusammengesetzten Seiten (compound pages) mit Strukturen, die mehr als eine physische Seite umfassen, umgesetzt. Doch die API zur Manipulation von zusammengesetzten Seiten hinterließ zu wünschen übrig und führte zu zusätzlichen Overheadkosten.
- Dem Task-Scheduler wurde ein Handler hinzugefügt, der die Clusterung des Caches in der CPU berücksichtigt. In bestimmten Prozessoren, wie dem Kunpeng 920 (ARM) und Intel Jacobsville (x86), kann eine bestimmte Anzahl von CPU-Kernen, in der Regel 4, den L3- oder L2-Cache gemeinsam nutzen. Die Berücksichtigung solcher Topologien kann die Effizienz der Aufgabenverteilung über die CPU-Kerne im Task-Scheduler erheblich steigern, da das Verschieben von Aufgaben innerhalb eines CPU-Clusters die Speicherzugriffsbandbreite erhöht und den Wettbewerb im Cache verringert.
- Die Unterstützung von AMX (Advanced Matrix Extensions)-Befehlen wurde hinzugefügt, die in den kommenden Serverprozessoren Intel Xeon Scalable unter dem Codenamen Sapphire Rapids implementiert werden. AMX bietet neue anpassbare Register TMM "TILE" und Anweisungen zur Manipulation von Daten in diesen Registern, einschließlich TMUL (Tile matrix MULtiply) zum Multiplizieren von Matrizen.
- Es wurden mehrere neue Funktionen implementiert, die auf dem im letzten Release hinzugefügten DAMON (Data Access MONitor)-Subsystem basieren. Dieses ermöglicht die Überwachung des Zugriffs auf Daten im Arbeitsspeicher in Bezug auf den ausgewählten Prozess, der im Benutzerspeicherraum läuft. Beispielsweise erlaubt das Subsystem die Analyse, auf welche spezifischen Speicherbereiche der Prozess während seiner gesamten Laufzeit zugegriffen hat und welche Bereiche ungenutzt blieben.
- DAMON_RECLAIM zur Identifizierung und Verdrängung von Speicherbereichen, auf die nicht zugegriffen wurde. Der Mechanismus kann verwendet werden, um proaktiv Seiten im Arbeitsspeicher zu verdrängen, wenn sich ein Mangel an freiem Speicher näherungsweise anbahnt.
- DAMOS (Data Access Monitoring-based Operation Schemes) zur Anwendung der festgelegten Funktion `madvise()`, wie z.B. zur Freigabe zusätzlicher freier Speicherbereiche, auf bestimmte Speicherbereiche eines Prozesses, für die eine gewisse Zugriffsfrequenz auf den Speicher erfasst wird. Die Konfiguration der DAMOS-Parameter erfolgt über `debugfs`.
- Die Möglichkeit, den physischen Adressraum des Speichers zu überwachen (früher konnten nur virtuelle Adressen verfolgt werden).
- Die Implementierung des Kompressionsalgorithmus `zstd` wurde auf Version 1.4.10 aktualisiert, wodurch die Leistung verschiedener Kernsubsysteme, in denen die Kompression angewendet wird, erheblich gesteigert werden konnte (z. B. wurde die Entpackungszeit des Kernel-Images um 35 % beschleunigt, die Leistung beim Entpacken komprimierter Daten in `Btrfs` und `SquashFS` stieg um 15 %, und in `ZRAM` um 30 %). Ursprünglich wurde im Kern eine separate Implementierung von `zstd` verwendet, die auf Version 1.3.1 basierte, die vor über drei Jahren veröffentlicht wurde und viele wichtige Optimierungen nicht enthielt. Neben dem Wechsel auf die aktuelle Version vereinfacht der hinzugefügte Patch auch die Synchronisation mit dem Upstream-Zweig von `zstd`, sodass Code zur direkten Einbindung in den Kernel aus dem Hauptrepository von `zstd` generiert werden kann. In Zukunft ist geplant, den `zstd`-Code im Kernel mit Erscheinen neuer Versionen der `zstd`-Bibliothek zu aktualisieren.
- Es wurden umfangreiche Verbesserungen im eBPF-Subsystem vorgenommen. Es wurde die Möglichkeit hinzugefügt, Funktionen von Kernelmodulen aus BPF-Programmen aufzurufen. Die Funktion bpf_trace_vprintk() wurde implementiert, die im Gegensatz zu bpf_trace_printk() die Ausgabe von mehr als drei Argumenten auf einmal ermöglicht. Eine neue Datenspeicherstruktur (BPF map) namens Bloom-Filter wurde hinzugefügt, die die Verwendung einer gleichnamigen probabilistischen Datenstruktur zur Feststellung der Existenz eines Elements in einer Menge ermöglicht. Ein neuer Attribut BTF_KIND_TAG wurde hinzugefügt, der in BPF-Programmen zur Bindung von Tags an Funktionsparameter verwendet werden kann, um beispielsweise das Auffinden von Fehlern in Benutzerprogrammen zu erleichtern. In libbpf wurde die Erstellung eigener Abschnitte .rodata.* / .data.* erlaubt, die Unterstützung für Tracing-Events durch uprobe und kprobe wurde implementiert, sowie ein API zum Kopieren aller BTF-Typen von einem Objekt zu einem anderen hinzugefügt. Die Unterstützung von AF_XDP wurde aus libbpf in die separate Bibliothek libxdp ausgelagert. Für die MIPS-Architektur wurde ein JIT-Compiler für die BPF-VM implementiert.
- Für die ARM64-Architektur wurde die Unterstützung für die ARMv8.6-Erweiterungen für Timer implementiert, die insbesondere die Selbstsynchronisierung der Darstellung von Systemregistern ohne Verwendung von ISB-Anweisungen ermöglichen.
- Für die PA-RISC-Architektur wurde die Möglichkeit implementiert, den KFENCE-Mechanismus zur Erkennung von Speicherfehlern zu nutzen, und es wurde Unterstützung für den KCSAN-Racing-Zustandsdetektor hinzugefügt.
- Es wurde die Möglichkeit geschaffen, die Zugriffsrechte auf tracefs auf Ebene einzelner Benutzer und Gruppen zu konfigurieren. Beispielsweise kann nun der Zugriff auf Tracing-Tools nur für Mitglieder einer bestimmten Gruppe erlaubt werden.
- Virtualisierung und Sicherheit
- In den Subsystemen io_uring und device-mapper wurde die Unterstützung für die Generierung von Auditevents implementiert. In io_uring wurde die Möglichkeit zur Zugriffskontrolle über LSM-Module hinzugefügt. Außerdem wurde die Möglichkeit zur Auditierung des Systemaufrufs openat2() bereitgestellt.
- Der Kernelcode wurde vollständig von nicht unterbrechbaren Ausdrücken case in switch (ohne return oder break nach jedem case-Block) befreit. Bei der Kernelkompilierung kann nun der Modus '-Wimplicit-fallthrough' verwendet werden.
- Änderungen zur Verschärfung von Grenzkontrollen bei der Ausführung der Funktion memcpy() wurden eingeführt.
- Im Interface für asynchrone Ein- / Ausgabeverarbeitung io_uring wurde die Möglichkeit implementiert, Sicherheitsrichtlinien, die von den Modulen SELinux und Smack definiert werden, auf Ein- / Ausgabeverfahren anzuwenden.
- Im IMA (Integrity Measurement Architecture)-Subsystem, das es externen Diensten ermöglicht, den Zustand der Kernsubsysteme zu überprüfen, um deren Authentizität sicherzustellen, wurde die Möglichkeit implementiert, Regeln basierend auf der Gruppen-ID (GID), zu der die Datei gehört oder in die der Benutzer, der auf die Datei zugreift, gehört, anzuwenden.
- Einige erweiterte Schutzmechanismen für Streams seccomp(), die als überflüssig erachtet wurden und die Sicherheit nicht signifikant erhöhen, sondern sich negativ auf die Leistung auswirken, sind standardmäßig deaktiviert. Der Einsatz des Retpoline-Schutzes wurde überarbeitet.
- Die Implementierung des cryptoloop-Mechanismus wurde entfernt, der 2004 durch dm-crypt ersetzt wurde und bei Bedarf dieselben Algorithmen unterstützt.
- Standardmäßig ist der unprivilegierte Zugriff auf das eBPF-Subsystem verboten. Diese Änderung wurde vorgenommen, um die Verwendung von BPF-Programmen zur Umgehung von Schutzmaßnahmen gegen Seitenkanalangriffe zu verhindern. Bei Bedarf kann der Administrator den unprivilegierten Benutzern den Zugriff auf eBPF wieder ermöglichen.
- Im Hypervisor ACRN, der für die Ausführung von Echtzeitanwendungen und für den Einsatz in kritischen Systemen konzipiert ist, wurde die Unterstützung für das Erstellen/Löschen von virtuellen Geräten und das Durchreichen von MMIO-Geräten hinzugefügt.
- In die Krypto-Engine wurde die Unterstützung für KPP-Definitionen (Key-agreement Protocol Primitives) hinzugefügt, die die Logik der Treiberentwicklung für Kryptosysteme vereinfachen.
- Für den Hypervisor Hyper-V wurde die Unterstützung für den Isolationsmodus implementiert virtuelle Maschinen, der die Verschlüsselung des Speicherinhalts beinhaltet.
- Im Hypervisor KVM wurde die Unterstützung für die RISC-V-Architektur hinzugefügt. Die Möglichkeit für die Migration virtueller Maschinen innerhalb einer Hostumgebung, die mit AMD SEV- und SEV-ES-Erweiterungen betrieben werden, wurde umgesetzt. Ein API für die Live-Migration von Gast-Systemen, die mit AMD SEV (Secure Encrypted Virtualization) verschlüsselt sind, wurde hinzugefügt.
- Für die PowerPC-Architektur ist standardmäßig der STRICT_KERNEL_RWX-Modus aktiviert, der die gleichzeitige Verwendung von speicherseiten für Schreib- und Ausführungszugriffe blockiert.
- Die Unterstützung für Hotplugging von Speicher (Memory hotplug) wurde auf 32-Bit-x86-Systemen eingestellt, da sie über ein Jahr lang nicht funktionierte.
- Die Bibliothek liblockdep wurde aus dem Kernel entfernt und wird nun separat vom Kernel gepflegt.
- Netzwerksubsystem
- Für Sockets wurde die neue Option SO_RESERVE_MEM implementiert, mit der ein bestimmter Speicherbereich für den Socket reserviert werden kann, der immer für den Socket verfügbar bleibt und nicht entnommen wird. Die Verwendung dieser Option ermöglicht eine Leistungssteigerung durch die Reduzierung von Speicherzuweisungs- und -freigabeoperationen im Netzwerk-Stack, insbesondere unter Bedingungen von Speichermangel im System.
- Die Unterstützung für das Protokoll des automatischen Tunnelns von Multicast-Traffic (Automatic Multicast Tunneling, RFC 7450) wurde hinzugefügt, das es ermöglicht, Multicast-Traffic aus Netzwerken mit Unterstützung für Multicast an Empfänger in Netzwerken ohne Multicast zu liefern. Das Protokoll funktioniert durch Kapselung in UDP-Pakete.
- Die Kapselung von IOAM-Daten (In-situ Operations, Administration, and Maintenance) in Transitpaketen wurde verbessert.
- Der ethtool netlink API wurde die Möglichkeit hinzugefügt, die Energieverbrauchsmodi der Transceiver zu steuern.
- Im netfilter-Subsystem wurde die Möglichkeit zur Klassifizierung von Paketen auf der Egress-Ebene implementiert, d.h. in der Phase, in der der Treiber ein Paket vom Netzwerk-Stack des Kernels erhält. In nftables wurde die Unterstützung entsprechender Filter in der Version 1.0.1 eingeführt. Im netfilter wurde die Möglichkeit hinzugefügt, interne Header und Daten für UDP und TCP (inner header / payload), die nach dem Transportheader (transport header) folgen, abzugleichen und zu ändern.
- Neue sysctl-Parameter arp_evict_nocarrier und ndisc_evict_nocarrier wurden hinzugefügt, bei deren Einstellung der ARP-Cache und die ndisc-Tabelle (Neighbor Discovery) im Falle eines Verbindungsabbruchs (NOCARRIER) gelöscht werden.
- Im Netzwerkmanagementmechanismus fq_codel (Controlled Delay) wurden die Modi Low Latency, Low Loss und Scalable Throughput (L4S) hinzugefügt.
- Ausrüstung
- Im Treiber amdgpu wurde die Anfangsunterstützung für die Spezifikation DP 2.0 (DisplayPort 2.0) und die Möglichkeit des Tunnelns von DisplayPort über USB4 implementiert. Für APU Cyan Skillfish (ausgestattet mit GPU Navi 1x) wurde die Unterstützung von Display-Controllern hinzugefügt. Die Unterstützung für APU Yellow Carp (mobile Prozessoren Ryzen 6000 „Rembrandt“) wurde erweitert.
- Im Treiber i915 wurde die Unterstützung für Intel Alderlake S Chips stabilisiert und die Unterstützung der Intel PXP-Technologie (Protected Xe Path) implementiert, die die Durchführung eines hardwaregeschützten Grafik-Sitzung auf Systemen mit Intel Xe-Chips ermöglicht.
- Im Treiber nouveau wurde an der Fehlerbehebung gearbeitet und der Stil des Codes verbessert.
- Die Unterstützung für x86-kompatible CPUs Vortex (Vortex86MX) wurde hinzugefügt. Linux lief zwar bereits auf solchen Prozessoren, aber eine explizite Identifikation der genannten CPUs war erforderlich, um den Schutz vor Spectre-/Meltdown-Angriffen zu deaktivieren, die für die angegebenen Chips nicht anwendbar sind.
- Die anfängliche Unterstützung für x86-Plattformen Surface Pro 8 und Surface Laptop Studio wurde hinzugefügt.
- Ein Treiber zur Unterstützung von Soundchips, die in APU AMD Yellow Carp, Van Gogh verwendet werden, wurde hinzugefügt. Auch die Unterstützung für Audiosysteme und Codecs wie Cirrus CS35L41, Maxim MAX98520/MAX98360A, Mediatek MT8195, Nuvoton NAU8821, NVIDIA Tegra210, NXP i.MX8ULP, Qualcomm AudioReach, Realtek ALC5682I-VS, RT5682S, RT9120, Rockchip RV1126 und RK3568 wurde hinzugefügt.
- Der Treiber ishtp_eclite wurde hinzugefügt, um auf die integrierten Intel PSE (Programmable Service Engine) Controller über das ISHTP (Integrated Sensor Hub Transport Protocol) zuzugreifen, beispielsweise um Informationen über den Akku, die Temperatur und Daten im Zusammenhang mit UCSI (USB Type-C Connector System Software Interface) zu erhalten.
- Ein Treiber für Nintendo Switch-Controller wurde hinzugefügt, der die Geräte Switch Pro und Joy-Cons unterstützt. Die Unterstützung für Wacom Intuos BT Tablets (CTL-4100WL/CTL-6100WL) und die Apple 2021 Magic Keyboard wurde hinzugefügt. Die Unterstützung für Sony PlayStation DualSense-Controller wurde verbessert. Unterstützung für die seitlichen Tasten der Xiaomi Mi-Maus wurde hinzugefügt.
- Der Treiber RT89 mit Unterstützung für drahtlose Chips von Realtek 802.11ax wurde hinzugefügt, ebenso wie Treiber für Ethernet-Adapter Asix AX88796C-SPI und Switches von Realtek RTL8365MB-VC.
- Für die Apple M1 Chips wurden Treiber für PCI und PASemi i2c hinzugefügt.
- Die Unterstützung für ARM SoCs, Geräte und Plattformen wie Raspberry Pi Compute Module 4, Fairphone 4, Snapdragon 690, LG G Watch R, Sony Xperia 10 III, Samsung Galaxy S4 Mini Value Edition, Xiaomi MSM8996 (Mi 5, Mi Note 2, Mi 5s, Mi Mix, Mi 5s Plus und Xiaomi Mi 5), Sony Yoshino (Sony Xperia XZ1 und Sony Xperia XZ Premium), F(x)tec Pro1 QX1000, Microchip LAN966, CalAmp LMU5000, Exegin Q5xR5, sama7g5, Samsung ExynosAutov9, Rockchip RK3566, RK3399 ROCK Pi 4A+, RK3399 ROCK Pi 4B+, Firefly ROC-RK3328-PC, Firefly ROC-RK3399-PC-PLUS, ASUS Chromebook Tablet CT100, Pine64 Quartz64-A, Netgear GS110EMX, Globalscale MOCHAbin 7040, NXP S32G2, Renesas R8A779M*, Xilinx Kria, Radxa Zero, JetHub D1/H1 und Netronix E70K02 wurde hinzugefügt.
Quelle: opennet.ru
