Projet système PC : 2013 - Romaric JODIN et Jeremie SIFFRE

De Ensiwiki
Aller à : navigation, rechercher


Cette page décrit de manière sommaire les fonctionnalités de notre système d'exploitation [OSsature].

Présentation

Le projet système

Le projet de spécialité "Projet Système PC" consiste en la réalisation d'un système d'exploitation minimal. Ce projet présente avant tout un objectif pédagogique. Un cahier des charges nous a donc été fourni à son commencement : Projet système.

L'équipe

L'équipe était composée de deux membres issus de filières différentes.

Réalisation

Vous trouverez ici détaillé point par point les éléments du projets réalisés.

Gestion de l'écran

Les fonctionnalités de l'écran ont été implémentées. Tout fonctionne correctement. Celui-ci était au final identique à l'écran implémenté lors du cours de Pratique du Système.

Gestion des processus

Nous avons réalisé l'ordonnanceur à priorités fixes suggéré par le sujet. Cet ordonnanceur peut rapidement conduire à des famines mais sa facilité d'implémentation présente un gros avantage (Il est aussi plus facile à tester).

Gestion des éléments de communication entre processus

File de messages

Nous avons réalisé les files de messages telles que définies dans la spécification du projet. Nous nous sommes de plus particulièrement intéressé à des scénarios non testés par les tests fournis par les encadrants :

  • Scénario dans le cas d'une suppression de file de messages
    • P1 : le processus créé une file de messages
    • P2 : le processus se bloque dans la file de messages
    • P1 : le processus supprime la file de messages
    • P3 : le processus crée une file de messages (qui peut, a priori, potentiellement avoir le même identifiant que la file précédemment créee)
    • P2 : le processus est réordonnancé après avoir été débloqué, et doit renvoyer une valeur négative
  • Scénario dans le cas d'un reset de la file de messages
    • P1 : le processus crée une file de messages
    • P2 : le processus se bloque dans la file de messages
    • P1 : le processus reset la file de messages
    • P3 : le processus se bloque dans la file de messages
    • P4 : le processus dépose un message dans la file
    • P3 : le processus est réordonnancé et récupère le message dans les conditions classiques
    • P2 : le processus est réordonnancé après avoir été débloqué, et doit renvoyer une valeur négative

Pages partagées

Nous avons réalisé les appels système permettant le partage de données entre processus via des pages partagées. Les spécifications de ses appels étaient les suivantes : Spécifications des pages partagées

Mémoire virtuelle

Afin que chaque processus ait l'impression de disposer de l'intégralité de la mémoire, nous avons mis en place le mécanisme de mémoire virtuelle qui n'était, cette année, plus facultatif. Cette phase a nécessité une documentation préalable, car celle-ci "interagissait" avec le matériel (plus particulièrement la MMU). C'est la phase qui nous a posé le plus de difficultés.

Mode Kernel/User

Cette phase est la phase délicate du projet et demande une certaine compréhension globale du fonctionnement des instructions assembleur "INT" et "IRET". En effet, on peut être rapidement amenés à faire n'importe quoi si ces aspects ne sont pas bien compris. L'objectif de cette phase étant de réaliser une bibliothèque d'appels systèmes pour le programmeur. Nous avons réalisé et testé cette phase, et nous avons protégé notre noyau.

Gestion du clavier

Nous avons complété les fonctions nécessaires afin de que le périphérique clavier soit opérationnel. Nous avons, par ailleurs, décidé de permettre de changer facilement la partie de gestion de l'écho, afin que le Shell et "l'éditeur de texte", implémenté en extension, ait un affichage et une gestion des entrés clavier différentes.

Extensions

Implémentation des sémaphores

En plus de l'implémentation des files de messages qui étaient obligatoires, nous avons implémenté les sémaphores et avons vérifié qu'elles passaient tous les tests fournis par les encadrants. Nous les avons d'ailleurs utilisées pour protéger l'écriture sur la console par les processus.

Gestionnaire de fichiers

Nous avons réalisé un système de fichier en nous inspirant de ceux existant.

Nous avons implémenté des commandes shell pour pouvoir effectuer des opérations sur ce système de gestion de fichiers. Nous pouvons ainsi utiliser les commandes ls, cat, touch, rm, mkdir, rmdir et cd.

De plus, nous fournissons aux programmeurs des appels systèmes nommés fopen, fclose, fwrite et fread pour qu'il puisse interagir avec les fichiers dans ses applications.

Afin de tester ces dernières fonctionnalités, nous avons décidé de placer l'affichage de la commande help dans un fichier que nous créons à l'aide d'une application à l'initialisation de notre kernel (celui ci est placé dans un répertoire nommé "help").

Mini éditeur de texte

Nous avons réalisé un éditeur de texte nommé "Edit" afin de pouvoir écrire dans un fichier préalablement crée avec la commande touch. Il est possible de se déplacer au sein de cet éditeur de texte à l'aide des flèches directionnelles et de quitter en sauvegardant en appuyant sur la touche "Echap".

Commandes Shell

Commande Description

nice (pid) (prio)

Modifie la priorité du processus identifié par pid en la remplaçant par prio.

clear

Nettoie l'écran.

kill (pid1|pid2|...)

Tue les processus de pid pid1, pid2, ...

ps

Affiche la liste des processus vivants ainsi que des informations.

sinfo

Affiche les informations sur les sémaphores actifs.

pinfo

Affiche les informations sur les files de messages actives.

exit

Quitte le Shell.

test (file_name)

Lance le test de nom file_name.

echo

Active ou Désactive l'affichage des entrées clavier dans la console.

ls

Liste les fichiers et répertoires du répertoire courant.

cd [dir_name | ..]

Permet de se déplacer dans le répertoire dir_name ou dans le répertoire parent si ".." ou à la racine si aucun argument.

mkdir (dir_name1 | dir_name2 | ...)

Crée les répertoires dir_name1, dir_name2, ...

rmdir (dir_name1 | dir_name2 | ...)

Supprime les répertoires dir_name1, dir_name2, ... si ils sont non vide.

touch (file_name1 | file_name2 | ...)

Crée les fichiers vide file_name1, file_name2, ...

rm (file_name1 | file_name2 | ...)

Supprime les fichiers file_name1, file_name2, ...

cat file_name

Affiche le contenu du fichier file_name.

edit file_name

Edite le fichier préalablement crée file_name avec l'éditeur de texte "Edit".

help

Affiche la liste des commandes avec une brève description.

A noter que notre shell comprend aussi les commandes de la forme "ls toto/tata". Nous avons réalisé pour ce faire un parsage des paramètres.

Allocateur mémoire pour les applications

Afin de pouvoir allouer dynamiquement de la mémoire en mode USER et donc au sein des applications, nous avons implémenté un appel système nommé sys_sbrk permettant d'agrandir le tas d'un processus.

Nous avons testé cet appel système en réalisant un paquetage nommé "readcmd" permettant de parser une ligne de commande et ainsi récupérer la commande et ses paramètres associés dans une structure adaptée.

Apports

Ce projet nous a permit de mettre en application tous les éléments très théoriques vues lors des cours de Pratique du Système de CSE et de SEPC.

Essayez notre noyau

Voici un lien pour télécharger le binaire de notre noyau :Média:ossature.tar.gz

Références

OSDev Site web sur la création, pas à pas, d'un OS.

TutoOS Autre site web sur la création d'un OS.

Projet Système Documentation de l'Ensiwiki.

wikibooks Informations sur les interruptions assembleur.