Projet système PC : 2015 - BENAZIZ Faycal, PONCET Alexis, ROVAYAZ Thomas

De Ensiwiki
Aller à : navigation, rechercher
SOSsisson.jpg
Titre du projet sOSsisson
Cadre Projet système d'exploitation 2015

Équipe Fayçal Benaziz
Alexis Poncet
Thomas Rovayaz
Encadrants David Beniamine
Gaëtan Morin
Grégory Mounié


Présentation générale

L'objectif principal du projet système est le développement d'un mini système d'exploitation. Ce projet s'inscrit dans la continuité des cours de Logiciel de Base vus en première année d'apprentissage ensimag et permet d'aborder les concepts vus en cours de Système d'Exploitation et Programmation Concurrente durant la seconde année à l'ensimag.

Le projet se décompose en sept étapes obligatoires, avec éventuellement des extensions.

Cahier des Charges

Déroulement du projet

Diagramme de Gantt

System Project.png

A l'exception de la phase 2, le diagramme de Gantt est conforme aux points bloquants du projet, à savoir réussir à faire passer tous les tests en mode noyau (les 18 tests possibles en fin de Phase 4) et l'ajout du mode utilisateur (Phase 5).

Choix techniques

IDE :

  • CLion : Environnement de développement intégré permettant d'augmenter la productivité. Il permet entre autre l'auto-complétion, la génération partielle de code, l'intégration de Git.

Gestionnaire de version :

  • Git : Gestionnaire de version imposé par l'Ensimag.

Résultats

SOSisson.png

Phase 1

Objectifs :

 - Prise en main de l'environnement de développement (chargement et débogage de noyau) ; 
 - Gestion de l'affichage à l'écran.


Réalisation :

Nous avons transposé ce que l'on a vu l'année dernière en TP de logiciel de base dans notre OS : sOSsisson.
Il n'y a donc pas eu de difficultés particulières.


Complexité :

10 %


Implementation :

100 %

Phase 2

Objectifs :

 - Comprendre la notion de processus ;
 - Changement de contexte entre deux processus (au niveau noyau).


Réalisation :

Il a fallu comprendre comment switcher d'un processus à l'autre, ainsi que tout ce que cela engendre (sauvegardes des registres, etc...). Très peu de difficultés là aussi.


Complexité :

30 %


Implementation :

100 %

Phase 3

Objectifs :

 - Gestion de l'ordonnancement ;
 - Création dynamique de processus ;
 - Terminaison de processus ;
 - Filiation de processus.


Réalisation :

La phase 3 fut l'une des phases les plus longue en programmation, mais passable en terme de complexité.
Il a fallu lire beaucoup de documentation avant de pouvoir implémenter correctement les processus.


Complexité :

60 %


Implementation :

100 %

Phase 4

Objectifs :

 - Gestion de la communication par l'intermédiaire de file de message ;
 - Endormissement de processus.


Réalisation :

La phase 4 comportait beaucoup de documentation mais manquait parfois de certains points cruciaux, qui nous aurait fait gagner du temps sur les tests. A noter justement l'apparition des tests des enseignants lors de cette phase.


Complexité :

70 %

Implementation :

100 %

Tests :

100 %
(18/18)

Phase 5

Objectifs :

 - Séparation des espaces mémoires noyau et utilisateur ;
 - Ajout du mode utilisateur.


Réalisation :

La phase 5 est la phase clé du projet.
On entre vraiment dans le vif du sujet avec l'apparition des niveaux de privilège (0 pour le noyau et 3 pour l'utilisateur). C'est tout simplement la phase la plus difficile du projet, tant bien au niveau de la compréhension des spécifications, que de l'implémentation en elle-même.


Complexité :

100 %

Implementation :

100 %

Tests :

100 %

(19/19)

Phase 6

Objectifs :

 - Développement d'un driver console.


Réalisation :

Une fois arrivée à la phase 6, vous avez compris le principe des interruptions. Le reste n'est que formalité.


Complexité :

25 %


Implementation :

100 %

Tests :

100 %

(20/20)

Phase 7

Objectifs :

 - Développement d'un shell.


Réalisation :

C'est à cette phase que l'on personnalise son shell ! C'est la phase la plus amusante du projet. Have fun !


Complexité :

30 %


Implementation :

100 %

Tests :

100 %

(20/20)

Extensions

Objectifs :

 - Ajout de fonctionnalités : Snake.


Réalisation : Snake.pngSnake2.png "Now !"


Implementation :

100 %

Difficultés rencontrées

Notre principale difficulté fut l'acquisition de la partie utilisateur lors de la phase 5. En effet, nous avions commencé par effectuer le traitant d'interruption 49 avant le passage en mode user. Une fois que le traitant était validé par l'équipe (sauvegarde des registres, appel système, restauration des registres), nous nous sommes concentré sur le passage en mode User.
C'est à partir de là que les choses se compliquent. Il est nécessaire de lire le plus de documentation possible et surtout bien comprendre pourquoi est-ce que chaque processus a besoin de deux piles (une kernel dans laquelle nous retrouvons SS, ESP [pointeur de pile du processus], EFLAGS, CS et EIP [adresse du début de code du processus] et une user) et comment est-ce qu'elles sont utilisées par la TSS !
Par étape  :

- Initialiser vos piles avec les bonnes valeurs ! (et regarder vraiment les valeurs des registres dans le blue screen).
- Initialiser correctement votre traitant 49.
- N'oubliez pas de simuler une interruption (iret) à la création de chaque processus pour mettre le processus en mode User.
- A chaque interruption, repasser le processus en mode Kernel (DS, ES, FS, GS à 0x4b).
- Au retour de l'interruption, repasser le processus en mode User (DS, ES, FS, GS à 0x10).
- Dans le contexte switch, ainsi qu'au lancement du premier processus, mettez à jour la TSS (ESP0).

Vous allez sans doute rire mais nous avons mis deux jours à débuguer ce passage en mode User alors que c'était uniquement l'initialisation du traitant d'interruption 49 (fait quelques jours auparavant) qui ne fonctionnait pas et nous affichait donc un joli blue screen (error code : 0x18A) ! Donc initialiser bien votre traitant 49 !

Commandes disponibles dans le shell

Commande Description

exit

Permet de quitter le shell.

help

Affiche les commandes disponibles avec leurs descriptions.

kill <pid>

Permet de tuer le processus ayant pour pid le numéro passé en paramètre.

ps

Permet d'afficher la liste des processus vivants (non zombie) avec les dépendances entre père et fils.

sleep <nb>

Permet lancer un processus sleep qui attend nb secondes.

snake ou s

Permet de jouer au snake avec les touches q (gauche), s (bas), d (droite) et z (haut).

sOSisson

Permet d'afficher les informations sur le système (Processus, états des files de messages).

test [<numero test>]* ou t [<numero test>]*

Permet de lancer tous les tests (sans argument) ou de lancer les tests en mettant le numéro des tests en argument (ex : test 1 2).

uptime

Affiche le nombre d'interruptions depuis le lancement.

Toutes les commandes peuvent être lancées en background hormis le snake. Pour cela, il faut mettre un "&" à la fin de la commande.

Pour aller plus loin

- Implémentation de la mémoire virtuelle ;
- Implémentation d'un système de fichier ;
- Implémentation des commandes bash des systèmes de fichier ;
- Implémentation d'un solitaire, démineur, puissance 4, etc....