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

Miguel Ojeda, Autor des Rust-for-Linux-Projekts, schlug die Veröffentlichung von v6-Komponenten zur Entwicklung von Gerätetreibern in der Rust-Sprache zur Prüfung durch Linux-Kernel-Entwickler vor. Dies ist die siebte Ausgabe der Patches, unter Berücksichtigung der ersten Version, die ohne Versionsnummer veröffentlicht wurde. Die Rust-Unterstützung gilt als experimentell, ist jedoch bereits im Linux-Next-Zweig enthalten und ausreichend entwickelt, um mit der Erstellung von Abstraktionsschichten über Kernel-Subsystemen sowie dem Schreiben von Treibern und Modulen zu beginnen. 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.

In der neuen Version:

  • Das Toolkit und eine Variante der Alloc-Bibliothek, die von der möglichen Generierung eines „Panik“-Zustands bei Fehlern befreit ist, wurden auf die Veröffentlichung von Rust 1.60 aktualisiert, was die Unterstützung für den in Kernel-Patches verwendeten „maybe_uninit_extra“-Modus stabilisiert.
  • Es wurde die Möglichkeit hinzugefügt, Tests aus der Dokumentation auszuführen (Tests, die auch als Beispiele in der Dokumentation verwendet werden), indem an die Kernel-API gebundene Tests zur Kompilierungszeit in KUnit-Tests konvertiert werden, die während des Kernel-Ladens ausgeführt werden.
  • Es wurden Anforderungen eingeführt, dass Tests nicht zu einer Clippy-Linter-Warnung führen dürfen, genau wie Rust-Kernel-Code.
  • Es wird eine erste Implementierung des Moduls „net“ mit Netzwerkfunktionen vorgeschlagen. Rust-Code hat Zugriff auf Kernel-Netzwerkstrukturen wie Namespace (basierend auf der struct net-Kernelstruktur), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) und deren IPv6-Äquivalente .
  • Es gibt zunächst Unterstützung für asynchrone Programmiertechniken (async), implementiert in Form des kasync-Moduls. Sie können beispielsweise asynchronen Code schreiben, um TCP-Sockets zu manipulieren: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; Schleife { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
  • net::filter-Modul zum Bearbeiten von Netzwerkpaketfiltern hinzugefügt. Beispiel rust_netfilter.rs mit einer Filterimplementierung in der Rust-Sprache hinzugefügt.
  • Implementierung eines einfachen Mutex smutex::Mutex hinzugefügt, der kein Pinning erfordert.
  • NoWaitLock wurde hinzugefügt, das niemals auf eine Sperre wartet und, wenn es von einem anderen Thread belegt ist, beim Versuch, die Sperre zu erhalten, einen Fehler meldet, anstatt den Aufrufer zu stoppen.
  • RawSpinLock hinzugefügt, identifiziert durch raw_spinlock_t im Kernel, um es auf Abschnitte anzuwenden, die nicht inaktiv sein können.
  • ARef-Typ für Referenzen auf ein Objekt hinzugefügt, auf das der Referenzzählmechanismus angewendet wird (always-refcounted).
  • Das rustc_codegen_gcc-Backend, das es Ihnen ermöglicht, die libgccjit-Bibliothek aus dem GCC-Projekt als Codegenerator in rustc zu verwenden, um rustc Unterstützung für in GCC verfügbare Architekturen und Optimierungen bereitzustellen, hat die Möglichkeit zum Bootstrapping des rustc-Compilers implementiert. Compiler-Promotion bedeutet die Möglichkeit, einen GCC-basierten Codegenerator in rustc zu verwenden, um den rustc-Compiler selbst zu erstellen. Darüber hinaus enthält die aktuelle Version von GCC 12.1 Korrekturen für libgccjit, die für die ordnungsgemäße Funktion von rustc_codegen_gcc erforderlich sind. Es laufen Vorbereitungen, um die Möglichkeit zur Installation von rustc_codegen_gcc mithilfe des Dienstprogramms rustup bereitzustellen.
  • Der Fortschritt bei der Entwicklung des GCC-Frontends gccrs mit der Implementierung des auf GCC basierenden Rust-Sprachcompilers wird zur Kenntnis genommen. Derzeit arbeiten zwei Vollzeitentwickler an gccrs.

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.

Source: opennet.ru

Kommentar hinzufügen