Comment concevoir un système d’exploitation

illustrations illustrations illustrations illustrations illustrations illustrations illustrations

Publié le 10 août 2023 par Andrew Owen (7 minutes)

post-thumb

Si vous avez lu mon récent article sur l’implémentation de DLL pour le CPU Z80, vous savez que je suis en train de concevoir un système d’exploitation appelé SE/OS. Il s’agit d’un composant du micrologiciel (Système 1) de l’ordinateur FPGA Chloe 280SE. Jusqu’à récemment, je l’ai fait d’une manière quelque peu ad-hoc. Mais j’ai atteint un point où cela ne suffit plus. Après avoir demandé conseil à certains de mes amis développeurs, j’ai été orienté vers l’ouvrage d’Andrew S. Tanenbaum et Herbert Bos, “Modern Operating Systems”, qui en est maintenant à sa cinquième édition.

Le livre se concentre principalement sur UNIX (y compris macOS) et Windows, bien qu’il mentionne des systèmes d’exploitation apparentés tels que Linux et VMS. Les systèmes d’exploitation modernes sont multi-utilisateurs, multi-tâches, multi-filières et, le plus souvent, fonctionnent sur des processeurs 64 bits. System 1 n’est rien de tout cela. Malgré cela, j’ai emprunté un exemplaire du livre et j’ai lu le chapitre 12: “Conception du système d’exploitation”. Il s’avère qu’il n’existe pas de méthode universellement reconnue pour concevoir un système d’exploitation. Mais il est utile d’avoir une vision claire de ce que vous essayez de réaliser. Tanenbaum et Bos énumèrent huit points qui rendent la conception d’un système d’exploitation plus difficile que l’écriture d’une application.

  1. Programme de très grande taille: Le système 1 a une empreinte mémoire de 40 kilo-octets et en utilise encore moins lors de l’exécution.
  2. Concurrence: Le système 1 est mono-utilisateur et monotâche, il doit donc seulement gérer plusieurs périphériques d’E/S. Il le fait à l’aide d’un système de canaux et de flux. Pour ce faire, il utilise un système de canaux et de flux.
  3. Utilisateurs hostiles: Le système 1 n’est pas en réseau. Il peut démarrer dans un système minimal sans la présence d’un disque. Les mises à jour des microprogrammes sont validées avant d’être installées.
  4. Partage: Le système 1 utilise le système de fichiers FAT-32 qui facilite le déplacement des données vers et depuis le système.
  5. Protection de l’avenir: Le noyau du système 1 est susceptible d’atteindre un état final stable dans un court laps de temps.
  6. Cas d’utilisation inconnus: Le système 1 est conçu pour être extensible sans recompilation.
  7. Portabilité: Le système 1 est modulaire et entièrement libre.
  8. Compatibilité ascendante: Le Système 1 fournit un interpréteur BASIC qui peut exécuter la majorité des programmes BASIC classiques.

Tanenbaum et Bos énumèrent également trois principes directeurs.

  1. La simplicité: Le Système 1 y parvient de plusieurs façons, en commençant par un code bien organisé.
  2. Complétude: Le système 1 fournit toutes les caractéristiques nécessaires pour utiliser pleinement le matériel.
  3. Efficacité: Le système 1 fournit un ensemble de fonctions et d’appels système de base.

Le système 1 suit une conception descendante avec l’interpréteur BASIC comme interface principale. Il fournit également une interface intégrée avec le DOS au lieu d’un shell autonome. Le DOS lui-même est en quelque sorte une “boîte noire”, puisqu’il a été conçu à partir d’esxDOS 0.8.5. Mais les appels système font abstraction du système de fichiers, de sorte que le DOS n’est appelé qu’indirectement. System 1 ressemble plus à UNIX qu’à Windows, en ce sens qu’il utilise un paradigme d’exécution algorithmique et un paradigme de données unifiées (utilisant des canaux et des flux).

L’interface d’appel système utilise un ensemble standard de registres du CPU et préserve l’état d’autres registres pour que le développeur n’ait pas à le faire. Elle est limitée à un ensemble de fonctionnalités de base, mais fournit un mécanisme permettant de charger des bibliothèques dynamiques. Bien que le DOS utilise un accès aux fichiers orienté connexion, l’interface d’appel système fournit également une couche sans connexion pour certaines opérations de manipulation de fichiers.

Le système 1 a une structure en couches. Contrairement aux processeurs modernes, le Z80 ne supporte pas de modes noyau et utilisateur séparés. La protection de la mémoire est assurée par l’exécution d’une partie du système en mémoire morte (ROM). Les fonctions fonctionnant en ROM comprennent le BIOS, le DOS, la gestion des interruptions et les appels système vectoriels (regroupés par version et fonctionnalité). Les parties du système stockées en RAM comprennent

  • les routines abstraites de gestion des fichiers
  • la page de code (police)
  • les pilotes de périphériques
  • les bibliothèques dynamiques
  • localisation des messages d’erreur
  • localisation des messages d’erreur
  • variables système
  • mode d’écran défini par l’utilisateur

Dans sa mise en œuvre, le système 1 présente certaines similitudes avec le logiciel du système IIGS d’Apple. Les deux comprennent

  • DOS: ProDOS, UnoDOS 3
  • interface: Finder, SE Basic IV
  • Appels système: GS/OS, SE/OS

UnoDOS 3 fournit sa propre API de bas niveau (héritée de esxDOS), mais il n’est généralement pas nécessaire de l’appeler directement et les appels système de SE/OS peuvent être utilisés à la place. UnoDOS 3 utilise le système de fichiers FAT-32, mais SE/OS fournit une couche d’abstraction. Dans SE Basic IV, les noms de dossiers et de disques peuvent comporter de 1 à 11 caractères, tandis que les noms de fichiers utilisent le format 8.3. Les espaces dans les noms de fichiers sont convertis en traits de soulignement, mais les traits de soulignement sont affichés comme des espaces.

Inspiré par BeOS (auquel a succédé Haiku) et NeXTSTEP (auquel a succédé macOS), SE/OS fournit plusieurs kits API tels que:

  • audio
  • la console
  • stockage
  • jeux
  • Graphique

Le kit de stockage comprend un support pour le chargement des bibliothèques dynamiques liées (DLL) et le traitement des données dans le format RIFF (Resource Interchange File Format).

Les applications SE/OS sont stockées sous la forme d’une collection de fichiers et de dossiers à l’intérieur d’un dossier dans un dossier de premier niveau appelé PROGRAMMES. Stocker les applications de cette manière plutôt que sous la forme d’un seul fichier exécutable est une caractéristique partagée avec RISC OS et NeXTSTEP (et ses successeurs, y compris macOS).

Les noms d’applications peuvent être de n’importe quelle longueur et contenir n’importe quel caractère de nom de fichier FAT-32 valide.Dans SE Basic IV, les applications sont lancées avec RUN "MY APP NAME" ou !MY APP NAME. Le nom de l’application est tronqué pour obtenir le dossier et les noms de fichiers binaires, et les espaces sont convertis en caractères de soulignement.

/PROGRAMS
|--------/MY_APP_N.AME
         |------------/PRG
                      |---/MY_APP_N.PRG
                      /RSC
                      |---/RESOURCE.BIN
                      /SRC
                      |---/MY_APP_N.ASM

La commande RUN place le pointeur de pile à $6000, charge le binaire (fichier PRG) à $6000, change le chemin vers le dossier de ressources (RSC) et place le compteur de programme à $6000.

Si le binaire ne se charge pas, il restaure la pile et revient à BASIC.Cela signifie que le binaire peut avoir une longueur maximale de 40 kilo-octets. Le binaire est alors responsable du chargement de ses propres ressources. La méthode pour passer des paramètres à l’application consiste à définir une variable en BASIC.

Cette approche présente un certain nombre d’avantages par rapport à la méthode du fichier exécutable unique. Par exemple, dans le cas d’un logiciel multilingue, seules les ressources de la langue sélectionnée doivent être chargées. Il est également facile de personnaliser l’application sans avoir à la recompiler.

En conclusion, j’ai appris que j’aurais gagné beaucoup de temps si j’avais commencé par la conception du système d’exploitation. Et rétrospectivement, il aurait été plus logique de commencer tout le projet Chloe 280SE à partir d’une feuille blanche. Mais d’autres l’ont fait. Au lieu de cela, le projet a démarré en 1999 comme une tentative de mise à jour d’un ordinateur 8 bits existant. Il est construit sur une collection de composants comprenant le BASIC T/S1000, les modes vidéo Timex 2068, les palettes ULAplus, esxDOS, et un noyau FPGA ZX-Uno. En tant que tel, j’ai eu la chance que la plupart des décisions de conception que j’ai prises aient été dictées par des contraintes indépendantes de ma volonté. Et le Chloe est aujourd’hui plus grand que la somme de ses parties, étant devenu un système unique en son genre.