Projet système PC : 2018 - PAMART Nicolas, WISNIEWSKI Loïc

De Ensiwiki
Aller à : navigation, rechercher
Ps top.png
Titre du projet Noui
Cadre Projet système

Équipe Nicolas Pamart Loïc Wisniewski
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.

Le résultat de ce projet est-il adpaté pour utiliser sa machine a son plein potentielle ? Noui.

Journal de bord

Semaine 1

07 juin 2018

  • Mise en place de l'environnement de développement.
  • Intégration du code de l'année dernière.
  • Développement du context switch.
  • Début du développement du timer.

08 juin 2018

  • Fin du développement du timer.
  • Ordonnancement.
  • Endormissement.

Semaine 2

11 juin 2018

  • Terminaison (exit à la fin d'une fonction)
  • GDB (Toute la journée)

12 juin 2018

  • Terminaison (exit, kill)
  • Achitecture de tests.

13 juin 2018

  • Wait PID
  • Filiation
  • Top process (joli affichage de l'arbre des process pour debug)

14 juin 2018

  • Fin du passage des tests de la phase 3
  • Début du dévelopement de la file de messages

15 juin 2018

  • Fin du dévelopement des files de messages (phase 4)
  • Début du passage des tests de la phase 4

Semaine 3

18 juin 2018

  • Fin du passage des tests de la phase 4

19 juin 2018

  • Lecture et appropriation des concepts de la phase 5
  • Début de l'implémentation des multiples stack et du passage kernel/user

20 juin 2018

  • Correction d'un test sur les messages (retour sur la phase 4)
  • Fin du dévelopement du passage kernel/stack
  • Début de l'implémentation des appels sytème

21 juin 2018

  • Fin de l'implémentation des appels sytèmes
  • Mise en place de l'exit en fin de process user
  • Passage des tests (et donc quelques corrections de bugs)

22 juin 2018

  • Dévelopement des pilotes clavier
  • Dévelopement du shell
  • Dévelopement de top, ps, print, tetris

Semaine 4

25 juin 2018

  • Correction de bug dans le shell
  • Correction de bug sur le tetris
  • Recherche sur le PC Speaker
  • Test de l'OS sur un vrai PC (pas une VM)

26 juin 2018

  • Résolution d'un bug présent seulement sur un vrai PC (dans la fonction waitpid)
  • Préparation de la soutenance

27 juin 2018

Réalisation des différentes phases

Phase 1

100 %

Phase 2

100 %

Phase 3

100 %

Phase 4

100 %

Phase 5

100 %

Phase 6

100 %

Phase 7

100 %

Choix techniques

Outils

Gestionnaire de version :

  • Git


Nous avons utilisé une configuration très utile de GDB, permettant d'afficher la pile, l'instruction couramment pointée par EIP, et l'état des différents registres. Cette configuration nous a été très utile pour la partie 5. Voici un lien pour la récupérer: https://gist.githubusercontent.com/CocoaBeans/1879270/raw/c6972d5c32e38e9f35a3968c629b51973bd9d016/gdbinit

Quelques variables de configuration sont à changer au début du fichier (Activer le mode 32 bits et l'affichage de l'instruction courante).


Lors du dévelopement, seules les librairies fournies avec le projet ont été utilisées. La librairie de queue à été beaucoup utilisée.

Implémentation et conseils

Processus

La gestion des processus est la première partie de ce projet, les choix techniques de cette partie ont été très structurant pour la suite. Pour la gestion de la file des processus, nous avons utilisé la queue, très utilie pour récupérer le processus le plus prioritaire. De plus, nous avons choisi d'exclure le processus élu de cette liste, afin de n'avoir que les processus en attente dans la liste des processus, nous gardons un emplacement particulier pour le processus élu.

L'implémentation des fils à été faite avec une queue dans chaque processus, représentant sa liste d'enfants. Lorsqu'un processus est tué, il peut ainsi regarder si des processus zombie sont à détruire.

La terminaison des processus doit être faite avec attention, nous sommes tombés dans le piège de supprimer la pile en cours d'exécution. Lorsqu'un processus se tue, il ne faut le libérer qu'une fois le context switch suivant effectué, en sauvegardant un état qui indique si un processus est à effacer de la mémoire ou pas. Cette technique de suppression ne doit pas être utilisé lors de la suppression de processus fils en cas de waitpid. Si c'est le cas, les processus fils tué ne seront nettoyé qu'après le passage du scheduler, il faut donc les supprimer immédiatement.

File de messages

Les files de messages ont été aussi implémentées grâce aux queues. Une queue pour les messages, une pour les processus en attente d'écriture et une pour les processus en attente de lecture. Pour l'implémentation des files de messages, il est très important de bien comprendre le test 13, comprendre l'importance de la notion d'un processus bloqué en attente de dépot de message. Nous sommes tombés dans le piège suivant: Un processus de priorité faible se débloque pour passer son message, mais ne rends pas la main a un processus de priorité plus forte une fois que son message à été envoyé. Il faut aussi prendre un compte que lors d'un preceive, si des processus sont bloqués en attente de dépot de message, il faut débloquer le plus prioritaire de ceux là et ne pas redonner là main au processus le plus prioritaire sans message à envoyer.

Séparation user/kernel

Cette partie délicate nécessite une bonne compréhension du sujet, n'hésitez pas à passer du temps à lire la documentation. Ce pdf (https://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.html) page 205, nous a beaucoup aidé pour comprendre comment initialiser la pile kernel pour que l'instruction iret fonctionne correctement. Bien que cette phase soit expliquée sur la page des aspect techniques, le schéma aide beaucoup. Pour l'implémentation des appels système, nous avons profité du système de macro en assembleur pour rapidement les implémenter (cf user/crt0.S pour l'utilisation des macros en ASM). L'implémentation de l'instruction exit automatique en fin de fonction a été délicat, il est nécessaire de connaitre l'emplacement de la fonction exit côté user alors que nous nous trouvons du côté kernel lors de l'initialisation de la pile user. Nous avons utilisé l'instruction .weak fixant l'emplacement de la fonction dans le .text du programme, mais d'autres techniques plus adaptées peuvent être utilisées.

Clavier et console

Nous avons implémenté la console avec une liste reliant un chaine de caractère à un pointeur sur fonction. En fonction de la chaine entrée par l'utilisateur, une fonction différente est lancée grâce à l'appel système start. Les commandes disponibles sont nombreuses et variées: top, ps, print, tetris, msgstate, test. Tetris à été dévelopé en plus, pour tester différents appels systèmes (et pour s'amuser).

Extension

Nous avons développé la possibilité d'utiliser le PC Speaker avec l'appel système beep. Nous nous sommes grandement inspiré de cette page: https://wiki.osdev.org/PC_Speaker (Attetion, la fonction outb est inversée sur cette page, la plus grande difficulté de cette implémentation). Nous avons récupérer la musique de tetris à cette adresse https://gist.github.com/XeeX/6220067

Jolies photos

Pw test.png Ps top.png Pl tetris.png Pl start.png