Miguel Ojeda, der Autor des Projekts Rust-for-Linux, hat den Entwicklern des Linux-Kernels eine aktualisierte Version der Komponenten zur Entwicklung von Gerätetreibern in der Programmiersprache Rust zur Prüfung vorgeschlagen. Die Unterstützung von Rust wird als experimentell betrachtet, ist jedoch bereits für die Aufnahme in den linux-next Branch genehmigt worden. In der neuen Version wurden die Anmerkungen, die im Laufe der Diskussion über die erste Version der Patches geäußert wurden, behoben. Linus Torvalds hat sich bereits an der Diskussion beteiligt und vorgeschlagen, die Logik zur Verarbeitung bestimmter Bitoperationen zu ändern.
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.
Die auffälligsten Änderungen in der neuen Version der Patches:
- Der Code für die Speicherverwaltung wurde von möglichen "Panic"-Zuständen bei Fehlern, wie z. B. Speichermangel, befreit. Es wurde eine Version der Rust-Bibliothek alloc aufgenommen, deren Code zur Verarbeitung von Fehlern überarbeitet wurde, wobei das endgültige Ziel darin besteht, alle für den Kernel erforderlichen Funktionen in die Hauptversion von alloc zu übertragen (Änderungen sind bereits vorbereitet und in die Standardbibliothek von Rust eingefügt worden).
- Anstelle von nächtlichen Builds zur Kompilierung des Kernels mit Rust-Unterstützung können jetzt Beta-Versionen und stabile Releases des Compilers rustc verwendet werden. Derzeit wird rustc 1.54-beta1 als Referenzcompiler verwendet, aber nach dem Release von 1.54 Ende des Monats wird genau dieser als Referenz unterstützt.
- Die Unterstützung zum Schreiben von Tests mit dem standardmäßigen Attribut "#[test]" für Rust wurde hinzugefügt, ebenso wie die Möglichkeit, Doctests zur Dokumentation von Tests zu verwenden.
- Die Unterstützung für die Architekturen ARM32 und RISCV wurde zusätzlich zu den zuvor unterstützten x86_64 und ARM64 hinzugefügt.
- Die Implementierungen von GCC Rust (GCC-Frontend für Rust) und rustc_codegen_gcc (Backend von rustc für GCC) wurden verbessert, sodass nun alle grundlegenden Tests erfolgreich durchlaufen werden.
- Eine neue Abstraktionsebene wurde für die Verwendung von Kernmechanismen in Rust-Programmen, die in C geschrieben sind, eingeführt, wie z. B. Rot-Schwarz-Bäume, Referenzzählobjekte, Dateideskriptorerstellung, Tasks, Dateien und Eingabe-/Ausgabeverzeichnisse.
- In den Komponenten zur Entwicklung von Treibern wurde die Unterstützung des Moduls "file_operations", des Makros "module!", der Registrierung von Makros und rudimentären Treibern (Probe und Remove) verbessert.
- Im Binder wurde die Unterstützung für die Übertragung von Dateideskriptoren und LSM-Hooks implementiert.
- Ein funktionaleres Beispiel eines Treibers in Rust — bcm2835-rng für den Hardware-Zufallszahlengenerator der Raspberry Pi-Platinen wurde vorgeschlagen.
Darüber hinaus werden Projekte einiger Unternehmen erwähnt, die mit der Verwendung von Rust im Kernel verbunden sind:
- Das Unternehmen Microsoft bekundete Interesse an der Beteiligung an der Integration der Unterstützung von Rust im Linux-Kernel und ist bereit, in den kommenden Monaten Treiberimplementierungen für Hyper-V in Rust bereitzustellen.
- Das Unternehmen ARM arbeitet an der Verbesserung der Unterstützung von Rust für Systeme, die auf ARM-Prozessoren basieren. Dem Rust-Projekt wurden bereits Änderungen vorgeschlagen, die 64-Bit-ARM-Systeme in die Liste der Plattformen der ersten Unterstützungsstufe (Tier-1) übertragen.
- Das Unternehmen Google unterstützt direkt das Projekt Rust for Linux, entwickelt eine neue Implementierung des Interprozesskommunikationsmechanismus Binder in Rust und prüft die Möglichkeit, verschiedene Treiber auf Rust umzubauen. Über die ISRG (Internet Security Research Group) hat Google die Finanzierung der Arbeiten zur Integration der Rust-Unterstützung in den Linux-Kernel sichergestellt.
- Das Unternehmen IBM hat die Unterstützung von Rust im Kernel für PowerPC-Systeme implementiert.
- Das LSE (Systems Research Laboratory) hat einen SPI-Treiber in Rust entwickelt.
Quelle: opennet.ru
