Projet système PC : 2019 - GOURDIN Léo, NEYRET Olivier

De Ensiwiki
Aller à : navigation, rechercher
Hephaistos.png
Titre du projet HéphaïstOS
Cadre Projet Système d'Exploitation 2019
Page principale Projet_système


Présentation

Equipe

Journal de bord

Semaine 1 (du 05/06/19 au 07/06/19 -- 3 Jours)

5 juin 2019

Phase 1 :

  • Prise en main de l'environnement de développement, installation des dépendances sur nos laptop, ...
  • Ajout d'un 'splash screen' au démarrage du noyau.
  • Écriture à l'écran :
    • Nous nous sommes inspirés du code réalisé en cours de Logiciel De Base l'année précédente, et nous avons réécrit une version adaptée de 'console_putbytes'.
    • Nous avons créer un fichier de définition des couleurs utilisables à l'écran.

Phase 2 :

  • Démarrage de la phase 2 : Ajout du 'context switch' en assembleur au projet.
  • Début des fonctions de gestion des processus :
    • Structure de donnée (tableau de processus).
    • Allocations mémoire.
    • Lancement de deux processus qui se passent la main.

6 juin 2019

Phase 2:

  • Modification du Makefile pour rendre le projet utilisable avec gcc8.
  • Correction de l'allocation de la stack pour chaque processus.
  • Modification de la structure des processus pour ajouter le père et les fils (filiation).
  • Ajout de la fonction 'getpid'.

7 juin 2019

Phase 2:

  • Ajout d'un traitant d'interruption pour l'horloge (timer).
  • Ajout du scheduler qui change le processus en exécution à une fréquence SCHEDFREQ (à l'aide du timer).
  • Ajout des appels systèmes 'clock_settings' et 'current_clock' pour l'horloge
  • Ajout de l'appel système 'getprio' pour les processus

Semaine 2 (du 11/06/19 au 14/06/19 -- 4 Jours)

11 juin 2019

Phase 3:

  • Gestion de l'ordonnancement par le scheduler

--> Gestion simple, avec l'algorithme du tourniquet

  • Cycle de vie et terminaison des processus
    • Fonction exit
    • Fonction chprio

Phase 4:

  • Fonction wait_clock et état ASLEEP
  • Modifications de l'ordonnanceur

12 juin 2019

Phase 3:

  • Résolution d'un bug dans la valeur de retour d'exit (on ne pouvait pas passer de paramètres)
  • Ajout de l'appel système kill
    • Rendre les enfant orphelins
    • Mettre le processus en ZOMBIE s'il possède un père
    • Tester ces fonctionnalités
  • Modification de l'ordonnanceur pour ajouter une meilleure gestion du tourniquet (on applique le tourniquet sur le processus précédent l'élu et activable avec la même priorité si l'élu n'a pas changé depuis l'IT précédente).
  • Ajout de la gestion des processus endormis dans l'ordonnanceur : il peut les réveiller s'il est l'heure, les laisser "dormir", et activer un processus réveillé si sa priorité le permet.

Phase 4:

  • Ajout de la fonction sleep (basée sur wait_clock)
  • Ajout de l'appel système wait_pid
  • Ajout de tests pour valider le fonctionnement de wait_pid
  • Ajout de la structure de bases (fichiers .c et .h, structures de données) pour les files de messages.

13 juin 2019

Phase 4:

  • Files de messages
    • Ajout de la fonction pcreate dans les files de messages
    • --> Nous utilisons la structure suivante :
      • Un tableau de pointeur sur des structure de files de message
      • Chaque structure de file contient trois queues :
        • Une queue de messages
        • Une queue de processus bloqués en lecture
        • Une queue de processus bloqués en écriture
      • Chaque file a une capacité limité
      • Les queues de processus contiennent une structure de processus spéciale, qui contient :
        • Un pointeur vers la structure de processus kernel
        • Le message (un pointeur sur une structure spéciale qui contient un entier)
      • La queue de messages contient la structure de messages décrite à la ligne précédente
    • Ajout de la fonction pdelete
    • Ajout de la fonction preset
  • Tests
    • La fonction wait_clock prend maintenant l'heure de réveil
    • console.c contient cons_write (pour test.c)
    • Le fichier crt0.S côté kernel contient les "defines" de la version utilisateur
    • start, exit, chprio, wait_pid : correction de bug et vérifications
    • Ajout d'une fonction de rafraîchissement pour chprio dans l'ordonnanceur (il est nécessaire de supprimer puis de ré-ajouter le processus dont la priorité a été modifiée pour le replacer correctement dans la queue.)
    • Ajout d'une variable kernel_ready qui indique lorsque le noyau est prêt à lancer idle
    • Copie de user/test.c dans kernel/

14 juin 2019

Phase 4:

  • Travail sur le test 7 (wait_pid, correction de bugs)
  • Files de messages
    • Ajout des fonctions psend, preceive et pcount
  • Adapter la fonction sleep à wait_clock (sleep recoit le nombre de millisecondes à attendre)
  • Optimisation : ne PAS appeler le contexte switch pour passer d'un processus à lui-même
  • Correction d'une fuite mémoire : lors de certains appels au context switch, notamment après la suppression d'un processus, on ne passait pas le bon tableau de registre et la fonction assembleur débordait, ce qui provoquait des comportements imprévisibles.

Semaine 3 (du 17/06/19 au 22/06/19 -- 6 Jours, samedi inclu)

17 juin 2019

Phase 4:

  • Correction d'un bug sur le test 10
  • Implémentation de la transmission directe de messages en file
  • Passage des tests 11, 12, 13, 14 et 15
  • Ajout de la fonction remove_proc_msg_queue et appel dans kill
  • Blocage sur un bug au test 16 : des processus bloqués se réveillent tout seul

18 juin 2019

Phase 4:

  • Résolution du test 16 : l'ordonnanceur réveillait les processus bloqués et des fuites de mémoires étaient présentes dans les files de messages

19 juin 2019

Phase 4:

  • Vérifications des allocations mémoire dans les files de message

Phase 5:

  • Début de la phase 5 : on commence par passer en mode user
    • Ajout de la fonction asm switch_to_user_mode
    • Modification de la fonction start :
      • Idle ne possède qu'une pile kernel
      • Pour les autres :
      • --> Une pile kernel et une pile user (allouée en zone user), avec les flags, le segment mémoire de code (CS) et le segment mémoire de pile (SS), le pointeur de fonction, la fonction de passage en mode user

20 juin 2019

Phase 5:

  • Ajout du traitant d'interruption 49 (appel système)
  • Ajout d'une fonction init_handler_user_it (pour initialiser un traitant accessible depuis le mode user)
  • Ajout de la fonction assembleur reg_saver_it_49 qui sauvegarde les registres et appel le traitant
  • Réparation d'un bug sur l'allocation de la stack utilisateur (la pile kernel contient l'adresse de la base de la pile user, et on alloue cette dernière avec la fonction user_stack_alloc prévue à cet effet)
  • Modification du Makefile user pour supprimer la wildcard des fichiers assembleurs, et les ajouter à la main (cela permet d'éviter un bug qui place les fonctions assembleur de façon imprévisible dans la mémoire, soulevé par plusieurs personnes)
  • Ajout de la fonction exit en user mode (asm)
    • Positionnement à 0x1000005 dans le fichier kernel.lds
    • Ajout de l'appel système exit (kernel)
    • Ajout des paramètres pour les appels système
    • Ajout de la fonction exit user dans la stack user
    • Modification de crt0.S pour pouvoir lancer la fonction
  • Ajout des fonctions getpid, getprio, chprio, kill, et cons_write en appels système
  • Ajout de la valeur de retour pour le traitant 49
  • Ajout d'un fichier de constantes, qui contient les identifiants des appels système

21 juin 2019

Phase 5:

  • Correction des flags (mode kernel/user) et de la sauvegarde des registres pour les appels système
  • Ajout de l'appel système waitpid
  • Ajout de l'option -no-pie dans les flags ld, sans quoi la mémoire ne se génère pas correctement et les tests ne passent pas en user
  • Ajout de 36 octets dans la stack user pour les sauvegardes de registres
  • Ajout de macro asm pour simplifier les appels système
  • Ajout de tous les appels système liés aux files de messages
  • Ajout des vérifications de sécurité pour le test 18 : on vérifie les intervals de pointeurs dans notre traitant IT 49 (il existe d'autres façons de gérer cela, et notre méthode est discutable)

Phase 6:

  • Début de la gestion clavier
    • Ajout du traitant 33
  • Affichage de la touche frappée (mais crash juste après)

22 juin 2019

Phase 5:

  • Ajout de la fonction getdate, qui rempli une structure de date écrite pour cela
  • Ajout des appels sleep et getdate
  • Affichage de la date dans la bar de statut (et d'une fonction display_top_right)
  • Ajout du splashscreen et de la bar dans la partie user
  • Fin des tests en user
  • Fin phase 5

Semaine 4 (du 24/06/19 au 25/06/19 -- 2 Jours)

24 juin 2019

Phase 6:

  • Correction d'une erreur dans le traitant 33 (erreur de dépilement)
  • Ajout de con_read et cons_echo
  • Fin de la gestion clavier

Phase 7:

  • Ajout d'une fonction shell ps
  • Ajout des fonction set_text_color et set_back_color en appel système
  • Ajout d'une fonction de parsing dans le shell pour récupérer les commandes et arguments

25 juin 2019

Phase 7:

  • Amélioration de la commande shell ps
  • Ajout des couleurs dans la bar de statut
  • Ajout de la reconnaissance de commande shell avec le parseur
  • Amélioration du splashscreen
  • Passage du test 19 (console)
  • Ajout d'un jeu (quizz) Harry Potter qui détermine votre maison (Serpentard, Griffondor, ...)
  • Ajout de la commande exit (reboot)
  • Ajout de la commande sys_info
  • On a ajouté un piano. Il fonctionne avec le haut parleur pc-speaker. Le clavier permet de jouer de la musique sur une octave.
  • On a également ajouté une musique simple au démarrage du noyau.

Phases de développement

Phase 1 : prise en main de l'environnement

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

100 %

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

100 %

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

100 %

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

70 %

Difficultés rencontrées