Projet système PC : 2018 - DUSSERT Cyril, LEMAIRE Samuel

De Ensiwiki
Aller à : navigation, rechercher
Project schedule.png
Titre du projet HippopotomonstrOSesquippedaliophobique
Cadre Projet système

Équipe Cyril Dussert Samuel Lemaire
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.

planning prévisionnel

Reel.png

planning réel

Effectif.png

Dans la réalité nous avons mis un peu plus de temps que prévu sur la phase 3 et la phase 5 nous a posé de nombreux soucis.

Journal de bord

Semaine 1

Prise en mais du projet, réalisation de la phase 1 et prise en main pour la phase 2.

07 juin 2018

Installation de l’environnement de travail sur le poste de Cyril, et prise en main des différents éléments du projet. Mise en place du printf et ajout de l'horloge.

08 juin 2018

Mise en place d'un dossier de test pour valider la phase 1. Mise en place de la gestion des processus, avec un ordonnanceur. Les processus sont dorénavant interrompus par l'horloge pour laisser la main au suivant. Tests effectuées sur l’ordonnancement des processus.

Semaine 2

Réalisation de la phase 3 et test intensifs sur les processus.

11 juin 2018

Mise en place de l'ordonnancement tourniquet avec priorité en utilisant la liste chainée fournit dans queue.h. Création des primitives start, getpid, getprio et chprio. Première version de kill faite mais puisqu’elle ne correspond pas à la documentation une réflexion à été entamée pour pouvoir faire les fonction kill et exit rapidement.

Création d'une fonction sleep : il reste donc à modifier l’ordonnanceur pour qu'il prenne en considération les processus endormis. La fréquence de l’ordonnancement est désormais paramétrable.


12 juin 2018

Ajout de la filiation entre les processus. Désormais un processus a un père, ainsi qu'éventuellement plusieurs fils. Gestion de l'endormissement des processus avec le traitant d'interruption. Nous pouvons aussi tuer des processus, ainsi que les faire s'arrêter de manière propre (avec exit).

Nous avons apporté des corrections sur la création des processus, en particulier sur le calcul de la taille de la pile. Nous avons ajouté un test prenant en compte le changement de priorité, la destruction de certains processus... Il faudra rajouter des tests sur la filiation, une fois que le waitpid sera terminé (c'est en très bonne voie :))


13 juin 2018

Diverses corrections des primitives de la phase 3. Nous avons aussi travaillé sur la création de fonction d'affichage des processus en cours d'exécution ainsi que leurs fils.

La seconde partie de la journée était plutôt consacrée à lancer les tests proposés côté user, et corriger les erreurs soulevées par ces tests.

14 juin 2018

Correction de la grande majorité des bugs de la phase 3. Nous utilisons les tests fournis que nous avons adapté à la partie kernel en les lançant comme des processus. A ce jour, les 5 premiers tests passent et nous avons une erreur sur le 6 eme.


15 juin 2018

Nous avons travaillé sur les test 6 et 8. En réussissant finalement à faire passer tous les tests. Puis nous avons commencé la phase 4 en faisant passer le test 7 sur le waitclock(). Nous avons entamé la gestion des files de messages, en réfléchissant sur un bonne façon de les implémenter. Notamment la gestion du blocage des processus.

Nous avons revu notre code sur différentes fonctions pour en améliorer la lisibilité et commenter l'essentiel, pour êtr sur d'avoir une base relativement stable avant d’entamer la suite.

Semaine 3

18 juin 2018

Cette journée était consacrée exclusivement à la phase 4 et au test de cette phase. A la fin de la journée, deux tests sont en cours d'étude, un autre nous paraît un peu ambigu, même quand on le déroule à la main. Le code de la phase 4 est quant à lui terminé, seules quelques corrections mineures sont encore nécessaires.

19 juin 2018

En milieu de journée : Il s'est finalement avéré que, afin de passer les tests, et coller plus à la spécification technique, nous avons du revoir une partie de notre implantation des files de messages. Il nous reste une difficulté sur l'un des tests, qui va nécessiter aussi une adaptation de notre implantation. Une fois ce test passé, nous pourrons commencer à réfléchir à la phase 5

Fin de journée : La phase 4 est officiellement terminée, nous commençons à réfléchir à la phase 5, c'est parti !

20 juin 2018

Cette journée était principalement consacrée à la lecture de l'obscure documentation sur la phase 5... Rien de bien intéressant s'est passé...

21 juin 2018

Découverte de nouvelles sources intéressantes pour la documentation, mais rien de bien concrétisé d'un point de vue du code..

22 juin 2018

Nous avons commencé à adapter la structure des processus, avec deux pile d'exécution, mais de nombreuses erreurs sont encore présentes, nous avançons à tâtons..

Semaine 4

25 juin 2018

ENFIN ! Nous avons réussi à faire un appel système depuis le mode user, pour afficher des caractères... Nous avons, dans le même temps défini le nom de notre OS : HippopotomonstrOSesquippedaliophobique

26 juin 2018

La matinée fut consacrée essentiellement à faire passer les tests côté user. Nous avons eu quelques petites modifications mineures à effectuer pour que les tests passent. Dans l'après-midi, nous nous sommes concentré sur la phase 6. La clé de cette phase se trouve ici : C'est un PDF magique

Réalisation des différentes phases

Phase 1

100 %
Terminée le 08 juin 2018

Le but de cette phase est de prendre en main l'ensemble du projet et d'ajouter les fonctions d'affichage pour pouvoir tester et gérer toute la suite du projet.

Phase 2

100 %
Terminée le 08 juin 2018

Cette phase permet de lancer la gestion des processus et des interruptions d'horloge.

Phase 3

100 %
Terminée le 15 juin 2018

La phase 3 a consisté en la création et l’ordonnancement des processus. Il a fallut créer les primitives nécessaires à leur création, destruction et gestion de façon dynamique.

Le soucis que nous avons eu sur cette phase à été de faire passer tous les tests fournis dans les fichiers donnés, notamment le tests 6 car nous faisions des printf pour tracer nos erreurs.

Suite à ça, les tests 1 à 6 et le test 8 passent sans soucis sur la base de code faite.

Phase 4

100 %
Terminée le 20 juin 2018

Cette phase consiste en la gestion du waitclock, qui se fait de façon relativement triviale.

Elle consiste aussi en l'implantation d'un système de files de messages entre processus, qui correspond à un début de synchronisation entre plusieurs processus. Le plus délicat à gérer est la gestion des processus bloqués sur les files, il est possible d'utiliser une seule liste de processus bloqués par file (sur file vide, ou pleine), mais cela requiert un peu plus de rigueur...

Petits conseils d'implantation :

  • Concernant la liste des messages d'une file, vous penserez peut-être (comme nous) à utiliser une liste chaînée pour créer le système FIFO des messages. Seulement, avec cette technique, il est difficile de garantir en tout temps que la capacité d'accueil de la file de messages sera disponible. Le plus simple est d'utiliser un bête tableau circulaire.
  • Pour bien comprendre les différentes interactions entre les processus, étudiez attentivement le test 13, nous avons pensé qu'il était cassé (même en le déroulant à la main), avant de comprendre le fonctionnement.

Phase 5

100 %
Terminée le 26 juin 2018

Cette phase est la phase la plus délicate du projet... Elle nécessite une lecture attentive de nombreuses sources de documentation (y compris les wikis des années précédentes)... Il est aisé de voir, plus ou moins ce qui se passe au sein de l'OS lors du changement de mode, mais le retranscrire en code est une autre paire de manches...

Il nous a fallu plusieurs jours avant de commencer à écrire du code et nous avons du utiliser les compétences de nos aimables camarades pour débloquer la situation au dernier moment.

Petit conseil : N'abandonnez pas, la solution est souvent plus proche qu'on ne le pense ! N'hésitez pas à mutualiser vos connaissances avec les groupes alentours pour avancer.

Phase 6

100 %

Terminée le 26 juin 2018

Lors de cette phase, nous avons eu à créer une nouvelle interruption pour gérer les entrées clavier. Il a aussi fallu gérer un nouvel état des processus : Bloqué sur entrée/sortie. Nous n'avons pas eu de difficulté supplémentaire, si ce n'est que nous avons eu à modifier l'appel à cons_read au sein des tests car la signature n'était pas la même que dans la spécification.

Phase 7

0 %

Choix techniques

Usage de git

IDE : Clion, ainsi que l'éditeur Sublime Text

Pour gérer la liste des fils, nous avons utilisé une liste chainée simple crée par Troy D. Hanson, en licence BSD, opensource. il nous a seulement fallu modifier le include pour qu'il appelle les assert du projet.

Nous utilisons pour les autres listes de processus, la liste fournie par le fichier queue.h.

Nous avons aussi utilisé, sur conseil de collègues, une config de GDB bien pratique, disponible ici : https://gist.githubusercontent.com/CocoaBeans/1879270/raw/c6972d5c32e38e9f35a3968c629b51973bd9d016/gdbinit Il faudra adapter un petit peu votre setup pour la faire tourner, mais ça se scripte assez facilement.