Projet système PC : 2016 - DADOUA Maxime, PLOUVIER DEMETS Jules-Eugène, THIOLLIERE Guillaume

De Ensiwiki
Aller à : navigation, rechercher
PonchOS
Tux cholito peru.jpg
Projet Système 2016

Développeurs Maxime Dadoua

Jules-Eugène Plouvier Demets
Guillaume Thiolliere


Présentation générale

Objectifs

L'objectif du projet système est de réaliser un noyau de système d'exploitation sur l'architecture Intel IA32 permettant l'exécution de programmes applicatifs simples. Les applications sont écrites en termes de processus parallèles se partageant le temps d'exécution sur le processeur avec des priorités différentes. Le noyau est bien sûr très petit, mais cependant réaliste car il offre un ensemble de services permettant d'exécuter des programmes significatifs.

Le cahier des charges comprends les objets suivants  :

Des processus 
Un processus est l'entité contrôlant et gérant l'exécution des programmes. Chaque processus est caractérisé par son contexte de fonctionnement, son flot d'exécution et son espace mémoire. Les processus ont chacun un espace mémoire et ne partagent ni code, ni données sauf sous requête explicite au noyau.
De la mémoire 
Le noyau dispose d'une plage de mémoire physique, qu'il n'occupe pas, dont il est libre d'utilisation. Cette mémoire sera utilisée pour allouer un espace à un processus de manière à loger son code et ses données. C'est au noyau d'assurer la gestion de l'espace mémoire d'un processus en utilisant cette mémoire physique et les mécanismes de mémoire virtuelle .
Des files de messages 
Une file de de message est un objet permettant la synchronisation entre des processus. C'est une restriction à des messages de taille fixe du pipe d'Unix.
Une horloge 
L'horloge permet au noyau de partager le temps d'utilisation du processeur entre des processus concurrents. Elle permet aussi à un processus de mesurer le temps écoulé pour un calcul ou d'attendre qu'un délai soit passé avant de reprendre son exécution.
Une console 
La console est un moyen d'interaction entre le système et l'utilisateur. Elle permet aux processus et au noyau d'afficher du texte et de recevoir ce que tape l'utilisateur au clavier.

Les extensions réalisées sont  :

Un système de fichier en mémoire 
Le système de fichier en mémoire permet la création/modification/suppression de fichier ainsi que leur organisation dans une arborescence avec des dossiers.
Un allocateur dynamique 
Les processus peuvent au moyen d'un appel système étendre leur mémoire disponible.
Terminal amélioré 
meilleure gestion du buffer clavier (flèches gauche/droite, insertion de caractère sur la ligne qu'écrit l'utilisateur, meilleur retour en arrière) - défilement haut/bas de l'écran avec PGUP/PGDOWN.
Un multiplexeur de terminaux 
L'utilisateur peut utiliser plusieurs terminaux.
Saut non local 
fonction pour sauter de manière non locale utile pour le rattrapage d'erreur notamment.
Portage de ed 
éditeur de texte ligne par ligne.

L'équipe

Dadoua Maxime : filière ISI

Plouvier Demets Jules-Eugène : filière ISI

Thiolliere Guillaume : filière ISI

Apport du projet

Le projet nous a permis de mettre en application les concepts vus en cours de système d’exploitation et programmation concurrente et de conception de système d’exploitation.

Gestion de projet

Outils de gestion de version

Nous avons utilisé git pendant toute la durée du projet. Nos commits sont clairs et précis, ce qui permet de voir facilement les modifications effectuées en utilisant gitk par exemple.

Organisation

L'équipe travaillait côte à côte à l’Ensimag la semaine de 9h à 17h. La communication au sein de l’équipe se fait directement et la communication avec les experts se fait selon leurs disponibilités pendant des plages horaires prédéfinies.

Une des difficultés du projet est de bien chercher dans la documentation et aussi de bien la comprendre. De ce fait, nous échangeons régulièrement sur ce que nous faisons pour être sûr d’être d’accord avec le reste de l’équipe. Nous avons donc toujours en tête l’ensemble du projet et ce sur quoi travaille chacun d’entre nous :

— Dès qu’un membre de l’équipe trouve un bug, il le partage avec le reste de l’équipe et s’il est trop difficile à corriger, nous le faisons à plusieurs.

— Dès qu’un membre finit une tâche, il en commence une nouvelle selon ce qu’il reste à faire et en informe le reste de l’équipe.

Du fait que nous sommes trois à conduire le projet, la prise de décision peut se faire en se concertant directement et avec l’accord de chaque membre. Nous n’avons donc pas eu besoin de définir de chef de projet.

Planning

Planning dadplothi.png


Phase 1

Prise en main de l'environnement de développement et gestion de l'affichage à l'écran.

Pas de difficulté, nous avons simplement adapté le code du projet système fait au 3e semestre.

Phase 2

Notion de processus et le changement de contexte entre deux processus.

Pas de difficulté majeure, nous avons adapté le code du projet système fait au 3e semestre à la spécification du projet.

Phase 3

Ordonnanceur : création dynamique, terminaison et filiation des processus.

La structure file de priorité nous a été donnée, il a fallu adapter le code du projet système du 3e semestre à la spécification.

Phase 4

Gestion de la communication et de l'endormissement des processus.

L'endormissement des processus ne pose pas de problèmes particuliers, il s'agit de reprendre ce qui a déjà été fait en PSE.

Les files de messages ne sont pas difficiles au niveau du code, mais la difficulté ici est de bien comprendre le spécification plutôt ambiguë. Il faut bien comprendre ce que signifie "immédiatement" pour être capable de passer tous les tests. Avec notre première implémentation, le test 13 était impossible, nous avons donc du reprendre notre code plus tard dans le projet.

Phase 5

Séparation des espaces mémoire du noyau et des processus et ajout du mode utilisateur.

C'est évidemment la phase la plus délicate du projet. Nous conseillons de la faire à 3, car il y a beaucoup de documentation (sur Ensiwiki ou ailleurs, notamment la doc Intel) à lire et à comprendre avant de se lancer dans le code. Il est fondamental de procéder par étapes incrémentales, et pour chaque étape de vérifier si on n'a rien oublié (en comparant avec la documentation).

Quelques pistes :

— Bien penser à sauvegarder les registres quand c'est nécessaire, à donner les bonnes valeurs à d'autres (les instructions IRET et INT ne s'occupent que de certains registres).

— Bien comprendre comment fonctionnnent INT et IRET.

— Du code précédemment écrit pour le traitement des interruptions peut nécessiter quelques modifications, là encore bien lire tous les docs qu'on peut trouver sur l'Ensiwiki.

Phase 6

Gestion du clavier (entrées/sorties).

La partie obligatoire de cette phase ne pose pas de soucis particuliers mais il faut comme toujours être vigilant et essayer tous les cas possibles et imaginables pour bien déboguer cette phase. Si on décide de rajouter des fonctionnalités (retour en arrière multiligne, flèches gauche/droite, insertion au milieu), cela se complique, nécessite beaucoup de tests supplémentaires et le débogage n'est pas toujours évident.

Phase 7

Gestion de l'interpréteur de commandes. Cette phase ne présente aucune difficulté particulière. Néanmoins en l'absence de malloc côté utilisateur il faut calibrer la taille des buffers.

Extensions

Malloc utilisateur: un allocateur dynamique était fourni dans l'archive de base, cet allocateur utilise l'appel système sbrk qu'il nous a donc fallu implémenter.

Setjump/longjump: le saut non local était utilisé par ed, on a donc implémenté ces fonctions pour le portage de ed.

Portage de ed: en plus des fonctions de saut non local il a fallu l'adapter pour notre système de fichier.

Système de fichier en mémoire: Relativement facile grâce à l'utilisation des hashmaps fournies avec le projet. Pour énumérer les fichiers et dossiers il a fallu créer un énumérateur sur les hashmaps.

Flèches, défilement de la console: L'utilisateur peut se déplacer à gauche ou à droite sur la ligne en cours d'écriture (une limitation est que cela est effectué au niveau du terminal et non côté application comme le shell par manque de temps pour implémenter cette fonctionnalité), insérer/supprimer des caractères au milieu, y compris des caractères spéciaux (de la forme ^C ou ^[[A par exemple).

Le défilement de la console s'effectue avec PGUP/PGDOWN et est utile pour certaines applications (comme le lecteur de fichier "reader"). Dès lors qu'un processus écrit ou qu'une touche du clavier est appuyée, on revient immédiatement à la position du curseur avant défilement.

Terminaux multiples: Assez simple à mettre en oeuvre mais très intéressant pour donner au système un fonctionnement "multi-tâche" (par exemple, on peut lancer les tests sur un terminal et écrire du texte sur un autre). Cette extension est compatible avec le défilement de la console implémenté précédemment.

Real time clock: On se contente de récupérer l'heure toutes les secondes du timer horloge. La doc et le code sont disponibles sur OSDev.

Température du CPU: Sur machine réelle, on affiche à côté de l'heure la température du CPU, elle est mise à jour toutes les secondes.

Captures d'écran

Démarrage

Capture d ecran dadplothi.png

Commandes du système de fichier

Memfs dadplothi.png

En plein défilement

Scrolling dadplothi.png