dans Programmation

Créer un système d’exploitation

Quel fantasme n’est-ce pas ? Ou tout du moins c’était beaucoup le cas il y a quelques années. Pourquoi parler de ça maintenant alors ? Parce qu’en lisant sur le matériel et l’architecture des PC, je suis tombé sur de vieux commentaires que j’avais écris sur le Site du Zéro, au temps où j’étais inscris sur ce site qui était encore agréable à fréquenter (que le temps passe). À l’époque, j’avais fais mumuse en suivant quelques articles et j’avais écris un résumé de ce que je savais. Dépoussiérons un peu tout ça.

C’est quoi un système d’exploitation ?

Avant de vouloir créer quelque chose, c’est bien de comprendre ce qu’est cette chose justement. Un système d’exploitation est un ensemble de programmes permettant de piloter différents composants matériels. Il vise deux objectifs.

  • D’abord, faire l’interface entre les demandes de l’utilisateur en espace mémoire, connexions, fichiers, calculs, etc et les ressources disponibles, le processeur, la RAM, le disque dur, etc.
  • Gérer toutes ces demandes dans l’espace (allocation) et dans le temps (ordonnancement).

En faisant le pont entre les applications et le matériel, il les rend indépendants. Ainsi, un programme ayant besoin de travailler avec le processeur graphique ne va pas envoyer directement des instructions à la carte mais va plutôt envoyer des instructions au système d’exploitation, qui lui va se charger de dialoguer avec le périphérique graphique. Ainsi, un changement de carte est transparent pour le développeur de notre programme. Par contre, il faut que le système puisse communiquer avec la nouvelle carte, ce qui se fait en installant les pilotes de périphériques appropriés. C’est grâce à ces pilotes que le système sait comment dicter ses volontés à la carte.

Je conseille aussi la lecture de l’article de CÇM sur le sujet.

Quel intérêt ?

Qu’on se mette d’accord maintenant, il n’y a aucun intérêt à le faire, hormis apprendre. Le monde du libre est déjà bien équipé pour répondre à de multiples besoins, avec par exemple Linux, capable de s’adapter à beaucoup de plateformes différentes. Faire un système n’a donc qu’un but ludique et instructif, du même acabit que faire un langage de programmation, à savoir mieux comprendre l’existant.

De la complexité de l’opération

Comme pour toute fantasme, on trouve toujours la personne qui sous-estime la difficulté de la chose et qui s’imagine faire une version améliorée de Windows et de GNU/Linux, rien que ça. Alors coupons court à ces délires de fous furieux : oui, faire un système d’exploitation n’est pas facile ni à la venue du premier passant.

  • D’abord, quelques connaissances en assembleur. On ne demande pas d’être un virtuose, simplement d’avoir quelques bases, notamment pour le bootloader (que l’on choisisse de le coder soi-même ou d’utiliser un existant), ou encore pour certaines opérations comme la gestion des interruptions ou la création de la Global Descriptor Table, obligatoire dès lors qu’on est en mode protégé.
  • De bonnes connaissances d’au moins un langage de programmation qui permet d’insérer de l’assembleur directement dans le code. Celui auquel on pense très souvent, c’est le C. C’est en C qu’est écrit le noyau Linux par exemple. D’autres langages peuvent tout à fait convenir : C++, qui concurrence le C sur son domaine de prédilection, mais aussi FORTRAN, le D voire même C# ! Il faut aussi être à l’aise avec la manipulation de bits, les masques et autres décalages.
  • Connaître l’architecture cible. La plus répandue parmi les ordinateurs est l’architecture x86, qui bénéficie donc d’une pléthore de documents, d’articles et de tutoriels. En guise de référence ultime, Intel propose une documentation complète (plusieurs milliers de pages). Une autre architecture, répandue sur les téléphones et tablettes notamment, c’est ARM. Elle est un peu plus simple à comprendre que la x86 et on peut s’en tirer pour moins de 100€ de composants pour faire mumuse. Enfin, il y a aussi les connaissances plus génériques comme les formats de fichiers, les formats d’exécutables, le fonctionnement des différentes parties d’un système d’exploitation, etc.
  • Avoir et maîtriser les bons outils. En plus de savoir utiliser un compilateur en ligne de commande, il faut aussi penser à l’assembleur, au linker, à un bon éditeur de texte, à un émulateur (parce que redémarrer toutes les 15s, c’est marrant deux minutes), etc. Pour ça, rien ne vaut GNU/Linux (ou un UNIX, je suis pas sectaire). Il est libre et nous permet de développer un système d’exploitation sans problème de licence ni d’autorisation, la console est puissante, les outils de qualité (je pense à GCC notamment).
  • Et enfin, le plus important, les qualités d’un bon développeur. De l’humilité, pour admettre que l’on ne fera pas un projet révolutionnaire qui va tout déchirer de la mort qui tue et que ce qu’on fait à de grandes chances de n’être utile à personne. De la modestie, pour reconnaître que l’on ne sait pas tout et qu’on ne peut pas tout faire. De la patience, parce que c’est un projet long et fastidieux dont les résultats ne sont pas toujours visibles. De l’organisation, de la rigueur et du code propre, parce qu’on aime le travail bien fait.

Ça va, toujours avec moi ? Maintenant, tordons le cou à l’idée opposée qui consiste à dire que créer un système d’exploitation, c’est trop compliqué, que seul un ingénieur blindé de diplômes, d’une intelligence surhumaine, ou bien s’appelant Linus Torvald ou Bill Gates peut y arriver. Eh bien c’est faux ! Oui, programmer un système d’exploitation c’est faisable. C’est complexe, mais pas infaisable, n’exagérons pas.

Quelques liens

Parce que je suis un être bon et généreux (quoi, qui vient de dire le contraire ?), voici une liste de liens que j’ai pu collecter au fil de mes pérégrinations. Si tu en as d’autres à suggérer, n’hésite pas à laisser un commentaire.

  • Logram, un petit système d’exploitation fait en amateur sur le SdZ (sujet de présentation et le code source sur CÇM ou sur GitHub).
  • Pepin OS, un petit tutoriel pour implémenter un petit système d’exploitation.
  • BrokenThorn (en) , une autre série d’articles sur l’implémentation d’un petit système.
  • OSDev (en), un wiki sur le développement de systèmes d’exploitation, avec de nombreux articles sur la pagination, les interruptions, le boot, etc.
  • SOS, une autre série didactique sur la création d’un petit système d’exploitation.
  • Linux (archive) dans sa toute première version. En lien, le livre Conception des systèmes d’exploitation, le cas Linux analyse le code de cette première version.
  • proorOS (archive), un petit système en C++.
  • Manux, un petit système à décortiquer écrit par un français avec des commentaires en français.
  • Minix, un système d’exploitation créé par Andrew Tanenbaum pour illustrer ses cours sur la programmation système. Il est intéressant à décortiquer lui aussi.
  • Le site WikiHow propose une entrée sur le sujet.
  • Un énorme paquet de liens fournis par la communauté de StackOverflow.

Laisser un commentaire