Miguel Ojeda, der Autor des Projekts Rust-for-Linux, hat den Entwicklern des Linux-Kernels die Veröffentlichung der Version 6 von Komponenten vorgeschlagen, die zur Entwicklung von GerĂ€tetreibern in Rust dienen. Dies ist die siebte Ausgabe der Patches, die auf der ersten Version basiert, die ohne Versionsnummer veröffentlicht wurde. Die UnterstĂŒtzung von Rust wird als experimentell betrachtet, ist aber bereits in den linux-next Branch integriert und ausreichend entwickelt, um mit der Schaffung von Abstraktionsschichten ĂŒber den Kernel-Subsystemen sowie der Erstellung von Treibern und Modulen zu beginnen. Die Entwicklung wird von Google und der ISRG (Internet Security Research Group) finanziert, die das Projekt Letâs Encrypt ins Leben gerufen hat und die Förderung von HTTPS und der Entwicklung von Technologien zur Verbesserung der Internetsicherheit unterstĂŒtzt.
In der neuen Version:
- Das Toolkit und die alloc-Bibliothek, die von möglichen "panic"-ZustĂ€nden bei Fehlern befreit sind, wurden auf die Version Rust 1.60 aktualisiert, in der die UnterstĂŒtzung des Modus "maybe_uninit_extra" stabilisiert wurde, der in den Patches fĂŒr den Kernel verwendet wird.
- Die Möglichkeit, Tests aus der Dokumentation auszufĂŒhren (Tests, die gleichzeitig als Beispiele in der Dokumentation verwendet werden), wurde hinzugefĂŒgt, indem wĂ€hrend der Kompilierung von API-gebundenen Tests in KUnit-Tests umgewandelt wird, die beim Booten des Kernels ausgefĂŒhrt werden.
- Es wurden Anforderungen angenommen, laut denen Tests keine Warnungen des Linters Clippy erzeugen dĂŒrfen, ebenso wie der Code fĂŒr den Kernel in Rust.
- Eine erste Implementierung des Moduls ânetâ mit Netzwerkfunktionen wurde vorgeschlagen. Der Code in Rust hat Zugriff auf Netzwerkstrukturen des Kernels wie âNamespaceâ (basierend auf der Kernelstruktur âstruct netâ), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) und deren Ăquivalente fĂŒr IPv6.
- Die erste UnterstĂŒtzung fĂŒr asynchrones Programmieren (async) wurde in Form des Moduls kasync implementiert. Beispielsweise kann asynchroner Code zum Umgang mit TCP-Sockets erstellt werden: 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?; } }
- Ein net::filter-Modul wurde hinzugefĂŒgt, um Netzwerkpaketfilter zu manipulieren. Ein Beispiel rust_netfilter.rs mit der Implementierung eines Filters in Rust wurde hinzugefĂŒgt.
- Die Implementierung eines einfachen Mutex smutex::Mutex, der keine Bindung (Pinning) erfordert, wurde hinzugefĂŒgt.
- Eine NoWaitLock-Sperre wurde hinzugefĂŒgt, die niemals zu einer Wartezeit fĂŒhrt. Im Falle einer Sperrung durch einen anderen Thread wird stattdessen ein Fehler beim Versuch, die Sperre zu erwerben, ausgegeben, anstatt den Aufrufer zu stoppen.
- Ein RawSpinLock wurde hinzugefĂŒgt, das mit raw_spinlock_t im Kernel identifiziert ist und fĂŒr Abschnitte verwendet wird, die nicht im Wartezustand sein dĂŒrfen.
- Ein Typ ARef fĂŒr Referenzen auf Objekte, die ein ReferenzzĂ€hlmechanismus (always-refcounted) verwenden, wurde hinzugefĂŒgt.
- Im Backend rustc_codegen_gcc, das die Nutzung der libgccjit-Bibliothek aus dem GCC-Projekt als Code-Generator in rustc ermöglicht, wurde die Möglichkeit der Compiler-Rollierung (Bootstrapping) von rustc implementiert. Hierbei wird die FĂ€higkeit verstanden, den Code-Generator auf Basis von GCC in rustc zu verwenden, um den Compiler rustc selbst zu erstellen. DarĂŒber hinaus wurden im aktuellen GCC 12.1 Korrekturen in libgccjit aufgenommen, die fĂŒr die korrekte Funktion von rustc_codegen_gcc erforderlich sind. Es wird an der Bereitstellung der Möglichkeit gearbeitet, rustc_codegen_gcc ĂŒber das Tool rustup zu installieren.
- Der Fortschritt in der Entwicklung des GCC-Frontends gccrs wird festgestellt, das einen Rust-Compiler auf Basis von GCC implementiert. Derzeit arbeiten zwei Entwickler im Vollzeitmodus an gccrs.
Wir erinnern daran, dass die vorgeschlagenen Ănderungen die Möglichkeit bieten, Rust als zweite Sprache fĂŒr die Entwicklung von Treibern und Kernelmodulen zu verwenden. Die UnterstĂŒtzung von Rust wird als Option vorgestellt, die nicht standardmĂ€Ăig aktiviert ist und nicht dazu fĂŒhrt, dass Rust zu den obligatorischen Build-AbhĂ€ngigkeiten des Kernels gehört. Die Verwendung von Rust zur Treiberentwicklung ermöglicht es, mit minimalem Aufwand sichere und qualitativ hochwertige Treiber zu erstellen, die von Problemen wie dem Zugriff auf freigegebenen Speicher, Dereferenzierung von Nullzeigern und BufferĂŒberlĂ€ufen befreit sind.
Die sichere Verwaltung von Speicher in Rust erfolgt wĂ€hrend der Kompilierung durch ĂberprĂŒfung von Referenzen, das Verfolgen des Eigentums an Objekten und das Management der Lebensdauer von Objekten (Sichtbarkeiten). AuĂerdem bewertet Rust die Korrektheit des Zugriffs auf den Speicher zur Laufzeit. Rust bietet auch Mechanismen zum Schutz vor ĂberlĂ€ufen bei Ganzzahlen, verlangt die obligatorische Initialisierung von Variablen vor ihrer Verwendung, behandelt Fehler in der Standardbibliothek besser und wendet das Konzept der UnverĂ€nderlichkeit (immutable) fĂŒr Referenzen und Variablen standardmĂ€Ăig an. Zudem bietet es eine starke statische Typisierung zur Minimierung logischer Fehler.
Quelle: opennet.ru
