La sixième version des correctifs pour le noyau Linux avec prise en charge du langage Rust

Miguel Ojeda, auteur du projet Rust-for-Linux, a proposé la publication de composants v6 pour développer des pilotes de périphériques dans le langage Rust pour examen par les développeurs du noyau Linux. Il s'agit de la septième édition des correctifs, prenant en compte la première version, publiée sans numéro de version. La prise en charge de Rust est considérée comme expérimentale, mais elle est déjà incluse dans la branche Linux-next et est suffisamment développée pour commencer à travailler sur la création de couches d'abstraction sur les sous-systèmes du noyau, ainsi que sur l'écriture de pilotes et de modules. Le développement est financé par Google et l'ISRG (Internet Security Research Group), fondateur du projet Let's Encrypt et qui promeut HTTPS et le développement de technologies pour améliorer la sécurité sur Internet.

Dans la nouvelle version:

  • La boîte à outils et une variante de la bibliothèque alloc, libérées de la génération possible d'un état "panique" en cas d'erreurs, ont été mises à jour vers la version Rust 1.60, qui stabilise la prise en charge du mode "maybe_uninit_extra" utilisé dans les correctifs du noyau.
  • Ajout de la possibilité d'exécuter des tests à partir de la documentation (tests qui sont également utilisés comme exemples dans la documentation), via la conversion au moment de la compilation des tests liés à l'API du noyau en tests KUnit exécutés lors du chargement du noyau.
  • Des exigences ont été adoptées selon lesquelles les tests ne doivent pas entraîner d'avertissement Clippy linter, tout comme le code du noyau Rust.
  • Une première implémentation du module « net » avec des fonctions réseau est proposée. Le code Rust a accès aux 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 IPv6. .
  • Il existe un premier support pour les techniques de programmation asynchrone (async), implémentées sous la forme du module kasync. Par exemple, vous pouvez écrire du code asynchrone pour manipuler les sockets TCP : async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; boucle { let n = stream.read(&mut buf).await?; si n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
  • Ajout du module net::filter pour manipuler les filtres de paquets réseau. Ajout d'un exemple rust_netfilter.rs avec une implémentation de filtre dans le langage Rust.
  • Ajout de l'implémentation d'un simple mutex smutex::Mutex, qui ne nécessite pas d'épinglage.
  • Ajout de NoWaitLock, qui n'attend jamais un verrou et, s'il est occupé par un autre thread, provoque le signalement d'une erreur lors de la tentative d'acquisition du verrou au lieu d'arrêter l'appelant.
  • Ajout de RawSpinLock, identifié par raw_spinlock_t dans le noyau, pour s'appliquer aux sections qui ne peuvent pas être inactives.
  • Ajout du type ARef pour les références à un objet auquel le mécanisme de comptage de références est appliqué (toujours refcounted).
  • Le backend rustc_codegen_gcc, qui vous permet d'utiliser la bibliothèque libgccjit du projet GCC comme générateur de code dans rustc pour fournir à rustc la prise en charge des architectures et des optimisations disponibles dans GCC, a implémenté la possibilité d'amorcer le compilateur rustc. La promotion du compilateur signifie la possibilité d'utiliser un générateur de code basé sur GCC dans rustc pour construire le compilateur rustc lui-même. De plus, la récente version de GCC 12.1 inclut les correctifs de libgccjit nécessaires au bon fonctionnement de rustc_codegen_gcc. Des préparatifs sont en cours pour permettre l'installation de rustc_codegen_gcc à l'aide de l'utilitaire rustup.
  • Les progrès dans le développement du frontend gccrs de GCC avec la mise en œuvre du compilateur du langage Rust basé sur GCC sont notés. Actuellement, deux développeurs à temps plein travaillent sur gccrs.

Rappelons que les changements proposés permettent d'utiliser Rust comme deuxième langage pour développer des pilotes et des modules du noyau. La prise en charge de Rust est présentée comme une option qui n'est pas activée par défaut et n'entraîne pas l'inclusion de Rust en tant que dépendance de construction requise pour le noyau. L'utilisation de Rust pour le développement de pilotes vous permettra de créer des pilotes plus sûrs et de meilleure qualité avec un minimum d'effort, sans problèmes tels que l'accès à la mémoire après la libération, les déréférences de pointeurs nuls et les dépassements de tampon.

Une gestion sécurisée de la mémoire est assurée dans Rust au moment de la compilation grâce à la vérification des références, au suivi de la propriété des objets et de leur durée de vie (portée), ainsi qu'à l'évaluation de l'exactitude de l'accès à la mémoire pendant l'exécution du code. Rust offre également une protection contre les débordements d'entiers, nécessite l'initialisation obligatoire des valeurs des variables avant 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, propose un typage statique fort pour minimiser les erreurs logiques.

Source: opennet.ru

Ajouter un commentaire