Projet système PC : 2018 - ALLSPACH Matthias, BAUMANN Magali

De Ensiwiki
Aller à : navigation, rechercher
Etrier1.jpg
Titre du projet L'étrier
Cadre Projet système

Équipe [1] Magali Baumann [2] Matthias Allspach
Encadrants Julie Dumas , Gregory Mounie, Patrick Reignier

Présentation

L'objectif du projet système est le développement du noyau d'un OS compatible avec une architecture INTEL. Le projet se découpe en plusieurs phases qui à terme permettront d'avoir un système gérant les entrées sorties, un shell ainsi que les processus.

Fonctionnalités

L'étrier est le plus petit OS du corps humain. Par ailleurs, il possède maintenant un interpréteur de commande, et peu accomplir les missions suivantes :

  • Dérouler les tests grâce à la commande test.
  • Afficher la liste de commandes et leur description avec la commande help.
  • S'endormir pendant quelques secondes (ou plus si vous voulez mais ça sert à rien) avec sleep.
  • Nettoyer l'affichage avec clear.
  • Afficher la liste des processus qui tournent actuellement grâce à la commande ps.
  • Afficher l'arbre généalogique des processus vivants avec la commande tree.
  • Afficher des informations sur le kernel avec la commande sys_log.
  • Changer la couleur des lettres et de fond des lettres avec la commande couleurs.
  • Changer de pseudo, dans la limite de 5 retenus (arbitraire) grâce à la commande su.
  • Repasser à l'ancien pseudo grâce à la commande exit. S'il n'y a pas d'ancien pseudo (premier créé), cette commande redémarre le système.
  • Redémarrer le système, tout simplement, avec la commande reboot.
  • Proposer un jeu de morpion à deux joueurs avec la commande morpion.
  • Proposer un jeu de space invaders solo avec la commande invaders.

Appels système

Pour permettre tout cela (et bien plus) plusieurs catégories d'appels système sont mis à disposition :

  • Gestion de l'écran (selon spécifications + listés ci-dessous) :
    • Changement de la couleur du texte et du fond;
    • Déplacement curseur;
    • Effacement complet de la console.
  • Gestion des processus (selon spécifications).
  • Gestion de l'horloge (selon spécifications).
  • Gestion des files (selon spécifications).
  • Gestion des sémaphores (selon spécifications).
  • Autres appels (listés ci-dessous) :
    • Affichage de la table des processus;
    • Affichage de la généalogie des processus;
    • Redémarrage du système;
    • Endormissement en secondes;
    • Changement de mode de saisie (immédiate, attente d'un retour chariot (spécification), infini);
    • Affichage des informations sur le système.


Apports et difficultés rencontrées

Ce projet nous a permis d'approfondir et de mettre en application nos connaissances en système d'exploitation. Nous avons également pu nous améliorer dans le développement en C et en assembleur. Ce projet nous a contraint à bien répartir le travail pour être dans les temps, chose que nous avons bien réussi.

La principale difficulté que nous avons rencontrée est lié à la documentation, que ce soit trouvé une information précise dans les différentes pages du wiki, ou comprendre certaines documentations techniques.

Planning et avancement

Voici le planning prévisionnel, l'avancement et le planning réalisé du projet. Les différentes phases sont détaillées ci-dessous.

Planning prévisionnel

Pprevisionnel.jpg

Avancement des différentes phases

Phase 1 Phase 2 Phase 3 Phase 4 Phase 5 Phase 6 Phase 7
100 %
100 %
100 %
100 %
100 %
100 %
100 %

Planning réel

Preel.jpg

Phases détaillées

Phase 1

Niveau : noyau

  • Prise en main de l’environnement
  • Affichage à l'écran

Une première phase sans encombre, malgré un wiki chargé en information et une architecture complexe aux premiers abords. Nous avons réussi à prendre le projet en main rapidement.

Phase 2

Niveau : noyau

  • Notion de processus
  • Changement de contexte entre deux processus

Une phase intéressante durant laquelle nous avons imaginé la structure de nos processus, les informations dont nous allons avoir besoin. Cette phase s'est déroulé sans difficulté particulière.

Phase 3

Niveau : noyau

  • Ordonnancement des processus
  • Création, suppression et filiation des processus

Une phase plus complexe que les deux précédentes. Il a fallu comprendre différentes notions : la pile d'un processus, la filiation entre processus, l'état et la priorité d'un processus. Cette phase nous a demandé un certain temps de réflexion à chaque grande étape.

Phase 4

Niveau : noyau

  • Gestion de files
  • Endormissement des processus

Comparée a la précédente, cette phase a été très simple. La structure de donnée n'a pas posé de souci particulier. Nous avons cependant dû y revenir plusieurs fois à cause de mauvaise lecture des spécifications

Phase 5

Niveau : utilisateur

  • Ajout du mode utilisateur

Cette phase difficile aux premiers abords, fût principalement dédiée à la lecture de documentation. Après avoir lu une tonne de documentation (wiki, intel, ...) difficile à comprendre, nous avons dû recouper les informations importantes, lister les choses à faire, et avancer pas à pas dans notre code assembleur pour arriver à un résultat fonctionnel. Finalement, cette phase à pris moins de temps que ce que nous avions imaginé.

Phase 6

Niveau : utilisateur

  • Pilote de console
  • Appels système généralisé

Cette sixième phase s'est avérée plus simple que nous l'avions imaginé. Juste le temps de mettre les interruptions en place, et de réfléchir à comment réutiliser les files dans cette phase.

Phase 7

Niveau : utilisateur

  • Interprète de commande
  • Commandes de base : test, ps

Dernière phase du projet, aucune difficulté notoire à l'horizon. Nous avons terminé les phases demandées.

Extension

Niveau : utilisateur

  • Ajout de nouvelles commandes : sys_info, tree, help, su, exit, reboot, couleurs
  • Gestion de sémaphores
  • Morpion
  • Space invaders

La phase 7 étant terminée, nous avons eu le temps de faire quelques extensions. Ces extensions n'ont pas posé de soucis (si ce n'est un space invaders qu'il a fallu faire joli, et les sémaphores qui nous semblent bancals sans que nous ayons le temps de plus creuser).

Journal de bord

Semaine 1

07 juin 2018

  • Familiarisation avec l'environnement
  • Reprise du code fait en Logiciel de base
  • Ajout de la fonctionnalité d'affichage écran côté kernel
  • Ajout de la date
  • Ajout d'interruptions

Aujourd'hui, cela a été plutôt facile. Nous avons pris connaissance du wiki (beaucoup trop fourni!), et surtout nous avons récupéré les sources de l'année dernière. Cela fonctionne déjà, avoir un premier résultat est très satisfaisant.

08 juin 2018

  • Familiarisation avec l'environnement de debuggage
  • Mise en place de la table des processus
  • Mise en place du context switch
  • Mise en place d'un ordonnancement tourniquet
  • Mise en place de la date (en couleur)
  • Mise en place du timer avec affichage de temps depuis démarrage (en couleur)
  • Mise en place du temps partagé pour les processus via le timer

Nous avons terminé de (re)prendre en main l'environnement. La manipulation de l'ancien code, pour changer les couleurs par exemple, nous a permis de tout nous remettre en tête, y compris comment débugger !

Semaine 2

11 juin 2018

  • Mise en place de la table des priorités
  • Modification du context_switch pour prendre en compte les priorités
  • Mise en place de la primitive start
  • Ajout de la primitive getPid
  • Ajout de fonction de gestion des listes chainées

Début des choses sérieuses. La table des priorités a été mise en place assez rapidement, mais sans la queue.h fournie car nous ne l'avions pas vu. Il ne semble pas que nous ayons de bug à cause de cela, et ça ne nous a pas coûté de temps en nous offrant l'avantage de maîtriser totalement le code. Un (petit) mal pour un (grand) bien. Par ailleurs, la construction des primitives nous a fait revoir le fonctionnement, pas évident au premier abord, des piles de processus.

12 juin 2018

  • Ajout de la primitive getPrio
  • Ajout de l'affiliation des processus
  • Ajout de la terminaison des processus
  • Ajout d'un gestionnaire de la table des priorité (ancien gestionnaire de liste chainée)
  • Ajout de la primitive exit
  • Remise a niveau de la documentation des fonctions
  • Ajout de la primitive chprio
  • Ajout d'une fonction d'affichage de l'arbre généalogique des processus

Aujourd'hui, la terminaison des processus a été un challenge intéressant. En effet, il fallait bien prendre en compte tous les cas d'états des processus

13 juin 2018

  • Correction de la fin de processus
  • Correction du context switch
  • Renommage de fichiers
  • Divers correctifs pour mise en conformité avec les specs
  • Mise en place de l'endormissement de processus
  • Mise en place de kill
  • Mise en place de waitpid
  • Mise en place des tests fournis côté user dans le kernel

Comme hier, la gestion des états des processus a été compliquée. Nous mettons en place les tests fournis pour couvrir plus de cas.

14 juin 2018

  • Mise en place des tests
  • Tests des processus jusqu'à la phase 3 (début)

Il semblerait qu'introduire les tests maintenant ait été une bonne idée. Nous avons plein de détails à corriger.

15 juin 2018

  • Travail sur les files (début)
  • Tests des processus jusqu'à la phase 3 (suite)

Ce matin, il ne restait que des bugs mineurs sur la phase 3. Nous avons donc choisi de paralléliser le début de la phase 4 avec la fin de la 3. Les files se réalisent assez facilement.

Semaine 3

18 juin 2018

  • Changement dans la fin des processus (possibilité d'avoir des processus démons)
  • Travail sur les files (suite)
  • Ajout des tests liés au files
  • Lecture des spécifications pour la phase 5
  • Ajout des primitives liées à l'horloge

Nous avons ENFIN compris pourquoi nos tests ne passaient pas... La spec ! Nous avons repris la terminaison de nos processus et la phase 3 est maintenant véritablement terminée. Il ne nous semble pas nécessaire d'être deux sur la phase 4 donc nous lançons la phase 5 en parallèle. Sur cette dernière, l'après midi est dédiée à la lecture car il y a énormément d'éléments complexes à prendre en compte pour passer du noyau à l'utilisateur et vice versa

19 juin 2018

  • Ajout des files implantées
  • Tests de 1 à 17 OK sauf le 13
  • Phase 4 : finie
  • Phase 5 : départ

Les files sont finies et les tests passent presque tous, mais ça a pris la journée. Parallèlement, le début de la phase 5 est lent car nous comprenons petit à petit les interactions user/kernel.

20 juin 2018

  • Correction de la priorité des files
  • Passage de tous les tests phase 4
  • Mode user :
    • Création d'un processus niveau kernel
    • Passage du niveau kernel au niveau user
    • Appel d'une primitive du user vers le kernel
    • Affichage d'un message à partir du user
  • Les tests développés pour le kernel ne passent plus avec l'ajout du mode user (comportement attendu)

Encore une incompréhension des specs pour les files mais ça y est, tous les tests passent. Côté user, c'est génial, on arrive à afficher un message !

21 juin 2018

  • Gestion de la fin des processus user
  • Ajout de toutes les primitives côté user
  • Passage des tests 1 à 18
  • Fin phase 5
  • Début phase 6
  • Gestion des interruptions clavier
  • Affichage du caractère tapé au clavier en direct

La fin de la phase 5 a été expédiée. Nous remercions nos nous du passé d'avoir réalisé les tests côté kernel car tout passe côté user. Nous décidons de paralléliser le passage du test 18 et le début de la phase 6 car le test 18 ne requiert pas d'être deux dessus.

22 juin 2018

  • Fin phase 6
  • Début et fin phase 7
  • Réflexion sur les extensions possibles

La phase 6 et la phase 7 se sont déroulées très rapidement. Tout semble fonctionner, sauf quand on lance les tests de la console. A creuser...

Semaine 4

25 juin 2018

  • Ajout des sémaphore (sans doutes modifications demain)
  • Ajout d'un space invaders
  • Corrections diverses

Quand on donne de la pile, tout va mieux, n'est-ce pas test 7 ? Ceci fait, nous nous sommes mis d'accord sur quelques extensions pour mieux profiter du shell.

26 juin 2018

  • Ajout de différentes commandes
  • Amélioration du space invader

Aujourd'hui, nous avons fini ! Le space invader est satisfaisant. Quelques commandes de plus (sys_info, couleurs...) nous permettent de plus jouer avec le shell. Cependant, c'est vraiment le space invaders qui se frotte le plus aux limites de ce que nous avons codé.

27 juin 2018

  • Soutenance

Sources externes

Source du morpion : https://codes-sources.commentcamarche.net/source/51530-jeux-du-morpion-en-console

Source du space invaders : https://github.com/Chaser324/invaders

Quelques photos

Etrier1.jpg Etrier2.jpg

Etrier3.jpg Etrier4.jpg