La huitiè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 v8 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 version révisée 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 est déjà incluse dans la branche Linux-next, prétend être intégrée dans la version d'automne 5.20/6.0 et est suffisamment mature 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 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, exempte de génération possible d'un état « panique » lorsque des erreurs se produisent, ont été mises à jour pour la sortie de Rust 1.62. Par rapport à la version précédemment utilisée, la boîte à outils Rust a stabilisé la prise en charge de la fonctionnalité const_fn_trait_bound utilisée dans les correctifs du noyau.
  • Le code de liaison est séparé dans un package de caisse distinct « liaisons », ce qui simplifie la reconstruction si les modifications sont apportées uniquement au « noyau » du package principal.
  • Implémentation de la macro « concat_idents ! réécrit sous la forme d'une macro procédurale qui n'est pas liée à la fonctionnalité concat_idents et permet l'utilisation de références à des variables locales.
  • La macro « static_assert ! » a été réécrite, permettant l'utilisation de « core::assert!() » dans n'importe quel contexte au lieu de constantes.
  • Macro "build_error!" adapté pour fonctionner lorsque le mode « RUST_BUILD_ASSERT_{WARN,ALLOW} » est défini pour les modules.
  • Ajout d'un fichier séparé avec les paramètres « kernel/configs/rust.config ».
  • Les fichiers « *.i » traités lors des substitutions de macros ont été renommés en « *.rsi ».
  • La prise en charge de la création de composants Rust avec des niveaux d'optimisation différents de ceux utilisés pour le code C a été interrompue.
  • Ajout du module fs, qui fournit des liaisons pour travailler avec les systèmes de fichiers. Un exemple de système de fichiers simple écrit en Rust est fourni.
  • Ajout du module workqueue pour travailler avec les files d'attente système (fournit des liaisons sur les structures du noyau work_struct et workqueue_struct).
  • Le développement du module kasync s'est poursuivi avec la mise en place de méthodes de programmation asynchrone (async). Ajout d'un exemple de serveur TCP de niveau principal écrit en Rust.
  • Ajout de la possibilité de gérer les interruptions dans le langage Rust à l'aide des types [Threaded]Handler et [Threaded]Registration`.
  • Ajout de la macro procédurale "#[vtable]" pour faciliter le travail avec les tables de pointeurs de fonctions, telles que la structure file_operations.
  • Ajout de l'implémentation de listes chaînées bidirectionnelles "unsafe_list::List".
  • Ajout de la prise en charge initiale du type RCU (Read-copy-update) et Guard pour vérifier si un verrou en lecture est lié au thread actuel.
  • Ajout de la fonction Task::spawn() pour créer et démarrer automatiquement les threads du noyau. Ajout également de la méthode Task::wake_up().
  • Ajout d'un module de délai qui vous permet d'utiliser des délais (un wrapper sur msleep()).

Les modifications proposées 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