Miguel Ojeda, auteur du projet Rust-for-Linux, a proposé aux développeurs du noyau Linux de considérer la publication de la version v6 des composants pour le développement de pilotes d'appareils en langage Rust. C'est la septième édition des patches 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 et 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 favorise la promotion de 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 de possibles générations d'état « panic » en cas d'erreurs, ont été mis à jour pour la version Rust 1.60, dans laquelle le support du mode « maybe_uninit_extra », utilisé dans les patches du noyau, a été stabilisé.
- Il a été ajouté la possibilité d'exécuter des tests issus de la documentation (tests également utilisés comme exemples dans la documentation), via la transformation au moment de la compilation de tests liés à l'API du noyau, en tests KUnit, exécutés lors du démarrage du noyau.
- Des exigences ont été acceptées selon lesquelles les tests ne doivent pas provoquer d'avertissements de l'analyseur Clippy, tout comme le code du noyau en langage Rust.
- Une implémentation initiale du module « net » avec des fonctions réseau a été proposée. Un accès à des structures réseau du noyau, telles que « Namespace » (basé sur la structure du noyau « struct net »), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) et leurs équivalents pour IPv6 a été fourni pour le code en langage Rust.
- Un support initial pour les méthodes de programmation asynchrone (async) a été implémenté sous la forme d'un module kasync. Par exemple, il est possible de créer du code fonctionnant en mode asynchrone pour manipuler des sockets TCP : async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
- Le module net::filter a été ajouté pour manipuler les filtres de paquets réseau. Un exemple rust_netfilter.rs avec une implémentation du filtre en langage Rust a été ajouté.
- Ajout d'une implémentation d'un mutex simple smutex::Mutex qui ne nécessite pas de liaison (pinning).
- Ajout d'un verrou NoWaitLock qui ne mène jamais à une attente pour la libération et, en cas d'occupation par un autre thread, fournit une erreur lors de la tentative d'acquisition du verrou au lieu d'arrêter l'appelant.
- Ajout du verrou RawSpinLock identifié avec raw_spinlock_t dans le noyau, utilisé pour les sections qui ne peuvent pas être en état d'attente.
- Ajout du type ARef pour les références à un objet auquel le mécanisme de comptage des références (always-refcounted) est appliqué.
- Dans le backend rustc_codegen_gcc, permettant d'utiliser la bibliothèque libgccjit du projet GCC comme générateur de code dans rustc pour assurer le support des architectures et des optimisations disponibles dans GCC, la possibilité de bootstrapper le compilateur rustc a été mise en œuvre. Le bootstrap du compilateur fait référence à la capacité d'utiliser dans rustc un générateur de code basé sur GCC pour compiler le compilateur rustc lui-même. En outre, la récente version de GCC 12.1 a inclus des corrections dans libgccjit nécessaires au bon fonctionnement de rustc_codegen_gcc. Des préparatifs sont en cours pour permettre l'installation de rustc_codegen_gcc via l'outil rustup.
- Des progrès sont notés dans le développement du frontend GCC gccrs avec la mise en œuvre d'un compilateur pour le langage Rust basé sur GCC. Actuellement, deux développeurs travaillent en mode plein temps sur gccrs.
Rappelons que les modifications proposées permettent d'utiliser Rust comme deuxième langage pour le développement de pilotes et de modules du noyau. Le support de Rust est présenté comme une option, non activée par défaut et ne conduisant pas à l'inclusion de Rust parmi les dépendances de construction obligatoires du noyau. L'utilisation de Rust pour le développement de pilotes permettra de créer des pilotes sûrs et de meilleure qualité avec un minimum d'efforts, en é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 nuls 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
