Ce projet a été réalisé à l'Ensimag, par Pierre-Yves DELAHAYE et Jie ZHANG, élèves de 2ème année (filière SLE), en juin 2010, sur une durée de 4 semaines.
Le travail, encadré par Grégory MOUNIE, consistait à développer un système d'exploitation pour PC.
Les objectifs du projet
A quoi sert un système d'exploitation ?
Tout ordinateur est doté d'un système d'exploitation, qu'il s'agisse de Windows, MacOS, Ubuntu, ... . Le système d'exploitation est en quelque sorte l'intermédiaire entre l'utilisateur, et l'ordinateur en lui-même, c'est-à-dire la partie matérielle qui le constitue. Le système d'exploitation (souvent appelé OS pour "Operating System"), va exploiter les ressources matérielles (mémoire, périphériques, ...) qui sont à disposition. Prenons un exemple simple, celui de l'enregistrement d'un fichier sur le disque dur. Lorsque l'utilisateur désire sauvegarder un document, le système d'exploitation va être chargé de déterminer un emplacement sur le disque dur pour y placer ce document. Autre exemple, la gestion de tâches multiples. Il faut savoir qu'un ordinateur ne sait faire qu'une seule chose à la fois. Or, sur n'importe quel ordinateur, plusieurs programmes peuvent fonctionner en même temps (naviguateur internet, lecteur audio, traitement de texte, ...). Il va donc falloir que le système d'exploitation alloue un temps d'utilisation du processeur pour chaque tâche en cours d'exécution.
Ce qui était demandé dans le cadre de ce projet
Les spécifications détaillées peuvent être consultées ici.
Donnons quand même quelques éléments clés du travail à effectuer.
Un système multi-tâches : comme nous l'avons vu en introduction, le système d'exploitation doit être capable de répartir le temps d'utilisation du processeur entre les différentes tâches en cours d'exécution. Cela implique notamment la mise en place d'une horloge capable de déterminer le temps écoulé depuis qu'une tâche a pris possession du processeur.
Un moyen de communication entre processus : les différentes tâches ou programmes en cours d'exécution sont appelés processus. Il nous était demandé de mettre en place des structures permettant aux processus de s'échanger des informations entre eux.
Restriction de l'accès aux ressources matérielles : afin de protéger l'ordinateur, il ne faut pas que l'utilisateur ait accès directement à l'ensemble de la mémoire, ou aux périphériques d'entrée/sortie. Il faut donc mettre en place un mode de fonctionnement protégé, accessible par l'utilisateur, appelé mode User, par opposition au mode Kernel qui aura accès à toutes les ressources, et qui sera appelé en cas de besoin par le mode User.
Une interface entre le système d'exploitation et l'utilisateur : le système d'exploitation doit être capable d'afficher des information à l'écran, et de lire, pour ensuite les traiter, des données saisies par l'utilisateur au clavier. Le dialogue entre l'utilisateur et le système d'exploitation se fera via un processus particulier, appelé shell.
Ce qui a été réalisé
Un système multi-tâches : l'exemple ci-dessous a été obtenu en lançant deux processus, dont l'un affiche test1, et l'autre tstA. On voit bien que le système alloue les ressources du processeur alternativement aux deux processus.
Un système d'exploitation multi-tâches
Un moyen de communication entre processus : notre système d'exploitation permet également aux processus de communiquer entre eux via des files de messages.
Restriction de l'accès aux ressources matérielles : nous avons commencé par développer le mode Kernel, puisque le mode User n'est en fait qu'une couche supplémentaire, qui accède au mode Kernel pour réaliser certaines opérations. Par rapport au jeu de tests que nous avons mis en place pour valider notre travail, le mode Kernel marche très bien. En revanche, le mode User n'est pas encore tout à fait au point, même si l'architecture générale est en place.
Pour la mise au point du mode User, nous nous sommes notamment aidés des informations fournies par le site de Arnauld Michelizza.
Une interface entre le système d'exploitation et l'utilisateur : comme nous pouvons le voir ci-dessous, nous pouvons interagir avec le système d'exploitation. Ici, la commande ps tapée par l'utilisateur doit afficher l'ensemble des processus en cours d'exécution. Nous n'avons pas eu le temps pour développer complètement cette commande, mais on constate bien que le système d'exploitation réagit aux informations fournies par l'utilisateur via le clavier.
Une interface utilisateur
Les difficultés rencontrées
La gestion du projet
Il n'est pas évident, surtout en début de projet, d'avoir une vision globale du travail à effectuer. Il n'est par conséquent pas toujours évident de répartir le travail à effectuer entre les différents membres de l'équipe.
Les outils de programmation utilisés
Nous l'avons déjà mentionné, un système d'exploitation agit directement sur la mémoire de l'ordinateur. Pour programmer un système d'exploitation, on utilise donc un langage appelé langage d'assemblage, qui permet d'agir directement au niveau de la mémoire. Mais l'utilisation de ce langage est relativement complexe, et nous manquions de connaissances sur sa mise en oeuvre.
Le mode User
La mise en place d'une couche supplémentaire, au-dessus du mode Kernel, appelée mode User, possède de nombreuses difficultés, parfois mises en évidence seulement lors des phases de tests, et il est difficile de localiser les erreurs commises.
Conclusion
Magré les difficultés évoquées, ce projet nous a semblé particulièrement intéressant à différents niveaux.
Un travail en autonomie : même si ce projet était encadré par un enseignant, l'objectif était que nous recherchions nous-mêmes les solutions aux difficultés rencontrées, parmi une quantité assez importante de documments qui nous étaient fournis, ces documents étant constitués notamment du manuel fourni par Intel pour l'utilisation de ses processeurs.
Une mise en application des connaissances acquises dans l'année : ce travail a été l'occasion pour nous de mettre en oeuvre des connaissances théoriques, parfois complexes, acquises dans l'année. Il s'agit donc d'un bon bilan sur une partie des connaissances que doit avoir un élève de notre filière, en fin de deuxième année.