Die dritte Ausgabe von Patches für den Linux-Kernel mit Unterstützung für die Rust-Sprache

Miguel Ojeda, Autor des Rust-for-Linux-Projekts, hat eine dritte Komponentenoption für die Entwicklung von Gerätetreibern in der Rust-Sprache vorgeschlagen, die Linux-Kernel-Entwickler in Betracht ziehen sollten. Die Rust-Unterstützung gilt als experimentell, es wurde jedoch bereits eine Aufnahme in den Linux-Next-Zweig vereinbart. Die Entwicklung wird von Google und der ISRG (Internet Security Research Group) finanziert, die Gründerin des Let's Encrypt-Projekts ist und HTTPS und die Entwicklung von Technologien zur Verbesserung der Internetsicherheit fördert.

Denken Sie daran, dass die vorgeschlagenen Änderungen es ermöglichen, Rust als zweite Sprache für die Entwicklung von Treibern und Kernelmodulen zu verwenden. Die Rust-Unterstützung wird als Option dargestellt, die standardmäßig nicht aktiviert ist und nicht dazu führt, dass Rust als erforderliche Build-Abhängigkeit für den Kernel einbezogen wird. Durch die Verwendung von Rust für die Treiberentwicklung können Sie mit minimalem Aufwand sicherere und bessere Treiber erstellen, ohne Probleme wie Speicherzugriff nach der Freigabe, Nullzeiger-Dereferenzierungen und Pufferüberläufe.

Die speichersichere Handhabung wird in Rust zur Kompilierungszeit durch Referenzprüfung, Verfolgung des Objektbesitzes und der Objektlebensdauer (Umfang) sowie durch die Bewertung der Korrektheit des Speicherzugriffs während der Codeausführung gewährleistet. Rust bietet außerdem Schutz vor Ganzzahlüberläufen, erfordert eine obligatorische Initialisierung von Variablenwerten vor der Verwendung, behandelt Fehler in der Standardbibliothek besser, wendet standardmäßig das Konzept unveränderlicher Referenzen und Variablen an und bietet starke statische Typisierung, um logische Fehler zu minimieren.

Die neue Version der Patches eliminiert weiterhin die Kommentare, die während der Diskussion der ersten und zweiten Version der Patches gemacht wurden. Die auffälligsten Änderungen:

  • Es wurde auf die Verwendung der stabilen Version von Rust 1.57 als Referenz-Compiler umgestellt und ein Link zur stabilisierten Ausgabe der Sprache Rust 2021 bereitgestellt. Zuvor waren Patches an den Beta-Zweig von Rust gebunden und verwendeten einige Sprachfunktionen, die wurden als instabil eingestuft. Der Übergang zur Rust 2021-Spezifikation ermöglichte es uns, mit der Arbeit zu beginnen, um die Verwendung solcher instabiler Funktionen in Patches wie const_fn_transmute, const_panic, const_unavailable_unchecked und core_panic und try_reserve zu vermeiden.
  • Die Entwicklung der Alloc-Version der Rust-Bibliothek, die in den Patches enthalten ist, wurde fortgesetzt und geändert, um die Speicherzuweisungsfunktionen von der möglichen Erzeugung des „Panik“-Zustands zu befreien, wenn Fehler auftreten, z. B. nicht genügend Speicher. Die neue Version implementiert die Optionen „no_rc“ und „no_sync“, um Funktionen zu deaktivieren, die im Kernel-Rust-Code nicht verwendet werden, wodurch die Bibliothek modularer wird. Die Arbeit mit den Haupt-Alloc-Entwicklern wird fortgesetzt, um die für den Kernel erforderlichen Änderungen in die Hauptbibliothek zu übertragen. Die Option „no_fp_fmt_parse“, die erforderlich ist, damit die Bibliothek auf Kernel-Ebene funktioniert, wurde in die Rust-Basisbibliothek (Kern) verschoben.
  • Der Code wurde bereinigt, um mögliche Compiler-Warnungen beim Erstellen des Kernels im CONFIG_WERROR-Modus zu beseitigen. Beim Erstellen von Code in Rust sind zusätzliche Compiler-Diagnosemodi und Clippy-Linter-Warnungen aktiviert.
  • Abstraktionen werden zur Verwendung im Rust-Code für Seqlocks (Sequenzsperren), Callback-Aufrufe für Energieverwaltung, I/O-Speicher (readX/writeX), Interrupt- und Thread-Handler, GPIO, Zugriff auf Geräte, Treiber und Anmeldeinformationen vorgeschlagen.
  • Die Tools zur Treiberentwicklung wurden um verschiebbare Mutexe, Bit-Iteratoren, vereinfachte Zeigerbindungen, verbesserte Fehlerdiagnose und eine datenbusunabhängige Infrastruktur erweitert.
  • Verbesserte Arbeit mit Links mithilfe eines vereinfachten Ref-Typs, basierend auf dem refcount_t-Backend, das die gleichnamige Kernel-API zum Zählen von Referenzen verwendet. Die Unterstützung für die in der Standard-Alloc-Bibliothek bereitgestellten Arc- und Rc-Typen wurde entfernt und ist in Code, der auf Kernel-Ebene ausgeführt wird, nicht verfügbar (für die Bibliothek selbst wurden Optionen vorbereitet, die diese Typen deaktivieren).
  • Die Patches enthalten eine in Rust neu geschriebene Version des PL061 GPIO-Treibers. Eine Besonderheit des Treibers besteht darin, dass seine Implementierung den vorhandenen GPIO-Treiber in der C-Sprache nahezu zeilenweise wiederholt. Für Entwickler, die sich mit der Erstellung von Treibern in Rust vertraut machen möchten, wurde ein zeilenweiser Vergleich vorbereitet, der es ihnen ermöglicht zu verstehen, in welche Konstrukte in Rust der C-Code konvertiert wird.
  • Die Hauptcodebasis von Rust hat rustc_codegen_gcc übernommen, ein Rustc-Backend für GCC, das die AOT-Kompilierung (Ahead-of-Time) mithilfe der libgccjit-Bibliothek implementiert. Bei ordnungsgemäßer Entwicklung des Backends können Sie den im Kernel enthaltenen Rust-Code mithilfe von GCC erfassen.
  • Neben ARM, Google und Microsoft hat auch Red Hat Interesse an der Verwendung der Rust-Sprache im Linux-Kernel bekundet. Erinnern wir uns daran, dass Google das Rust-für-Linux-Projekt direkt unterstützt, eine neue Implementierung des Binder-Interprozess-Kommunikationsmechanismus in Rust entwickelt und die Möglichkeit erwägt, verschiedene Treiber in Rust zu überarbeiten. Microsoft hat mit der Implementierung von Treibern für Hyper-V in Rust begonnen. ARM arbeitet daran, die Rust-Unterstützung für ARM-basierte Systeme zu verbessern. IBM hat Rust-Unterstützung im Kernel für PowerPC-Systeme implementiert.

Source: opennet.ru

Kommentar hinzufügen