Achte Version der Patches für den Linux-Kernel mit Unterstützung für die Programmiersprache Rust

Miguel Ojeda, der Autor des Projekts Rust-for-Linux, hat den Entwicklern des Linux-Kernels die Veröffentlichung der v8-Komponenten zur Entwicklung von Gerätetreibern in Rust zur Prüfung vorgeschlagen. Dies ist die überarbeitete Version der Patches, die auf der ersten Variante basiert, die ohne Versionsnummer veröffentlicht wurde. Die Unterstützung für Rust wird als experimentell betrachtet, ist jedoch bereits in den Branch linux-next enthalten und strebt eine Integration in die Herbstversion 5.20/6.0 an. Sie ist ausreichend ausgereift, 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 Organisation ISRG (Internet Security Research Group) finanziert, die auch 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.

In der neuen Version:

  • Das Toolkit und die Alternative der Bibliothek alloc, die von möglichen 'panic'-Zuständen bei Fehlern befreit ist, wurden auf die Rust-Version 1.62 aktualisiert. Im Vergleich zur zuvor verwendeten Version wurde die Unterstützung für die Funktionalität const_fn_trait_bound im Rust-Toolkit stabilisiert, die in den Patches für den Kernel eingesetzt wird.
  • Der Bindungscode wurde in ein separates Crate-Paket „bindings“ ausgelagert, was das Neubauen bei Änderungen im Hauptpaket „kernel“ vereinfacht.
  • Die Implementierung des Makros „concat_idents!“ wurde in Form eines prozeduralen Makros neu geschrieben, das nicht an die Funktionalität von concat_idents gebunden ist und die Verwendung von Referenzen auf lokale Variablen ermöglicht.
  • Das Makro „static_assert!“ wurde überarbeitet, sodass „core::assert!()“ in jedem Kontext anstelle von Konstanten verwendet werden kann.
  • Das Makro „build_error!“ wurde angepasst, um im Modus „RUST_BUILD_ASSERT_{WARN,ALLOW}“ für Module verwendet zu werden.
  • Eine separate Datei mit den Einstellungen „kernel/configs/rust.config“ wurde hinzugefügt.
  • Die in den Makro-Ersatzdateien enthaltenen „*.i“ wurden in „*.rsi“ umbenannt.
  • Die Unterstützung für den Bau von Rust-Komponenten mit Optimierungsleveln, die von denen des C-Codes abweichen, wurde eingestellt.
  • Ein fs-Modul wurde hinzugefügt, das Wrapper für die Arbeit mit Dateisystemen bereitstellt. Ein Beispiel für ein einfaches Dateisystem, das in Rust geschrieben ist, wurde vorgeschlagen.
  • Ein workqueue-Modul für die Arbeit mit Systemwarteschlangen wurde hinzugefügt (stellt Wrapper für die Kernel-Strukturen work_struct und workqueue_struct zur Verfügung).
  • Die Entwicklung des Moduls kasync wurde fortgesetzt, mit der Implementierung von Methoden der asynchronen Programmierung (async). Ein Beispiel eines auf Kernel-Ebene arbeitenden TCP-Servers, geschrieben in Rust, wurde hinzugefügt.
  • Die Möglichkeit zur Verarbeitung von Interrupts in Rust wurde hinzugefügt, mithilfe der Traits [Threaded]Handler und [Threaded]Registration.
  • Ein prozeduraler Macro "#[vtable]" wurde hinzugefügt, der die Arbeit mit Funktionstrainern wie der Struktur file_operations vereinfacht.
  • Die Implementierung von bidirektionalen verketteten Listen "unsafe_list::List" wurde hinzugefügt.
  • Die anfängliche Unterstützung für RCU (Read-copy-update) und der Typ Guard zur Überprüfung der Bindung einer Read-Lock an den aktuellen Thread wurden hinzugefügt.
  • Die Funktion Task::spawn() wurde hinzugefügt, um Kernel-Threads zu erstellen und automatisch zu starten. Auch die Methode Task::wake_up() wurde ergänzt.
  • Ein Delay-Modul wurde hinzugefügt, das Verzögerungen ermöglicht (Wrapper über msleep()).

Die vorgeschlagenen Änderungen ermöglichen die Nutzung von Rust als zweite Sprache für die Entwicklung von Treibern und Kernel-Modulen. Die Unterstützung von Rust wird als Option angeboten, die nicht standardmäßig aktiviert ist und nicht zur Verpflichtung führt, Rust in den erforderlichen Build-Abhängigkeiten des Kernels einzuschließen. Die Verwendung von Rust zur Entwicklung von Treibern bietet die Möglichkeit, sicherere und hochwertigere Treiber mit minimalem Aufwand zu erstellen, die frei von Problemen wie dem Zugriff auf den Speicherbereich nach dessen Freigabe, dem Dereferenzieren von Nullzeigern und Pufferüberläufen 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

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster