Miguel Ojeda, Autor des Projekts Rust-for-Linux, hat den Entwicklern des Linux-Kernels einen vierten Vorschlag für Komponenten zur Entwicklung von Gerätetreibern in Rust zur Prüfung vorgelegt. Die Unterstützung von Rust wird als experimentell betrachtet, ist jedoch bereits für eine Aufnahme in den Branch linux-next genehmigt und ausreichend weit fortgeschritten, um mit der Erstellung von Abstraktionsschichten über die Kernel-Subsysteme sowie dem Schreiben von Treibern und Modulen zu beginnen. Die Entwicklung wird von Google und der ISRG (Internet Security Research Group) finanziert, die Gründer des Projekts Let’s Encrypt ist und die Förderung von HTTPS sowie die Entwicklung von Technologien zur Erhöhung der Internetsicherheit unterstützt.
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.
In der neuen Version der Patches wurden die Anmerkungen, die während der Diskussion der ersten, zweiten und dritten Revisionen geäußert wurden, weiter bearbeitet. In der neuen Version:
- Der Wechsel zu Rust 1.58.0 als Referenzkompiler wurde vollzogen. Zu den erforderlichen Änderungen für das Projekt, die noch nicht in die Hauptwerkzeugsammlung von Rust aufgenommen wurden, 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 auf die Verfügbarkeit geeigneter Rust-Tools wurden hinzugefügt, und die Möglichkeiten zur Testunterstützung von Rust im System wurden erweitert.
- Neue Abstraktionen für den Zugriff aus Rust-Code auf Geräteidentifikationstabellen („IdArray“ und „IdTable“) wurden vorgeschlagen.
- Schichten für den Zugriff auf den Timer-bezogenen Funktionsrahmen (clock framework) wurden hinzugefügt.
- Treiber für Plattformen sind jetzt durch die Implementierung von Traits definiert.
- Ein neuer Makro zur Vereinfachung der Registrierung von Plattformtreibern wurde hinzugefügt, sowie eine neue Vorlage für einen Standardtreiber vorgeschlagen.
- Makros für die Strukturen „dev_*“ wurden hinzugefügt.
- Die Methoden „{read,write}*_relaxed“ wurden für den Typ IoMem 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 eines Treibers übergeben werden.
- Eine Vorlage für die Erstellung von Kernelmodulen in Rust wurde vorgeschlagen.
Quelle: opennet.ru
