Projet système PC : 2015 - DELAUNOY Romaric, FROMENT Jean

De Ensiwiki
Aller à : navigation, rechercher
GalapagOS.png
Titre du projet GalapagOS
Cadre Projet système d'exploitation 2015
Page principale Projet_système

Équipe Romaric Delaunoy Jean Froment
Encadrants David Beniamine Gaëtan Morin Grégory Mounié




Présentation générale

Objectifs

Le Projet système a pour objectif principal d'implémenter la partie kernel d'un système d'exploitation. En reprenant la plupart des notions vues en cours, il permet de mettre en éclairage les liens entre l'ordonnancement et la synchronisation des processus, la gestion de la mémoire, et les entrées-sorties. Le déroulement du projet est découpé en 7 phases distinctes. Chacune de ces phases possède une thématique concrète (phase 1 : gestion de l'écran, phase 2 : gestion des processus...), et permet de compartimenter le travail de façon à ne pas se perdre dans la complexité. La plupart des phases spécifient des primitives bien particulières, définies dans la partie suivante.

Cahier des charges

Les spécifications complètes du projet peuvent être consultées sur la page Wiki correspondante : Projet système : spécification.

Apports du projet

Gestion de projet

Outil de gestion de versions

Nous avons utilisé l'outil Git pour maintenir le code du projet. Le dépôt était déjà fourni au départ, nous n'avions qu'à la cloner pour commencer l'implémentation du kernel.
Comme nous étions à deux sur ce projet, nous avons opté pour une méthode de travail en pair-programming :
Nous avons réalisé tout le travail (compréhension des spécifications, déduction du reste, analyse, conception, implémentation et tests) à deux. Tous les jours, nous avons changé de PC pour travailler, afin de pouvoir être deux à écrire du code et réaliser les commits.
Grâce à cette méthode de travail, nous avons pu être en totale synchronisation et cela nous a permis de tirer parti des méthodes agiles.

Nous avons principalement utilisé une seule branche, master. Lors de la phase 5, nous avons créé une nouvelle branche, car beaucoup de code était impacté lors du passage en mode user. Nous avons donc préféré miser sur la sécurité et la stabilité du code lors des étapes les plus importantes du projet.

Planning

Présentation, réalisation, difficultés rencontrées et avancement

Voici le Gantt effectif de la réalisation du projet :

Gantt galapagos.png

Ce planning effectif a été en quasi-total accord avec nos prévisions (mis à part un jour supplémentaire pris pour les tests côté kernel).

Phase 1

Prise en main de l'environnement de développement et gestion de l'affichage à l'écran.

Cette phase fut la plus simple pour nous, puisque nous avons pu nous inspirer du travail réalisé l'année précédente (Mini-projet du logiciel de base).
Cela nous a permis de nous familiariser avec l'architecture du code ainsi qu'aux instructions spécifiques, telles que inb, outb, les traitants, le langage assembleur x86...
Bien évidemment, nous connaissions déjà ces éléments, mais nous ne les avions pas manipulées depuis un an, et une remise en jambe n'était pas superflue pour démarrer le projet.

Implémentation :

100 %

Tests : N/A

Phase 2

Notion de processus et le changement de contexte entre deux processus.

Cette phase fut assez conséquente en développement, puisqu'elle pose les fondations (structures, algorithmes de base) de tous les mécanismes manipulant les processus. C'est lors de cette phase que fut implémentée une première version du scheduleur, appelée directement par les processus pour gérer leur ordonnancement.

Implémentation :

100 %

Tests : N/A

Phase 3

Ordonnanceur : création dynamique, terminaison et filiation des processus.

Cette phase fut assez délicate mais ce ne fut pas la plus difficile.
Nous sommes partis sur l'implémentation d'une structure de données sous forme de liste chaînée pour la gestion des priorités des processus, plutôt que d'utiliser queue.h
Nous n'avions en effet pas décelé dans la documentation que l'utilisation des queues fournies était vivement conseillée.
C'est pourquoi nous avons préféré garder nos listes chaînées pour ranger nos processus dans la table des processus.

Le diagramme suivant représente la structure que nous avons implémentée de manière plus claire :

Table processes galapagos.png


Implémentation :

100 %

Tests : N/A

Phase 4

Gestion de la communication et de l'endormissement des processus.

Cette phase fut implémentée rapidement.
Les messages sont stockés dans des tableaux appartenant à des structures, elles-mêmes indexées dans un tableau. L'accès à des files de messages se fait simplement.
La principale difficulté a été de comprendre réellement les spécifications. Nous n'avions en effet pas compris de manière immédiate qu'un lecteur pouvait écrire à la place d'un écrivain endormi et vice-versa. C'est lors du passage des tests que cette nécessité s'est exprimée.

Le schéma ci-après représente notre manière de stocker les messaging queues.

GalapagOS Messages.png

Implémentation :

100 %

Tests (17/17) :

100 %

Phase 5

Séparation des espaces mémoire noyau et processus et ajout du mode utilisateur.

Ce fut clairement la phase la plus délicate. Nous n'étions pas sensibilisés à son importance arrivés à ce stade, mais l'objectif et la motivation sont devenus de plus en plus clair à force de dénicher des informations dans l'ensemble de la documentation. Une fois le PDF trouvé (Ici pour gagner du temps), nous avons pris conscience qu'il fallait 2 piles par processus (une kernel - l'existante, et une user). La difficulté ne se limitait cependant pas à cela car il fallait aussi pouvoir créer les processus coté kernel, puis les basculer en mode user. Pour cela nous avons "simulé" un passage du nouveau processus en mode kernel, en empilant dans sa pile les paramètres eip, cs, eflags, esp, cs. Cet empilement est enfin suivi d'un iret, qui va dépiler ces 5 valeurs pour basculer en mode user. Le processus en mode user utilise ensuite l’interruption 49 pour effectuer des appels systèmes coté kernel.

Implémentation :

100 %

Tests (18/18) :

100 %

Phase 6

Gestion du clavier (entrées/sorties).

Cette phase consistait à développer un pilote de console, qui permettait ensuite de développer un prototype de shell. Ce pilote de console utilise l'interruption clavier numéro 33. Une fois une interruption clavier relevée, le kernel traite les différents cas selon le caractère saisi. Le pilote s'appuie sur une variable echo pour afficher ou non dans la console les caractères saisis. Cette phase consistait aussi à développer la primitive cons_read qui lit les caractères saisis et enregistrés dans un tampon si un saut de ligne est présent dans celui-ci. Cette primitive sera utilisée principalement par le prototype de shell.

Implémentation :

100 %

Tests (19/20) :

95 %

Phase 7

Gestion de l'interpréteur de commandes.

Ce fut globalement la phase la plus "divertissante" du projet. Une fois tous les appels système implémentés et testés, implémenter un shell était une petite partie de plaisir. Nous avons eu quelques problèmes concernant la gestion des \n, et l'historique. Nous avons bien sûr implémenté les fonctions "basiques" du projet (ps, exit...) et avons décidé d'innover un peu en ajoutant quelques fonctionnalités de notre cru, qui sont décrites dans la partie suivante. Cette phase a aussi apportée de nouvelles fonctionnalités au pilote de console. Il est en effet maintenant possible d'utiliser les interruptions clavier suivantes :

  • CTRL+L : efface l'ecran du shell
  • CTRL+C : interrompt le processus lancé par la console

Implémentation :

100 %

Tests (19/20) :

95 %

Commandes du Shell - GalapagOSh

Ajouts dans le shell

Les seuls ajouts notables à notre kernel sont des commandes et fonctionnalités supplémentaires dans le shell:

  • Le passage de paramètres à certaines commandes
    • Commande echo:
      • echo seul active l'echo.
      • echo on active l'echo.
      • echo off desactive l'echo.
    • Commande ps:
      • ps seul affiche le pid, le nom, la priorité et l'état des processus.
      • ps all affiche le pid, le nom, le pid du père, la taille des deux piles (user + kernel) en octets, la priorité et l'état des processus.
  • La commande galapagos, qui affiche le splash screen.
  • La commande test, qui permet de lancer :
    • soit tous les tests (commande test seule)
    • soit un seul test (ex. test 12)
    • soit un intervalle de tests (ex. test 8 10, qui exécutera les tests 8, 9 et 10).
  • La commande sleep :
    • Utilisation : sleep n où n est exprimé en millisecondes.
  • La commande kill :
    • Utilisation : kill <pid> où <pid> est un numéro de PID du processus à tuer.
  • La commande waitpid :
    • Utilisation : waitpid <pid> où <pid> est un numéro de PID à attendre.
  • La commande history, qui affiche l'historique des commandes du shell.
  • Les commandes exit et reboot qui quittent le shell et forcent le kernel à redémarrer.


Tests : N/A

Bugs connus

Quelques bugs sont à noter. Nous avons en effet préféré explorer le projet jusqu'au bout pour en profiter au maximum quitte à perdre en robustesse sur certains points précis.
La plupart de ces bugs concernent la console, développée en un seul jour, en conséquent peu testée.

  • Bug dans les files de messages utilisées comme des mutex. Le test numéro 20 ne passe donc pas.
  • Shell : Un Ctrl+C pendant une commande crée un problème de buffer non vide. La prochaine commande ne sera donc pas reconnue.
  • Ctrl+C sur certains tests génère une erreur. Le processus interrompu n'est pas un fils direct du processus shell, ce cas n'est pas géré. Un Ctrl+C devrait tuer tous les descendants du processus lancé par le shell.
  • Bug de buffer avec les caractères spéciaux (backspace sur ^C ne supprime que C du buffer -> décalage).


Galapa-quoi ?

Galapagos-turtle.jpg

Les îles Galápagos sont un archipel de l'Équateur situé à l'Est de l'océan Pacifique, à la latitude de l'équateur, dont l'île la plus proche du continent, San Cristóbal, se trouve à quelque 965 kilomètres des côtes équatoriennes. Composé d'une quarantaine d'îles d'origine volcanique, il forme une province de l'Équateur depuis 1832 avec Puerto Baquerizo Moreno pour capitale. Il accueille le parc national Galápagos et la réserve marine des Galápagos qui constituent un site du patrimoine mondial de l'Unesco. (source : [1])

Il n'en fallait pas plus pour les créateurs du kernel pour fonder GalapagOS, jeu de mot Galapagos-OS témoignant d'une ouverture d'esprit sur le monde, ainsi que d'un humour sophistiqué.