Miguel Ojeda, der Autor des Projekts Rust-for-Linux, hat den Kernel-Entwicklern die Veröffentlichung der v6-Komponenten zur Entwicklung von Gerätetreibern in Rust zur Überlegung vorgeschlagen. Dies ist die siebte Version der Patches unter Berücksichtigung der ersten, die ohne Versionsnummer veröffentlicht wurde. Die Unterstützung für Rust wird als experimentell betrachtet, ist jedoch bereits in den Branch linux-next integriert und gut genug entwickelt, um mit der Erstellung von Abstraktionsschichten über die Kernel-Subsysteme hinaus und der Erstellung von Treibern und Modulen zu beginnen. Die Entwicklung wird von Google und der ISRG (Internet Security Research Group) finanziert, die auch die Initiative Let’s Encrypt ins Leben gerufen hat und die Förderung von HTTPS sowie die Entwicklung von Technologien zur Verbesserung der Internet-Sicherheit unterstützt.
In der neuen Version:
- Die Toolkit und die alloc-Bibliothek, die von möglichen "panic"-Zuständen bei Fehlern befreit sind, wurden auf Rust-Version 1.60 aktualisiert, in der die Unterstützung für den Modus "maybe_uninit_extra" stabilisiert wurde, der in den Patches für den Kernel verwendet wird.
- Es wurde die Möglichkeit hinzugefügt, Tests aus der Dokumentation (Tests, die gleichzeitig als Beispiele in der Dokumentation dienen) durch die Umwandlung von zur Laufzeit an API des Kernels gebundenen Tests in KUnit-Tests, die während des Kernel-Boots ausgeführt werden, durchzuführen.
- Die Anforderungen wurden angenommen, wonach Tests keine Warnmeldungen des Linters Clippy auslösen dürfen, ebenso wie der Code für den Kernel in Rust.
- Eine erste Implementierung des Moduls „net“ mit Netzwerkfunktionen wurde vorgeschlagen. Rust-Code hat Zugang zu Netzwerkstrukturen des Kernels wie Namespace (basierend auf der Kernel-Struktur „struct net“), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) und deren Entsprechungen für IPv6.
- Die erste Unterstützung für asynchrone Programmiermethoden (async), umgesetzt in Form des Moduls kasync, wurde realisiert. Zum Beispiel kann man asynchronen Code zur Manipulation von TCP-Sockets erstellen: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
- Das Modul net::filter zur Manipulation von Netzwerkpaketfiltern wurde hinzugefügt. Ein Beispiel rust_netfilter.rs mit einer Implementierung eines Filters in Rust wurde hinzugefügt.
- Eine Implementierung eines einfachen Mutex smutex::Mutex wurde hinzugefügt, der keine Bindung (Pinning) erfordert.
- Es wurde ein NoWaitLock hinzugefügt, der niemals zu einem Warten auf die Freigabe führt. Stattdessen gibt es bei Benutzung durch einen anderen Thread eine Fehlermeldung beim Versuch, das Lock zu erhalten, anstatt den Aufrufenden anzuhalten.
- Ein RawSpinLock wurde hinzugefügt, der mit raw_spinlock_t im Kernel identifiziert wird und für Abschnitte verwendet wird, die nicht im Zustand der Wartung sein können.
- Der Typ ARef für Referenzen auf Objekte wurde hinzugefügt, bei denen der Mechanismus der Referenzzählung (always-refcounted) angewendet wird.
- Im Backend rustc_codegen_gcc, das die Bibliothek libgccjit aus dem GCC-Projekt als Code-Generator in rustc nutzt, um Unterstützung für die in GCC verfügbaren Architekturen und Optimierungen in rustc zu gewährleisten, wurde die Möglichkeit des Bootstrappings des Compilers rustc implementiert. Unter Bootstrapping versteht man die Möglichkeit, in rustc den Code-Generator auf Basis von GCC zu verwenden, um den Compiler rustc selbst zu erstellen. Darüber hinaus wurden in der aktuellen Version GCC 12.1 Korrekturen in libgccjit eingeführt, die für das ordnungsgemäße Funktionieren von rustc_codegen_gcc erforderlich sind. Es wird daran gearbeitet, die Installation von rustc_codegen_gcc über das Tool rustup zu ermöglichen.
- Es wird Fortschritt in der Entwicklung des GCC-Frontends gccrs verzeichnet, das einen Compiler für die Programmiersprache Rust auf Basis von GCC implementiert. Derzeit arbeiten zwei Entwickler im Vollzeitzustand an gccrs.
Wir möchten daran erinnern, dass die vorgeschlagenen Änderungen die Möglichkeit bieten, Rust als zweite Sprache zur Entwicklung von Treibern und Modulen im Kernel zu verwenden. Die Rust-Unterstützung wird als Option präsentiert, die standardmäßig nicht aktiviert ist und nicht dazu führt, dass Rust zu den obligatorischen Build-Abhängigkeiten im Kernel hinzugefügt wird. Der Einsatz von Rust zur Treiberentwicklung ermöglicht es, mit minimalem Aufwand sichere und qualitativ hochwertige Treiber zu erstellen, die von Problemen wie dem Zugriff auf Speicherbereiche nach deren Freigabe, der Dereferenzierung von Nullzeigern und Pufferüberläufen befreit sind.
Die sichere Arbeit mit Speicher wird in Rust während der Kompilierung durch Überprüfung von Referenzen, Verfolgung des Eigentums an Objekten und Berücksichtigung der Lebensdauer von Objekten (Sichtbarkeitsbereich) sowie durch die Beurteilung der Korrektheit des Zugriffs auf den Speicher zur Laufzeit des Codes gewährleistet. Rust bietet auch Mittel zum Schutz vor ganzzahligen Überläufen, erfordert die zwingende Initialisierung von Variablen vor deren Verwendung, behandelt Fehler in der Standardbibliothek besser, wendet das Konzept der Immutabilität (unveränderlich) auf Referenzen und Variablen standardmäßig an und bietet eine starke statische Typisierung zur Minimierung logischer Fehler.
Quelle: opennet.ru
