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

Miguel Ojeda, der Autor des Rust-for-Linux Projekts, hat den Entwicklern des Linux-Kernels die Veröffentlichung der v8 Komponenten für die Gerätreibentwicklung in Rust zur Prüfung vorgeschlagen. Dies ist die überarbeitete Version der Patches, die unter Berücksichtigung der ersten Variante veröffentlicht wurde, die keine Versionsnummer trägt. Die Unterstützung von Rust wird als experimentell betrachtet, ist jedoch bereits in den linux-next Branch integriert und strebt eine Integration in die Herbstveröffentlichung 5.20/6.0 an, wird als ausreichend entwickelt angesehen, um erste Arbeiten an Abstraktionsschichten über den Kernsubsystemen sowie zur Erstellung 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 ins Leben gerufen hat und die Förderung von HTTPS sowie die Entwicklung von Technologien zur Verbesserung der Internetsicherheit unterstützt.

In der neuen Version:

  • Das Tool und die Library alloc, die von möglichen Panikstatusgenerationen bei Fehlern befreit sind, wurden auf die Rust Version 1.62 aktualisiert. Im Vergleich zur vorher verwendeten Version wurde die Unterstützung der Funktionalität const_fn_trait_bound im Rust Tool stabilisiert, die in den Patches für den Kernel verwendet wird.
  • Der Code der Bindings wurde in ein separates crate-Paket namens 'bindings' ausgelagert, was die Neuanfertigung im Falle von Änderungen am Hauptpaket 'kernel' erleichtert.
  • Die Implementierung des Macros 'concat_idents!' wurde als prozedurales Macro umgeschrieben, das nicht an die Funktionalität von concat_idents gebunden ist und die Verwendung von Referenzen auf lokale Variablen zulässt.
  • Das Macro 'static_assert!' wurde neu geschrieben, sodass 'core::assert!()' in jedem Kontext anstelle von Konstanten verwendet werden kann.
  • Das Macro 'build_error!' wurde angepasst, um mit eingestellten Modulen im Modus 'RUST_BUILD_ASSERT_{WARN,ALLOW}' zu arbeiten.
  • Eine separate Datei mit Einstellungen 'kernel/configs/rust.config' wurde hinzugefügt.
  • Die in den Macro-Substitutionen verarbeiteten Dateien '*.i' wurden in '*.rsi' umbenannt.
  • Die Unterstützung für den Build von Rust-Komponenten mit Optimierungsstufen, die von denen für C-Code abweichen, wurde eingestellt.
  • Ein fs-Modul wurde hinzugefügt, das Bindings für die Arbeit mit Dateisystemen bereitstellt. Ein Beispiel für ein einfaches Dateisystem, das in Rust geschrieben wurde, wurde vorgeschlagen.
  • Ein workqueue-Modul wurde hinzugefügt, um mit Systemwarteschlangen zu arbeiten (es bietet Bindings für die Kernstrukturen work_struct und workqueue_struct).
  • Die Entwicklung des Moduls kasync wurde fortgesetzt, einschließlich der Implementierung von Methoden der asynchronen Programmierung (async). Es wurde ein Beispiel für einen funktionierenden TCP-Server auf Kernebene in Rust hinzugefügt.
  • Die Möglichkeit zur Verarbeitung von Interrupts in Rust wurde durch die Traits [Threaded]Handler und die Typen [Threaded]Registration hinzugefügt.
  • Ein prozeduraler Makro "#[vtable]" wurde hinzugefügt, welcher die Arbeit mit Funktionszeigertabellen, wie der Struktur file_operations, vereinfacht.
  • Die Implementierung von doppelt verketteten Listen "unsafe_list::List" wurde hinzugefügt.
  • Die erste Unterstützung für RCU (Read-copy-update) und der Guard-Typ zur Überprüfung der Bindung einer Lese-Sperre an den aktuellen Thread wurden hinzugefügt.
  • Die Funktion Task::spawn() wurde hinzugefügt, um Kernel-Threads zu erstellen und automatisch zu starten. Der Methode Task::wake_up() wurde ebenfalls hinzugefügt.
  • Das Modul delay wurde hinzugefügt, das Verzögerungen (Wrapper über msleep()) ermöglicht.

Die vorgeschlagenen Änderungen ermöglichen es, Rust als zweite Sprache für die Entwicklung von Treibern und Kernelmodulen zu verwenden. Die Unterstützung für Rust wird als Option präsentiert, die standardmäßig nicht aktiv ist und nicht dazu führt, dass Rust zu den obligatorischen Build-Abhängigkeiten des Kernels zählt. Die Verwendung von Rust zur Entwicklung von Treibern ermöglicht es, mit minimalem Aufwand sichere und qualitativ hochwertigere Treiber zu erstellen, die von Problemen wie dem Zugriff auf den Speicher nach dessen Freigabe, der Dereferenzierung von Nullzeigern und Bufferü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.

Quelle: opennet.ru

60GB SSD 8Gb DDR4