Miguel Ojeda, der Autor des Projekts Rust-for-Linux, hat den Entwicklern des Linux-Kernels die fünfte Variante 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 in den linux-next-Branch integriert und ausreichend fortgeschritten, um mit der Erstellung von Abstraktionsschichten über die Kernel-Subsysteme sowie der Entwicklung 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 Variante der Patches wurde weiterhin an der Behebung der während der Diskussion der ersten, zweiten, dritten und vierten Überarbeitungen geäußerten Anmerkungen gearbeitet. In der neuen Version:
- Im Continuous-Integration-System basierend auf dem von Intel unterstützten Bot 0DAY/LKP wurde die Überprüfung von Komponenten zur Unterstützung von Rust hinzugefügt, und es begann die Veröffentlichung von Testberichten. Die Integration der Rust-Unterstützung in das automatisierte Testsystem KernelCI wird vorbereitet. Das Testing auf Basis von GitHub CI wurde auf die Verwendung von Containern umgestellt.
- Kernel-Module in Rust sind von der Notwendigkeit befreit, crate-Attribute wie „#![no_std]“ und „#![feature(…)]“ zu definieren.
- Die Unterstützung für Einzel-Compile-Ziele (.o, .s, .ll und .i) wurde hinzugefügt.
- In den Empfehlungen zur Codeformatierung wurden Regeln für die Trennung von Kommentaren („//“) und der Dokumentation des Codes („///“) festgelegt.
- Das Skript is_rust_module.sh wurde überarbeitet.
- Die Unterstützung für statische (globale gemeinsame Variablen) Synchronisationsprimitive, die auf der Implementierung von „CONFIG_CONSTRUCTORS“ basieren, wurde hinzugefügt.
- Die Verwaltung von Locks wurde vereinfacht: Guard und GuardMut wurden zusammengeführt und zu einem parametrisierbaren Typ.
- Es wurde die Möglichkeit geschaffen, zusätzliche Parameter beim Registrieren von Geräten zu definieren.
- Eine Abstraktion „RwSemaphore“ wurde hinzugefügt, die als Wrapper um die C-Struktur rw_semaphore fungiert.
- Zur Verwendung von mmap wurde ein neues Modul mm und eine Abstraktion VMA (Wrapper um die Struktur vm_area_struct) hinzugefügt.
- Der GPIO PL061-Treiber wurde auf die Verwendung des Makros „dev_*!“ umgestellt.
- Eine allgemeine Bereinigung des Codes wurde durchgeführt.
Quelle: opennet.ru
