Projet système PC : 2018 - JEANJEAN Théo, BARBIER Etienne

De Ensiwiki
Aller à : navigation, rechercher
BabOS.jpg
Titre du projet BabOS
Cadre Projet système

Équipe Théo Jeanjean Etienne Barbier
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 et réel

Gantt BabOs.png


Nous n'avons pas proportionné les phases 4 et 5. Elles ont pris beaucoup plus de temps que prévu. Nous n'avons donc pas pu aller au bout du projet.

Journal de bord

Semaine 1

Les deux premiers jours nous nous sommes familiarisé avec l’environnement, avons implémenté l'affichage et débuté la phase 2.

07 juin 2018

Prise en main du sujet la matinée (mettre en place l'environnement, gérer le print). Après-midi détente pour décompresser après les partiels, profiter de la vie dans les hamacs dans un monde en paix, beau et rempli d'amour.

08 juin 2018

Le matin, reprise du code de Logiciel de base pour intégrer le timer et afficher l'heure. Ensuite, test des interruptions puis mise en place du context-switch. Phase 2 presque terminée.

Semaine 2

11 juin 2018

  • Fin de la phase 2 avec appel de l'ordonnancement à une certaine fréquence
  • Attente de la fin de développement du cycle de vie d'un processus pour pouvoir tester toute cette phase

12 juin 2018

Débogage de la terminaison de processus. L'ordonnancement ainsi que la terminaison du processus fonctionne (fonction exit bien appelée). Il manque encore la filiation & le résultat (retour) d'un processus terminé.

13 juin 2018

  • Fin de la filiation
  • Création d'une macro de recherche générique dans le fichier "queue.h"
  • Début de mise en place du fichier de tests fournis, Tests 1 à 8 sans compter le 7 qui sera pour la phase 4

14 juin 2018

  • Début et fin de waitpid
  • Début de l'écriture des signatures de fonctions de la phase 4
  • Une fois waitpid fini, on repasse sur les tests
  • En fin de journée, les tests 1 et 2 passent

15 juin 2018

  • Les tests 1 à 5 fonctionnent, plus le test 8
  • Le test 6 bloque encore en fin de journée
  • Phase 3 quasiment terminée, début de phase 4 en parallèle avec fin phase 3

Semaine 3

18 juin 2018

  • Les tests de 1 à 10 passent.
  • Implémentation de wait_clock.
  • Implémentation partielle des files

19 juin 2018

  • Tous les tests passent sauf le 13 et 14.
  • Correction bugs ordonnance

20 juin 2018

  • Corrections de bugs divers et varié sur l'affectation des PID, la suppression des processus.
  • Les tests de 1 à 17 fonctionnent.

21 juin 2018

  • Début de lecture de la doc pour la phase 5

22 juin 2018

  • On continue de lire la doc pour la phase 5, on se perd...
  • Meilleure compréhension des concepts mais toujours incomplète

Semaine 4

25 juin 2018

  • Début du développement de la phase 5
  • On commence par la séparation de la stack user & kernel
  • En parallèle:
    • développement du traitant pour les interruptions
    • Switch du mode utilisateur au mode kernel & inverse
  • Passage au mode user fonctionnel en fin de journée

26 juin 2018

  • Lancement des tests côté user
  • Correction des différents bugs liés à des oublis bêtes
  • Passage des tests 1 à 5 la matinée, 6 à 16 l'après-midi
  • Petites erreurs bêtes à ne pas refaire:
    • mettre iret dans les syscall côté user à la place de ret
    • Ne pas mettre autant de pop que de push (corruption de la pile)
    • Mauvais caractère de commentaire en assembleur qui ne commente rien


27 juin 2018

  • Soutenance

Réalisation des différentes phases

Phase 1

100 %

Phase pour prendre en mains le projet et reprendre les acquis qu cours de logiciel de base (Affichage de caractères)

Phase 2

100 %

Phase consacré à la gestion des processus et aux interruptions horloge. Elle n'a pas posé de problèmes particulier.

Phase 3

100 %

Cette phase est consacré à l'ordonnancement, la terminaison et la filiation des processus. Attention à bien gérer la terminaison, c'est elle qui nous a posé le plus de problème.

Phase 4

100 %

C'est phase c'est avéré beaucoup plus longue que prévu. Nous avons passé peu de temps pour faire quelque chose de fonctionnel. Cependant, cette rapidité a été à notre désavantage au moment de faire passer les tests. Nous avons passé beaucoup de temps à debuguer cette partie. Il manquait toutes les petites vérification pour chaque appels systèmes, des chose que notre propre jeu de test de permettait pas de déceler.

Phase 5

92 %

La Phase 5 n'est pas totalement terminé. Les tests 17 & 18 donnés par les professeurs de passent actuellement pas.

Phase 6

0 %

Par manque de temps, nous n'avons pas commencé la phase 6.

Phase 7

0 %

Par manque de temps, nous n'avons pas commencé la phase 7.

Choix techniques

IDE :

  • Atom

Gestionnaires de version :

  • Git

Dans le code

Gestion des processus

Une file circulaire trié par priorité donné dans le projet (queue.h).

Filiation des processus

Une file circulaire également.

Attribution des pids

Stockage des pids jeté par les processus terminé et utilisation de ceux-ci pour la création. Si il n'y a pas de pids périmé disponible utiliser: max(pid) + 1

Interruptions horloge

Endormissement

Création d'un état SLEEPING pour les processus. A chaque ordonnancement, on regarde si un endormi doit se réveiller, si oui, on le réveil.

Appels systèmes depuis le mode utilisateur

Création d'une librairie en langage d'assemblage. Cette librairie d'appels systèmes permet de lever une interruption avec les bons paramètres. Attention à ne pas oublier la sauvegarde et la restauration des registres utilisés car le passage de paramètre à l’interruption se fait par les registres.

Interruptions pour les appels systèmes dans le mode kernel

Initialisation du nouveau traitant d’interruption. Le traitant, écrit en langage d'assemblage récupère les paramètres donné par la librairie d'appels systèmes et appel les fonctions kernels correspondantes.

File de message

Tableau statique pointeurs sur des files de messages car le nombre maximum de files est fixe. Les structures de files sont dynamiques et le tableau de messages est aussi dynamique. Tableau d'entiers (circulaire) avec indice de lecture/écriture (producteur/consommateur) et gestion du blocage recv/send dans la gestion des processus (couplage avec les fonctions d'ordonnancement)

Protection mémoire & exécution

Pas le temps de vérifier la protection, le test18 sur les accès interdits n'est pas validé.