Miguel Ojeda, der Autor des Projekts Rust-for-Linux, hat den Entwicklern des Linux-Kernels die vierte Version der Komponenten zur Entwicklung von Gerätetreibern in Rust zur Prüfung vorgeschlagen. Die Rust-Unterstützung wird als experimentell betrachtet, ist jedoch bereits für die Aufnahme in den linux-next-Zweig genehmigt und ausreichend entwickelt, um mit der Erstellung von Abstraktionsschichten über den Kernsubsystemen sowie dem Schreiben 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 gegründet hat und die Förderung von HTTPS sowie die Entwicklung von Technologien zur Verbesserung der Internetsicherheit unterstützt.
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.
In der neuen Version der Patches wurden die Anmerkungen, die während der Diskussion der ersten, zweiten und dritten Überarbeitungen geäußert wurden, weiter berücksichtigt. In der neuen Version:
- Es wurde auf die Verwendung des stabilen Compiler-Release Rust 1.58.0 als Referenz umgestellt. Zu den erforderlichen Änderungen für das Projekt, die noch nicht im Hauptbestand von Rust enthalten sind, zählen das Flag „-Zsymbol-mangling-version=v0“ (erwartet in Rust 1.59.0) und der Modus „maybe_uninit_extra“ (erwartet in Rust 1.60.0).
- Automatische Überprüfungen der Verfügbarkeit geeigneter Rust-Tools wurden hinzugefügt und die Möglichkeiten zur Testung der Rust-Unterstützung im System erweitert.
- Neue Abstraktionen für den Zugriff aus Rust-Code auf die Identifikator-Tabellen („IdArray“ und „IdTable“) wurden vorgeschlagen.
- Zwischenschichten für den Zugriff auf zeitbezogene Funktionen (Clock-Framework) wurden hinzugefügt.
- Die Treiber für Plattformen werden jetzt über die Implementierung von Traits definiert.
- Ein neuer Makro wurde hinzugefügt, um die Registrierung von Plattformtreibern zu vereinfachen, und ein neues Treiber-Template wurde vorgeschlagen.
- Makros für die Strukturen „dev_*“ wurden hinzugefügt.
- Die Methoden „{read,write}*_relaxed“ für den Typ IoMem wurden hinzugefügt.
- Die Eigenschaft FileOpener wurde entfernt, um die Dateioperationen zu vereinfachen.
- Ein Parameter „ThisModule“ wurde zu den Argumenten hinzugefügt, die bei der Registrierung des Treibers übergeben werden.
- Ein Typ-Template für die Erstellung von Kernelmodulen in Rust wurde vorgeschlagen.
Quelle: opennet.ru
