Dans le cadre du projet Kerla, un noyau de système d'exploitation est en cours de développement, écrit en langage Rust. Ce nouveau noyau est initialement conçu pour assurer la compatibilité avec le noyau Linux au niveau de l'ABI, ce qui permettra d'exécuter des fichiers binaires non modifiés, compilés pour Linux, dans un environnement basé sur Kerla. Le code est distribué sous les licences Apache 2.0 et MIT. Le projet est développé par le développeur japonais Seiya Nuta, connu pour la création du système d'exploitation à micro-noyau Resea, écrit en langage C.
À l'étape actuelle de développement, Kerla ne peut fonctionner que sur des systèmes avec une architecture x86_64 et implémente des appels système de base tels que write, stat, mmap, pipe et poll, prend en charge les signaux, les canaux anonymes et les échanges de contexte. Pour la gestion des processus, des appels tels que fork, wait4 et execve sont fournis. Le support de tty et des pseudo-terminaux (pty) est également présent. Pour les systèmes de fichiers, seuls initramfs (utilisé pour monter le système de fichiers racine), tmpfs et devfs sont pris en charge. Un stack réseau avec prise en charge des sockets TCP et UDP, implémenté à l'aide de la bibliothèque smoltcp, est fourni.
Le développeur a préparé un environnement de démarrage, qui peut être exécuté dans QEMU ou dans une machine virtuelle Firecracker avec un driver virtio-net, auquel on peut déjà se connecter via SSH. La bibliothèque système utilisée est musl, et les utilitaires utilisateur sont BusyBox.

Un système de construction basé sur Docker a été préparé, permettant de créer ses propres initramfs de démarrage avec le noyau Kerla. Une interface de commande similaire à fish, appelée nsh, ainsi qu'une pile graphique Kazari basée sur le protocole Wayland, sont également en développement.

L'utilisation du langage Rust dans le projet permet de réduire le nombre d'erreurs dans le code grâce à l'application de techniques de programmation sécurisées et à une amélioration de l'efficacité de détection des problèmes liés à la gestion de la mémoire. La gestion sécurisée de la mémoire est assurée en Rust lors 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 la validité de l'accès à la mémoire lors de l'exécution du code. De plus, Rust fournit des moyens de protection contre les débordements entiers, exige une initialisation obligatoire des valeurs des variables avant leur utilisation, applique le concept d'immuabilité (immutable) des références et des variables par défaut, et offre une forte typage statique pour minimiser les erreurs logiques, facilitant le traitement des valeurs d'entrée grâce à des moyens de correspondance de modèles.
Pour le développement de composants bas niveau, tels que le noyau du système d'exploitation, Rust fournit un support pour les pointeurs bruts, l'emballage de structures, les insertions inline en assembleur, et l'inclusion de fichiers en assembleur. Pour fonctionner sans dépendance à la bibliothèque standard, il existe des packages crate isolés pour effectuer des opérations sur des chaînes de caractères, des vecteurs et des indicateurs de bits. Parmi les avantages, on note également des outils intégrés pour évaluer la qualité du code (linter, rust-analyzer) et créer des tests unitaires, qui peuvent être exécutés non seulement sur du matériel réel, mais aussi dans QEMU.
Source : opennet.ru
