Projet système PC : 2019 - PASQUINI Stéphane, ROSSO Loïc

De Ensiwiki
Révision de 25 juin 2019 à 20:26 par Pasquins (discussion | contributions) (25 juin 2019)

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)
Aller à : navigation, rechercher
Thanos.png
Titre du projet ThanOS
Cadre Projet système

Équipe Stéphane Pasquini,Loïc Rosso
Encadrants Yves Denneulin , Gregory Mounie, Patrick Reignier


Présentation

L'objectif de ce projet est de développer le noyau d'un système d'exploitation à partir de "presque" rien.

Réalisation des différentes phases du projet

Phase 1 : Prise en main de l'environnement et gestion de l'affichage à l'écran

100 %

Phase 2 : Création et lancement de processus de niveau noyau

100  %

Phase 3 : Ordonnancement, création dynamique et terminaison de processus de niveau noyau

100 %

Phase 4 : Gestion des communications et synchronisation de processus de niveau noyau

80 %

Phase 5 : Séparation des espaces mémoire noyau et utilisateur : gestion de processus utilisateur

0 %

Phase 6 : Gestion du clavier et implémentation d'un pilote de console

60 %

Phase 7 : Implémentation d'un interprète de commandes

0 %

Journal de bord

Semaine 1

05 juin 2019

  • Installation de l'environnement de travail
  • Mise en place de l'affichage à partir du code réalisé en TP de Logiciel de base.

06 juin 2019

  • Correction du code de l'affichage écran
  • Début de la phase 2

07 juin 2019

  • Implémentation du passage d'un processus à l'autre

Semaine 2

11 juin 2019

  • Implémentation du timer et des interruptions pour un système à temps partagé
  • Fin de la phase 2

12 juin 2019

  • Début de phase 3
  • Implémentation du scheduler

13 juin 2019

  • Correction de bugs et finalisation du scheduler.
  • Implémentation de la terminaison

14 juin 2019

  • Implémentation de la filiation
  • Début de la phase 4

Semaine 3

17 juin 2019

  • Mise en place des tests
  • Correction des bugs de la phase 3
  • Poursuite de l'implémentation de la file de messages et de la filiation

18 juin 2019

  • Fin de la phase 3 ( Tests 1 à 9 validés)
  • Correction des bugs de la phase 4

19 juin 2019

  • Début de la phase 5
  • Lecture de la documentation pour la phase 5
  • Poursuite de la validation des test (1 à 12 OK)

20 juin 2019

  • Correction des bugs de la phase 4

21 juin 2019

  • Toujours correction des bugs de la phase 4

Semaine 4

24 juin 2019

  • Ré-implémentation de la phase 4
  • Debut de la phase 6

25 juin 2019

  • Finalisation du projet

Choix techniques

Gestion des processus

Nous avons choisit de stocker l'ensemble des informations d'un processus dans une seule et même structure ; et de stocker l'ensemble dans un tableau statique dont la taille peut être définie à la compilation.


Ordonnancement

L'ordonnancement est gérée à l'aide d'une fonction d'ordonnancement, et, d'une liste doublement chainée gérant les priorités. De ce fait, lorsque nous avons besoin d'ajouter des processus prêts à être ordonnancés, ou bien que nous ne voulons plus qu'ils soient exécutés, il nous suffit d'interagir avec cette liste chainée pour venir retirer ou ajouter les processus en question.

La fonction d'ordonnancement est à la fois appelée par certaines fonctions de synchronisation, nécessitant de passer la main à d'autres processus, mais aussi par l'horloge, qui, de manière régulière, lance cette fonction afin de répartir le temps alloué à des processus de même priorité.

Filiation

La filiation est géré par une file dans chaque structure de processus. En effet, chaque processus peut avoir des fils et connait le pid de son père. La filiation permet d'utiliser l'appel système waitpid qui permet au père de récupérer la valeur de retour du processus fils.

Queue de messages

Cette partie nous a pris énormément de temps. En fait nous avons fait un cumul d'erreur, lié dans un premier temps, à une lecture trop rapide de la spécification. Il est très important de bien lire ce que doivent réaliser les différentes fonction de la file, bien les comprendre avant de se lancer dans l'implémentation.

Ensuite, nous avons fait une autre erreur, celle de vouloir réaliser cette partie à l'aide de liste chaînée "fait maison" alors que le plus simple et le mieux étant de faire un tableau statique de files. Cela facilite grandement le debug par la suite, et limite les fuites mémoires.

Cette partie est mise à l'épreuve par des test pus ou moins complexe qui testent si chacune des fonctions réalisée respecte bien la spec. Nous avons également passé beaucoup de temps à les faire passer, en raison des 2 explications précédentes. Lorsque que les tests ne passent pas ou sont bloqué sur des boucles infinie, il est important de bien regarder et comprendre ce qu'il est censé faire et les affichages attendus ; et d'utiliser GDB pour trouver les problèmes

Gestion clavier

La gestion du clavier fonctionne sur le principe des interruptions, de manière similaire à l'horloge ; on détecte un appui sur une touche du clavier, provoquant l'appel d'un traitant. Pour cela, on écrit une fonction assembleur simple réalisant un appel de fonction C et un acquittement une fois l'interruption traitée.

Pour demande de saisie clavier à l'utilisateur, nous avons utilisé comme outil de synchro, une file de taille 1, réalisée en phase 4, permettant de bloquer un processus demandant une saisie et de le débloquer une fois la saisie réalisée.