Projet système PC : 2017 - Quentin de Longraye, Victor Le, Mathieu Porcel

De Ensiwiki
Aller à : navigation, rechercher


SohOS.png
Titre du projet Projet système
Cadre Ensimag

Équipe Victor Le Mathieu Porcel Quentin de Longraye
Encadrants François Broquedis , Gregory Mounié, Patrick Reignier
Sohos shell demo os.gif

Plannings prévisonnel et effectif

Le planning prévisionnel prévoyait le découpage suivant :

  • Étape 1 sur une journée
  • Étape 2 sur deux à trois jours
  • Étape 3 sur deux à trois jours
  • Étape 4 sur deux à trois jours
  • Étape 5 sur trois à quatre jours
  • Étape 6 et 7 sur deux à trois jours
  • Extensions sur le reste du temps disponible

Il était difficile de faire une estimation précise étant donné que nous n'avions pas déjà eu l'occasion de développer un système d'exploitation. Il nous semblait cependant raisonnable de prévoir un début de l'étape 5 aux alentours du 19 juin (soit le début de la seconde semaine complète).

Nous avons cependant perdu du temps sur l'étape 4, qui nous a fait commencer l'étape 5 un jour plus tard que prévu. L'étape 5 a quand à elle duré un peu plus longtemps que prévu (quatre jours pleins venant s'ajouter à une étape 4 un peu trop longue ainsi qu'une étape 3 ralentie par des problème de gestion de la mémoire).

La conséquence directe a été de légèrement changer nos objectifs d'extensions. Si la stack réseau restait notre objectif, nous avons choisi de développer le système de sémaphores en amont pour tester le système dans diverses configuration et s'assurer de sa stabilité.

Phase 1 : Prise en main de l'environnement

100 %

La première étape a été réalisée sans encombres et conformément au planning prévisonnel.

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

100 %

L'étape 2 s'est également bien passée, nous avons cependant en parallèle de la phase 3 réécrit l'ordonnanceur en utilisant le système de liste FIFO 'queue.h' fourni.

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

100 %

Cette étape nous a retardé, nous avons perdu une journée sur des problèmes liés à la gestion de la mémoire (problèmes d'allocation liées à des erreurs d'utilisation de notre part et des problèmes de versions de compilateurs GCC).

Phase 4 : Files de messages et wait clock

100 %

Le système de files de messages a été réécrit intégralement après un premier essai peu concluant, nous avons en effet eu quelques difficultés à comprendre le fonctionnement décrit par les spécifications (en écrivant une implémentation producteurs / consommateurs au sens strict du terme alors que l'approche aurait plutôt dû être de se concentrer sur l'intérêt des files de messages en tant que buffer).

Phase 5 : Séparation du noyau et de l'application

100 %

Cette étape a été retardée par quelques problèmes d'inattention au niveau de la syntaxe du code ASM (en particulier l'oubli d'un '$' qui aura coûté plus d'une journée de recherche).

Phase 6 : Console

100 %

Cette phase s'est déroulée conformément au planning prévu, sans difficulté importante.

Phase 7 : Interprète de commandes

100 %

Cette phase s'est déroulée conformément au planning prévu, sans difficulté importante.

Extensions

  • Sémaphores
    100 %
  • Listage PCI
    100 %
  • Stack réseau
    5 %

Compte tenu des difficultés rencontrées lors du développement, nous avons rapidement travaillé sur le système de sémaphores afin de tester notre système et de s'assurer de sa stabilité.

Le travail sur la stack réseau a été découpé en deux étapes : la réalisation d'un outil de listing des drivers puis le début du travail de communication avec la carte réseau.

Complément aux spécifications

Les appels système suivants ont été ajoutés :

  • void ps(void) affiche la liste des processus en cours d'exécution
  • void reboot(void) permet de redémarrer la machine
  • void date(void) affiche la date courante
  • void uptime(void) affiche depuis combien de seconds le système tourne
  • void list_pci(void) affiche la liste des cartes PCI du système
  • void sys_info(void) affiche le nom du système d'exploitation ainsi que l'état du système (nombre de processus par état, nombre de page faults recensées, ...) ainsi que l'arbre des processus en vie
  • void processes_tree(void) affiche l'arbre des processus en vie
  • void change_color(color_t new_color, bool fg) change la couleur de l'affichage

Ont également été implémentés tous les appels systèmes liés aux sémaphores.

Journal de bord

08/06/2017

Nous avons commencé par parcourir la documentation pour initialiser nos environnements, mettre en place un clone du dépôt Git sur notre instance personnelle de GitLab (qui nous permettra de mettre en place des outils d'intégration continue rapidement sur le projet). Les IDEs utilisés sont CLion et Eclipse.

Nous avons également mis en place des scripts pour simplifier le lancement des outils de débug, de test, ...

L'après-midi, nous avons travaillé et terminé la phase 1 et réalisé nos premiers affichage, puis commencé la phase 2. Nous avons également mis en place la bibliothèque libcheck pour pouvoir réaliser des tests unitaires de fonctions isolées et mis en place de l'intégration continue avec Docker.

09/06/2017

Nous avons débuggé le scheduler le matin et ajouté une deuxième étape à notre intégration continue pour réaliser des tests fonctionnels automatisés utilisant GDB.

Nous avons en parallèle ajouté le support des priorités dans l'ordonnanceur.

12/06/2017

Nous avons ajouté le support de la fonction start, mis en place une liste chainée faite maison pour le stockage des processus et implémenté le timer pour récupérer le temps écoulé depuis le lancement de la machine.

13/06/2017

Nous avons ajouté l'implémentation des fonctions permettant de gérer la filiation entre les processus, puis commencé à écrire des tests pour valider l'avancement. Nous avons également été confrontés à des problèmes importants avec la fonction mem_alloc et un comportement aléatoire de notre système d'exploitation suivant la machine et la version du compilateur utilisé. Pour pouvoir continuer d'avancer, nous avons temporairement changé la stack des processus pour qu'elle soit statique.

14/06/2017

Nous avons réécrit notre système de tests pour pouvoir récupérer la trace d'exécution et vérifier automatiquement le bon fonctionnement des tests. Nous avons modifié l'image Docker pour reproduire l'installation des machines de l'Ensimag et s'assurer que les tests passent sur toutes les machines. Les tests sont lancés en intégration continue sur notre serveur GitLab.

Nous avons également commencé à travailler sur l'étape 4.

15/06/2017

Nous avons consacré la majeure partie de la journée à tester et à débugger le projet, en important les tests du fichier test.c. L'étape 4 est toujours en cours de débuggage à la fin de la journée.

16/06/2017

Fin du débuggage de la veille, les message queues ne fonctionnent toujours pas comme prévu. Pour préparer l'étape 5, le code du kernel est revu pour utiliser exclusivement des processus (en particulier, tous les appels à sti sont supprimés). Le code a été nettoyé et reconstruit par endroit, en particulier l'ordonnanceur qui a été en grande partie réécrit en utilisant le fichier queue.c fourni, permettant de gagner en lisibilité sur le code. Ajout d'une commande pour pouvoir visualiser l'arbre des processus en cours pour pouvoir affiner les débugages et les tests. Mise en place de programmation défensive pour sécuriser et simplifier le débuggage de certaines parties critiques du kernel.

19/06/2017

Début de la réécriture complète de système des message queues qui est devenu trop complexe à débugger. En parralèle, prise de connaissance de l'étape 5 et des ressources utiles pour le développement. Ajout de premiers tests pour les syscall.

20/06/2017

Nous avons travaillé sur la gestion des appels système et commencé à implémenter la double pile. Le travail sur les message queues a été terminé et tous les tests fournis avec le projet passent désormais.

21/06/2017

Nous avons avancé le développement de l'étape 5 en travaillant tous ensemble. Le système de tests a également été amélioré pour faire tourner les tests en usermode et en kernelmode. Ajout d'un appel système "Processes tree" pour pouvoir afficher la liste des processus côté utilisateur (en attendant sysinfo).

22/06/2017

Nous avons travaillé à débugger le travail de la veille sur l'étape 5, et corrigé les interruptions coté utilisateur.

23/06/2017

Finalisation de l'étape 5 : débuggage des tests en mode utilisateur, amélioration de la gestion de la mémoire.

26/06/2017

Réalisation des étapes 6 et 7. En fin de journée, le projet fonctionne correctement et semble stable, et tous les tests passent. La fin de la journée est en partie dédiée à la réalisation de l'extension sur les sémaphores. Le shell est enrichi en fonctionnalités en parallèle (historique, gestion des arguements pour les commandes, ...).

27/06/2017

Réalisation de deux extensions : finalisation de l'extension sur les sémaphores et début du travail sur la gestion de la stack réseau. Pour cela, nous avons commencé par développer une extension permettant de lister les périphériques PCI du système.

Ressources complémentaires

En dehors de l'Ensiwiki, nous avons beaucoup utilisé le Wiki OSDev.