Die dritte 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 eine dritte Variante von Komponenten zur Entwicklung von GerĂ€tetreibern in Rust zur PrĂŒfung vorgeschlagen. Die UnterstĂŒtzung von Rust wird als experimentell angesehen, wurde jedoch bereits fĂŒr die Aufnahme in den linux-next-Zweig genehmigt. 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.

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 Version der Patches wurden die Anmerkungen, die wĂ€hrend der Diskussion der ersten und zweiten Patch-Versionen geĂ€ußert wurden, weiter bearbeitet. Die auffĂ€lligsten Änderungen sind:

  • Es wurde auf die Verwendung des stabilen Compilers Rust 1.57 als Referenz umgestellt, und es wurde eine Bindung an die stabilisierte Version der Programmiersprache Rust 2021 gewĂ€hrleistet. Zuvor waren die Patches an die Beta-Branch von Rust gebunden und verwendeten einige Funktionen der Sprache, die in die Kategorie instabil fallen. Der Umstieg auf die Spezifikation Rust 2021 hat es ermöglicht, die Arbeit an der Abschaffung der Verwendung solcher instabilen Funktionen in den Patches zu initiieren, wie const_fn_transmute, const_panic, const_unreachable_unchecked, core_panic und try_reserve.
  • Die Entwicklung der in den Patches enthaltenen Rust-Bibliothek alloc wurde fortgesetzt, die so modifiziert wurde, dass die Speicherzuweisungsfunktionen keine 'panic'-ZustĂ€nde mehr generieren, wenn Fehler wie Speichermangel auftreten. In der neuen Version wurden die Optionen 'no_rc' und 'no_sync' implementiert, um Funktionen zu deaktivieren, die im Rust-Code fĂŒr den Kernel nicht verwendet werden, wodurch die Bibliothek modularer wird. Die Zusammenarbeit mit den Hauptentwicklern von alloc, die darauf abzielt, erforderliche Änderungen fĂŒr den Kernel in die Hauptbibliothek zu integrieren, wird fortgesetzt. Die Option 'no_fp_fmt_parse', die fĂŒr den Betrieb der Bibliothek auf Kernel-Ebene erforderlich ist, wurde in die grundlegende Rust-Bibliothek (core) integriert.
  • Der Code wurde bereinigt, um mögliche Warnungen des Compilers beim Bauen des Kernels im CONFIG_WERROR-Modus zu vermeiden. Beim Kompilieren des Codes in Rust wurden zusĂ€tzlich diagnostische Modi des Compilers und Warnungen des Linters Clippy aktiviert.
  • Abstraktionen fĂŒr die Nutzung im Rust-Code von Seqlock-Sperren, Callback-Aufrufen zur Stromverwaltung, I/O-Speicher (readX/writeX), Interrupt-Handler sowie Threads, GPIO, GerĂ€tezugriff, Treiber und Anmeldedaten wurden vorgeschlagen.
  • Die Entwicklungswerkzeuge fĂŒr Treiber wurden mit dem Einsatz von verschiebbaren Mutexen, Bit-Iteratoren, vereinfachten Wrappern fĂŒr Zeiger, verbesserter Fehlersdiagnose und einer infrastructure unabhĂ€ngig von der Datenschnittstelle erweitert.
  • Die Arbeit mit Referenzen wurde durch einen vereinfachten Typ Ref verbessert, der auf dem Backend refcount_t basiert und die gleichnamige Kernel-API zur ZĂ€hlung von Referenzen verwendet. Die UnterstĂŒtzung der Typen Arc und Rc, die in der Standardbibliothek alloc bereitgestellt werden, wurde entfernt und ist im Kernel-Code nicht mehr verfĂŒgbar (fĂŒr die Bibliothek sind Optionen vorbereitet, um diese Typen zu deaktivieren).
  • In die Patches wurde eine Variante des PL061 GPIO-Treibers aufgenommen, die in Rust neu geschrieben wurde. Das Besondere an diesem Treiber ist, dass seine Implementierung zeilenweise dem bestehenden GPIO-Treiber in C entspricht. FĂŒr Entwickler, die sich mit der Erstellung von Treibern in Rust vertraut machen möchten, wurde ein zeilenweiser Vergleich vorbereitet, der zeigt, in welche Rust-Konstrukte der C-Code umgesetzt wurde.
  • Der rustc_codegen_gcc, das Backend rustc fĂŒr GCC, wurde in die Hauptcodebasis von Rust aufgenommen, das die Möglichkeit einer vorausschauenden (AOT) Kompilierung mit der Bibliothek libgccjit realisiert. Bei entsprechender Weiterentwicklung des Backends wird es möglich sein, den im Kernel verwendeten Rust-Code mit GCC zu kompilieren.
  • ZusĂ€tzlich zu den Firmen ARM, Google und Microsoft hat auch Red Hat Interesse an der Nutzung der Programmiersprache Rust im Linux-Kernel bekundet. Wir erinnern daran, dass Google direkt das Projekt Rust for Linux unterstĂŒtzt, eine neue Implementierung des Inter-Process-Communication-Mechanismus Binder in Rust entwickelt und die Möglichkeit einer Neuentwicklung verschiedener Treiber in Rust in Betracht zieht. Microsoft hat mit der Implementierung von Treibern fĂŒr Hyper-V in Rust begonnen. ARM arbeitet an der Verbesserung der Rust-UnterstĂŒtzung fĂŒr Systeme auf Basis von ARM-Prozessoren. IBM hat die UnterstĂŒtzung von Rust im Kernel fĂŒr PowerPC-Systeme implementiert.

Quelle: opennet.ru

60GB SSD 8Gb DDR4