- Banan-OS est un système d’exploitation hobby écrit en C++, qui prend actuellement en charge les architectures x86_64 et i686
- Son périmètre fonctionnel couvre l’espace utilisateur Ring3, le SMP, une pile réseau, le chargement ELF et l’édition de liens dynamique, la mémoire copy-on-write, ainsi qu’un environnement graphique de base
- Côté pilotes et fonctions système, il prend en charge les disques NVMe et ATA, les NIC E1000/E1000E et de la famille RTL, les entrées PS2 et USB, les systèmes de fichiers Ext2 et FAT, GRUB et son propre bootloader BIOS
- TCP est indiqué comme partiellement implémenté et bogué, tandis que SSL, les périphériques virtio, certains contrôleurs USB, les systèmes de fichiers Sys et 9P, ainsi que son propre bootloader UEFI ne sont pas encore implémentés
- La compilation s’articule autour du script
./bos; après la création de la toolchain, il permet d’exécuter QEMU ou Bochs, de compiler le noyau et les images, et de choisir les options d’architecture, de bootloader, d’UEFI et d’initrd
Présentation de Banan-OS
- Banan-OS est un système d’exploitation hobby écrit en C++
- Les architectures actuellement prises en charge sont x86_64 et i686
- Une démo live est disponible sur bananymous.com/banan-os
- Pour lancer DOOM, il faut entrer dans l’environnement GUI avec la commande
start-gui, puis exécuterdoomdepuis le terminal GUI
Principales fonctionnalités implémentées
- Fonctionnalités générales
-
Espace utilisateur Ring3
- SMP, c’est-à-dire le multiprocesseur
- Framebuffer linéaire basé sur VESA et GOP
- Pile réseau
- Chargement d’exécutables ELF
- Interpréteur AML partiel
- Environnement graphique de base
- Émulateur de terminal
- Barre d’état
- Lanceur de programmes
- Les « applis convenables » ne sont pas encore implémentées
- Édition de liens dynamique ELF
- Mémoire copy-on-write
- Les mappings de fichiers sont implémentés
- Les mappings anonymes ne sont pas implémentés
-
Prise en charge des pilotes, du réseau et des systèmes de fichiers
- Pilotes
- Prend en charge les disques NVMe ainsi que les disques ATA IDE/SATA
- Prend en charge les NIC E1000, E1000E et RTL8111/8168/8211/8411
- Le clavier PS2 prend en charge tous les jeux de scancodes, et la souris PS2 est également prise en charge
- L’USB prend en charge xHCI, les claviers, les souris, le stockage de masse et les hubs
- Les périphériques réseau et stockage EHCI, OHCI, UHCI et virtio ne sont pas implémentés
- Réseau
- Prend en charge ARP, ICMP, IPv4 et UDP
-
TCP est partiellement implémenté et comporte des bugs
- Prend en charge les sockets de domaine Unix
- SSL n’est pas implémenté
- Systèmes de fichiers
- Prend en charge le système de fichiers virtuel, Ext2, FAT12/16/32, Dev, Ram et Proc
- Sys et 9P ne sont pas implémentés
- Bootloader
- Prend en charge GRUB et son propre bootloader BIOS
- Son propre bootloader UEFI n’est pas encore implémenté
Structure du code
- Chaque composant et bibliothèque majeur possède un sous-répertoire distinct, comme
kernel,userspaceoulibc - Chaque répertoire contient un répertoire
includeavec tous les fichiers d’en-tête du composant - Tous les en-têtes sont inclus via un chemin absolu
Compilation et exécution
- Sur Ubuntu 22.04, les paquets
aptnécessaires sontbuild-essential,git,ninja-build,texinfo,bison,flex,libgmp-dev,libmpfr-dev,libmpc-dev,parted,qemu-system-x86etcpu-checker - Dans un environnement
pacman, les paquets nécessaires sontbase-devel,git,wget,cmake,ninja,partedetqemu-system-x86 - La toolchain destinée au système d’exploitation ne se compile qu’une seule fois avec
./bos toolchain- La compilation de binutils et gcc peut prendre beaucoup de temps
- La compilation et l’exécution de l’OS lui-même se font avec la commande
./bos./bos qemu./bos qemu-nographic./bos qemu-debug./bos bochs
- Il est aussi possible de ne compiler que le noyau ou l’image disque
./bos kernel./bos image
- La création et la modification de l’image disque nécessitent des droits root
Options de compilation et gestion des images
- Pour compiler pour une autre architecture, définissez la variable d’environnement
BANAN_ARCH- Exemple :
BANAN_ARCH=i686
- Exemple :
- Pour changer de bootloader, définissez la variable d’environnement
BANAN_BOOTLOADER- Les valeurs prises en charge sont
BANANetGRUB
- Les valeurs prises en charge sont
- Pour l’exécuter en UEFI, il faut définir
BANAN_UEFI_BOOT=1OVMF_PATHdoit également pointer vers le bon chemin OVMF ; la valeur par défaut est/usr/share/ovmf/x64/OVMF.fd
- Pour créer une image initrd sans système de fichiers root physique, définissez
BANAN_INITRD=1- Cela peut être utilisé pour tester sur du matériel doté de contrôleurs USB non pris en charge
- Si l’image disque est corrompue ou si vous souhaitez en créer une nouvelle, supprimez
build/banan-os.imgou exécutez./bos image-full - Un script de shell completion pour zsh est également fourni
- Copiez le fichier
_script/shell-completion/zsh/_bosdans/usr/share/zsh/site-functions/, ou ajoutez_script/shell-completion/zshaufpathde votre.zshrc
- Copiez le fichier
Modalités de contribution
- Le dépôt upstream n’est pas hébergé sur GitHub, mais sur
https://git.bananymous.com/Bananymous/banan-os - Il est aussi possible d’envoyer des PR GitHub, mais le maintainer devra télécharger le diff et l’appliquer manuellement
- Il est possible d’obtenir un compte sur le serveur git séparé ; dans ce cas, il faut le contacter par e-mail ou sur Discord
- Pour l’ajout de nouvelles fonctionnalités, il est préférable de contacter d’abord le maintainer
- Comme il s’agit d’un projet à visée pédagogique, une PR envoyée sans consultation préalable pour une fonctionnalité que le maintainer comptait implémenter lui-même peut être fermée
- Les corrections de bugs sont toujours les bienvenues
- Les messages de commit doivent utiliser le format
Subject: Descriptionsur la première ligneSubjectindique la zone modifiée, commeKernel,ShellouBuildSystem- La première ligne doit tenir en 72 caractères
- Le corps du message doit expliquer plus en détail les changements et leurs raisons
- Tous les commits doivent passer les hooks pre-commit définis dans
.pre-commit-config.yaml
1 commentaires
Commentaires sur Hacker News
Vraiment génial, et j’aime beaucoup le nom. Je me demande quelle a été la partie la plus difficile à implémenter jusqu’ici, et s’il y a eu de sérieux obstacles en cours de route
La spécification ACPI est tellement mal rédigée que l’interpréteur AML a été difficile, et l’USB a été pénible à cause de la taille de la spec et du grand nombre de renvois croisés
Il n’y a pas eu de gros obstacle, mais pour certaines fonctionnalités, j’ai dû abandonner puis y revenir un ou deux mois plus tard
Vraiment impressionnant. Le fait d’avoir notamment implémenté les pilotes USB à partir de zéro est remarquable. Au passage, j’ai essayé de le casser avec
cat doom1.wadIl y a une phrase qui, par convention, doit figurer dans toute annonce de nouveau noyau de système d’exploitation, et elle manque dans celle-ci
Génial. Je me demande combien d’heures par semaine tu consacres à ce projet. La quantité de travail investie a l’air énorme
Ton profil dit que tu es étudiant ; est-ce que ça veut dire à l’université, et si oui, est-ce que tu as aussi travaillé directement sur cet OS dans le cadre de tes études ?
À part ça, le projet ne fait pas directement partie de mes études. En revanche, grâce à lui, j’ai aussi obtenu un travail à temps partiel côté embarqué à l’université
Le temps investi varie vraiment selon ce qui se passe dans ma vie à ce moment-là. Certains mois, j’y ai passé en tout 5 heures, et certaines semaines, j’ai été proche des 40 heures
Super projet. PlatanOS pourrait aussi être un bon nom pour un fork
Très bien, et ça a l’air d’avoir demandé énormément de travail. Je me demande quels ont été les défis les plus mémorables
Impressionnant. Je me demande comment tu développes concrètement : est-ce que tu l’exécutes dans une VM, sur du vrai matériel, et quand tu t’assois pour travailler, à quoi ressemble le processus ?
Tu as dû énormément apprendre en faisant ça, donc je me demande aussi comment tu prends des notes ou suis le développement. Ou bien est-ce que l’OS lui-même sert un peu de journal de développement vivant ?
Voir tourner quelque chose sur du vrai bare metal est toujours génial, et le bare metal est bien moins indulgent qu’une VM
En général, je choisis une fonctionnalité à ajouter, puis je parcours rapidement la spec correspondante, et je regarde aussi parfois comment les systèmes d’exploitation existants la gèrent. Une fois que j’ai un modèle mental de ce dont le système a besoin, j’écris le code au fil de ce qui me vient sur le moment
J’ai la très mauvaise habitude de ne pas écrire de documentation ni de notes. En gros, je garde tout dans ma tête, puis j’oublie ces informations quand j’en ai besoin plus tard. Pour les choses plus complexes, je fais parfois des schémas et je prends des notes, mais elles restent presque toujours en local
Je me demande par où on commence, concrètement, pour écrire des pilotes comme NVMe, ATA ou Realtek NIC. Je sais que la souris et le clavier utilisent le standard HID, mais je me demande si les autres périphériques ont eux aussi des protocoles standard comparables
Je me demande aussi si c’est pour ça que Linux peut éviter « l’installation de pilotes » dans la plupart des cas, et si des API de périphériques standard existent, pourquoi Windows passe-t-il par une procédure d’installation de pilote presque à chaque fois qu’on branche quelque chose ?
Tous les périphériques pour lesquels j’ai écrit un pilote avaient une spécification disponible gratuitement. Par exemple, pour NVMe, c’est ici : https://nvmexpress.org/specifications
Je ne sais pas vraiment comment Linux ou Windows gèrent les pilotes. Quand on compile le noyau Linux, on choisit quels pilotes inclure dans le noyau et lesquels laisser sous forme de modules. En général, les pilotes courants sont compilés avec le noyau, donc il n’y a presque jamais besoin de les installer plus tard ; il suffit de charger le module
Il y a aussi des périphériques qui fonctionnent avec un pilote générique, mais qui offrent plus de fonctionnalités avec un pilote dédié. Par exemple, le réglage des LED d’une souris gaming. Windows installe probablement ce type de pilotes optionnels
Très beau side project. Je me demande si tu aurais des conseils sur le point de départ ou de bonnes ressources pour quelqu’un qui voudrait essayer quelque chose de similaire
Excellent. Je ne m’attendais pas à un tel ensemble de fonctionnalités. Je me demande si tu comptes porter davantage de logiciels à l’avenir
J’ai encore quelques ports en local qui ne fonctionnent pas.
git,binutils,gcc,makecompilent tous, mais produisent des erreurs étranges. C’est probablement lié à un bug dans malibcou dans les appels système