Miguel Ojeda, auteur du projet Rust-for-Linux, a proposé aux développeurs du noyau Linux de considérer la sortie de la v8 des composants pour le développement de pilotes matériels en Rust. Il s'agit de la révisée édition des patchs prenant en compte la première version publiée sans numéro de version. Le support de Rust est considéré comme expérimental, mais est déjà inclus dans la branche linux-next, il vise une intégration dans la sortie d'automne 5.20/6.0 et est suffisamment développé pour commencer à créer des couches d'abstraction au-dessus des sous-systèmes du noyau, ainsi que pour écrire des pilotes et des modules. Le développement est financé par Google et l'organisation ISRG (Internet Security Research Group), qui est à l'origine du projet Let's Encrypt et promeut le HTTPS et le développement de technologies pour améliorer la sécurité d'Internet.
Dans la nouvelle version :
- L'outil et la version de la bibliothèque alloc, dépourvue des potentielles générations d'état « panic » en cas d'erreurs, ont été mis à jour avec la sortie de Rust 1.62. Comparé à la version précédemment utilisée, l'outil Rust a stabilisé le support de la fonctionnalité const_fn_trait_bound, utilisée dans les patchs au noyau.
- Le code des liaisons a été extrait dans un paquet crate séparé « bindings », ce qui facilite la recompilation en cas de changements uniquement dans le paquet principal « kernel ».
- L'implémentation du macro « concat_idents! » a été réécrite sous forme de macro procédurale, non liée à la fonctionnalité concat_idents, permettant l'utilisation de références à des variables locales.
- Le macro « static_assert! » a été réécrit, ce qui permet d'utiliser « core::assert!() » dans n'importe quel contexte au lieu de constantes.
- Le macro « build_error! » a été adapté pour fonctionner avec le mode « RUST_BUILD_ASSERT_{WARN,ALLOW} » pour les modules.
- Un fichier séparé avec des configurations « kernel/configs/rust.config » a été ajouté.
- Les fichiers traités dans les substitutions de macro « *.i » ont été renommés en « *.rsi ».
- Le support de la construction des composants Rust avec des niveaux d'optimisation différents de ceux utilisés pour le code en C a été arrêté.
- Un module fs a été ajouté, fournissant des liaisons pour travailler avec des systèmes de fichiers. Un exemple de système de fichiers simple, écrit en Rust, a été proposé.
- Un module workqueue a été ajouté pour travailler avec les files d'attente système (fournit des liaisons sur les structures kernel work_struct et workqueue_struct).
- Le développement du module kasync a été poursuivi avec la mise en œuvre de méthodes de programmation asynchrone (async). Un exemple de serveur TCP fonctionnant au niveau du noyau, écrit en Rust, a été ajouté.
- Ajout de la possibilité de gérer des interruptions en Rust grâce aux traits [Threaded]Handler et aux types [Threaded]Registration.
- Ajout du macro procédural « #[vtable] », qui simplifie le travail avec des tableaux de pointeurs de fonction, tels que la structure file_operations.
- Implémentation des listes chaînées bidirectionnelles « unsafe_list::List » ajoutée.
- Support initial de RCU (Read-copy-update) et du type Guard pour vérifier l'attachement du verrouillage en lecture au thread actuel.
- Ajout de la fonction Task::spawn() pour créer et lancer automatiquement des threads noyau. La méthode Task::wake_up() a également été ajoutée.
- Ajout du module delay, permettant d'utiliser des délais (emballage autour de msleep()).
Les changements proposés permettent d'utiliser Rust comme deuxième langage pour le développement de pilotes et de modules noyau. Le support de Rust est présenté comme une option, qui n'est pas active par défaut et ne rend pas Rust une des dépendances de compilation obligatoires du noyau. Utiliser Rust pour développer des pilotes permettra de créer des pilotes sûrs et de meilleure qualité avec un minimum d'efforts, évitant des problèmes tels que l'accès à une zone mémoire après sa libération, la déréférenciation de pointeurs null et le dépassement de tampon.
La sécurité de la mémoire est assurée dans Rust au moment de la compilation par la vérification des références, le suivi de la propriété des objets et la prise en compte de la durée de vie des objets (portée), ainsi que par l'évaluation de l'accès à la mémoire lors de l'exécution du code. Rust fournit également des moyens de protection contre les débordements d'entiers, exige l'initialisation obligatoire des variables avant leur utilisation, gère mieux les erreurs dans la bibliothèque standard, applique le concept de références et de variables immuables par défaut, et propose une forte typage statique pour minimiser les erreurs logiques.
Source : opennet.ru
