Projet système PC : 2012 – Hicham COUCOU, Mathieu COUETTE et Antoine MACQUET

De Ensiwiki
Aller à : navigation, rechercher

Bienvenue dans la vitrine du Projet de Spécialité du groupe 12 composé de Hicham COUCOU, Mathieu COUETTE et Antoine MACQUET, tous trois étudiants en deuxième année à l'ENSIMAG (Grenoble INP) dans la filière SLE (Systèmes et Logiciels Embarqués). Cette vitrine va vous permettre de découvrir le petit système d'exploitation que nous avons créé et nommé CasablancaOS (by ONIX Corporation), il ne reste plus qu'à vous laisser guider...

ONIX Corporation
Logo1.png
développeur de CasablancaOS

Présentation

Nous avons débuté le Lundi 21 Mai 2012 le projet de spécialité de deuxième année commun à toutes les filières de l'ENSIMAG (Grenoble INP). Ce projet consiste en un travail d'équipe sur un sujet de notre choix durant une période d'environ un mois après laquelle nous présenterons notre travail face à un jury, en plus de proposer cette page Ensiwiki qui fait office de vitrine de présentation.
Nous avons choisi un projet système sur PC qui consiste donc en la réalisation d'un système d'exploitation simple : CasablancaOS. Certains objectifs nous ont été explicitement demandés d'atteindre, mais nous pouvons également aller plus loin en proposant des extensions. Ces extensions, c'est nous qui les choisissons.

L'équipe

Elle se compose de 3 membres provenant tous de la filière SLE (Systèmes et Logiciels Embarqués) de l'Ensimag:
N'hésitez pas à nous contacter si vous avez une question à propos de ce projet !

Motivations

Nous avons tous les trois décidé de choisir un sujet de projet de spécialité afin de mieux cerner le fonctionnement de base d'un système d'exploitation. En effet, de nos jours la majorité des gens en France sont équipés d'un ordinateur personnel ou professionnel et donc utilisent un système d'exploitation. Les plus connus sont Windows, MacOS et Linux, mais il en existe quantité d'autres.
Ce projet a donc un but pédagogique puisqu'il ne nous est pas demandé par un client mais par des enseignants qui vérifieront le fonctionnement de notre système en profondeur grâce à une batterie de tests impitoyables. Le bon fonctionnement de notre noyau sera la preuve de notre compréhension de son fonctionnement général.

Objectifs

Notre objectif est de créer un système d'exploitation simple et fonctionnel, ergonomique au possible.
Nous allons également programmer de façon à avoir un code propre, bien commenté et robuste, tout en étant le plus souple possible afin de pouvoir facilement débugger et revenir sur des points précédents en se souvenant facilement de leur fonctionnement.
Tout cela se faisant en équipe, nous voulons mettre tout en œuvre pour que la communication soit la meilleure possible et que nous nous partagions le travail afin d'être efficaces au maximum.


Conception du noyau

Le but du système d'exploitation est de faire le lien entre la couche matériel et la couche logiciel.
Celui-ci se compose d'une partie basique commune à tous les groupes participant au projet système, il s'agit de la base du noyau, ainsi qu'une série d'extensions :

Noyau de base

Le noyau est la partie du système d'exploitation qui synchronise tous les processus, assure leur bon fonctionnement, le partage des ressources et la communication entre eux. Un processus est une zone de mémoire exécutant un programme.
Le noyau de base doit tout d'abord permettre un affichage correct d'informations diverses, leur placement sur l'écran et leur défilement. Cela avait été fait lors du premier semestre en Pratique du Système, nous avons donc récupéré cette base de code, qui permettait également à plusieurs processus de se passer la main, et qui affichait une horloge (temps de fonctionnement du système). Cela impliquait la gestion d'interruptions ainsi que la mise en place d'un context switch basique.
Le contexte switch permet de basculer d'un processus à l'autre et est appelé par l'ordonnanceur. Ce dernier est donc l'outil qui permet d'orchestrer les processus.


Gestion des sémaphores

Gestion des sémaphores
Dining philosophers.png
5 philosophes mangent des pâtes

CasablancaOS est capable de créer plusieurs sémaphores et de les utiliser dans différents processus.


Pour illustrer cette performance, nous avons mis en place un test reproduisant le fameux problème du dîner des philosophes. La commande "tests" lance tous les tests que nous avions fait nous-même et démarre le dîner des philosophes en dernier, en la lançant vous pourrez voir que 5 philosophes peuvent manger en même temps sans se tirer dans les pattes.


Les enseignants ont également inséré un test de philosophes dans leur base de test que vous pouvez lancer en tapant "test". Celui-ci a été passé avec succès.


Pilote console

Afin d'interagir avec le système d'exploitation, nous avons réalisé une console qui se compose d'un pilote de lecture des entrées clavier et un pilote d'écriture pour la sortie à l'écran.
Les processus utilisateurs peuvent donc récupérer des chaînes de caractères entrées par le clavier à l'aide de la primitive cons_read, et afficher des lignes à l'écran à l'aide de la primitive cons_write.


Terminal

Le terminal, ou interpréteur de commande, représente l'interface textuelle utilisateur. Il doit être capable de traiter correctement une commande entrée par l'utilisateur afin d’exécuter une opération spécifique. S'il ne s'agit pas d'un opération valide, le terminal renvoie un message d'erreur dans le but de guider l'utilisateur.
Nous listons ci-dessous les commandes principales :
Commande Description

help [cmd]

Sans arguments, afficher les commandes possibles.Sinon affiche les détails sur la commande cmd.

chprio [pid] [prio]

Change la priorité du processus identifié par pid à la nouvelle priorité prio.

chconsole [pid] [console]

Change la console d’exécution d'un processus identifié par pid.

clear

Nettoie l'affichage.

sleep [sec]

Endore le processus pendant sec secondes.

date

Affiche la date et l'heure courante.

echo [on| off]

Active (on) ou désactive (off) l'affichage.

kill [pid]

Tue le processus identifié par son pid.

lspci

Liste tout le matériel PCI.

ps

Affiche les informations sur les processus présents.

sinfo

Affiche les informations sur les sémaphores actifs.

uptime

Affiche le temps total d'exécution du système.

play [num] - stop

Active ou désactive la musique. Num permet de sélectionner une musique.

ifconfig

Affiche l'adresse MAC de la carte réseau.

xset [on | off]

Active ou désactive le PC Speaker.



Extensions

Le système de base ne proposant que peu de fonctionnalités, nous avons eu le temps d'en proposer de nouvelles que nous avons choisies afin de rendre le système plus convivial.

Shell étendu

Les premières extensions se situent au niveau du shell qui comme nous l'avons dit précédemment est l'interface d'utilisation textuelle avec l'utilisateur ; améliorer cette interface permet directement à l'utilisateur de faire plus d'opérations.


Historique de commandes

Afin de faciliter l'utilisation du terminal, nous avons mis en place un gestionnaire d'historique de commande. Ainsi les dernières commandes entrées son enregistré et nous pouvons circuler parmi celles-ci à l'aide des touches flèches haut et bas.
Nous pouvons faire réapparaître une cinquantaine d'anciennes commandes, ce qui est largement suffisant pour notre système.


Date

Alors que nous n'affichions avant que le temps écoulé depuis le lancement du système, nous sommes maintenant également capables d'afficher la date et l'heure actuelles, données par le PC (RTC - Real time clock).
Ainsi la date et l'heure courante sont affichées dans la barre d'état en haut de la fenêtre.


Consoles Virtuelles

Pour un utilisateur, il est contraignant de ne pouvoir utiliser qu'un seul programme à la fois et de devoir le fermer pour en exécuter un nouveau. C'était le cas avec notre ancien shell, mais nous avons décidé d'implémenter simultanément 4 fenêtres de shell afin de pouvoir facilement passer d'un programme à un autre, d'un affichage à un autre, grâce aux touches F1, F2, F3 et F4. On sait toujours dans quel terminal on se trouve grâce à la barre du haut (où l'on voit également la date), et l'on peut activer le passage d'un terminal à un autre avec la souris grâce à la commande "boutons ON".
Nous avons de plus implémenté une fonction permettant de passer un processus d'une console à une autre.


Défilement

Avant, tout ce qui était affiché était perdu une fois que cela défilait hors de l'écran. Cela posait notamment un problème lorsqu'on affichait toutes les commandes avec "help" par exemple. C'est pourquoi, nous avons ajouté, pour chaque console virtuelle, une gestion de défilement de page permettant de défiler vers le haut pour revoir ce qui avait été affiché et ensuite revenir vers le bas à l'aide des touches pages haut et page bas. Si l'on se place en haut et que l'on commence à taper une commande, l'écran se replace automatiquement tout en bas.


PC Speaker

Le haut-parleur PC est le périphérique audio le plus primitif disponible sur les systèmes compatibles PC. Elle est caractérisée par des bips distinctifs de fréquences variables.
Les bips du PC SPEAKER dans notre système d'exploitation sont utilisés dans la gestion de l'historique des commandes (du clavier).On peut également les activer(désactiver) grâce à la commande xset on(off).


Carte Réseau

Affichage de l'adresse MAC via la commande ifconfig
Ifconfig.png

Nous avons implémenté un driver pour la carte réseau de la famille 8254x de controleur ethernet (intel PRO/1000 MT).


Dans un premier temps il fallait réussir à détecter le périphérique afin de récupérer l'adresse physique du périphérique et ainsi d'accéder aux différents registres de la carte.


Pour ce faire on s'est inspiré de la documentation officielle intel disponible ici. On a réussi à récupérer l'adresse MAC de notre machine virtuelle, mais après quelques tentatives infructueuse d'envois (ou de récéption) de données, on a décidé d'abandonner cette extension.


À noter que la récupération de l'adresse MAC n'est opérationnelle que sur la machine virtuelle.


PCI

Le système d'exploitation est une interface avec l'utilisateur, mais c'est aussi lui qui gère tous les périphériques. Et c'est aux concepteurs de savoir gérer ces périphériques, c'est pourquoi il peut être intéressant dans un premier temps d'afficher tous ceux qui ont été détectés.
Cela est maintenant possible grâce à la commande "lspci" qui affiche donc tous les périphériques du bus PCI.


Souris

Dans les tous premiers systèmes d'exploitation tout s'exécutait grâce à des lignes de commandes. L'invention de la souris a été une révolution dans l'ergonomie pour l'utilisateur.
Nous avons permis cette ergonomie, cette facilité d'utilisation en permettant de faire des copier-coller en sélectionnant du texte grâce à un glisser-déposer classique (avec le clic gauche) puis en faisant un clic droit.
Nous évoquions également précédemment la possiblité de passer d'un terminal à un autre en cliquant juste en-dessous des F1, F2, F3 ou F4 de la barre du haut après avoir autorisé l'utilisation des boutons. Et nous pouvons également cliquer sur l'heure pour afficher la position du curseur ; on peut ensuite réafficher l'heure en recliquant au même endroit.


Carte son

Nous avons implémenté un codec AC'97 permettant de gérer les sorties audio.


Nous avons choisi ce type de codec car la plupart des carte son son supporte ce driver, notamment la machine virtuel ainsi que les ordinateurs ENSIPSYS utilisé pour le test de notre système d'exploitation.
Actuellement, nous pouvons lire des musiques en stéréo à travers la machine virtuelle. À noter que ce driver n'est pas opérationnel pour les machines réels.
Le fonctionnement de ce driver est le suivant. Nous récupérons de la carte son l'adresse des ports de commandes entrée/sortie. À l'aide de ces adresses, nous sommes à même d'activer la sortie audio et d'envoyé à la carte l'adresse et la taille des données à lire. Lorsque le matériel à fini de lire ces données, il effectue une interruption afin d'informer le driver qu'il faut charger les données suivantes. Les données sont contenus dans une table, pour laquelle on récupère l'adresse des données suivantes à charger.
Afin de lancer une musique ou de stopper celle-ci, le terminal est composé de deux commande play et stop.


La transformation des musiques en des tables de données est effectué à l'aide de l'outils suivant Fichier:Convertisseur wav2c.tar.gz (inspiré des projets des années précédentes).


Extensions non finalisées

VESA

Onix imprecr.jpeg

Nous avons tenté d'implémenter l'affichage VESA mais nous avons connu plusieurs problèmes :


  • Tout d'abord il a été compliqué de comprendre la communication avec le BIOS et la récupération des différents modes
  • Une fois tous les modes récupérés sur la machine virtuelle nous avons eu du mal à afficher les pixels aux bons endroits avec les bonnes couleurs
  • Nous avons finalement réussi à afficher un réseau de Moire en 8 bits à une résolution de 1280x1024
  • Nous avons ensuite essayé d'afficher des images qui étaient sous forme de .h, ce que nous avons réussi à faire en 24 bits sur machine virtuelle, mais pas en 32 bits
  • Passés sur machine réelle, nous avons été incapables de récupérer les modes disponibles, donc impossible pour nous d'afficher quoi que ce soit


Pagination

Le mode de pagination utilisé est le mode 32-bit qui est sur 2 niveaux de page.Les registres utilisés pour la mise en place de la pagination sont le cr3 et cr0.
Toutes les allocations se faisaient dans le tas pour ne pas avoir de defauts de pages.
Afin de tester le fonctionnement de la pagination on a eu à implémenter la gestion des exceptions et des interruptions ,le chargement du Global descriptor table(GDT) et Interrupt descriptor table (IDT). Malheureusement l'activation de l'un (gestions des exceptions) empeche le bon fonctionnement de l'autre.


Système de fichiers virtuel

On a implémenté le système de fichiers virtuel (VFS) . En tant que tel, ce n'est ni une structure de données, ni un protocole de réseau. En fait, c'est juste une abstraction qui fournissent de nombreux systèmes d'exploitation aux applications .
On a réussi à se mettre sur la racine de notre système à son lancement et récupérer le répertoire principale . Il nous a manqué du temps pour implémenter le générateur de fichier qui va générer les fichiers(ou répertoires) au démarrage du système et les mettre dans le dossier de la racine .


Difficultés rencontrées

Ce projet nous a montré toutes les difficultés que peut croiser un concepteur de système d'exploitation.
Il faut déjà bien tout comprendre comment fonctionne le matériel pour pouvoir communiquer avec lui.
Nos moyens de tester se résument généralement à des tests unitaires (affichage à l'écran de valeurs utiles) ce qui est assez contraignant.
Nous avons beaucoup travaillé sur machine virtuelle et avons appris que celle-ci est bien accommodante par rapport aux machines réelles !

Bilan

Nous avons réussi à faire tout ce qui nous avait été imposé et tout cela passe tous les tests qui nous ont été fournis.
Nous avons réalisé de nombreuses extensions, dont certaines n'ont pu malheureusement être totalement finies, ou ne sont pas optimales faute de temps mais nous sommes heureux d'avoir pu toucher à tout ce que peut faire un système d'exploitation.
Notre groupe était soudé jusqu'au bout, sans rencontrer de problème humain (ne pas s'entendre, ne pas se comprendre) ; nous avons donc pu bien nous organiser et ce, dans la bonne humeur, ce qui permettait un environnement de travail optimal.

Liens utiles

Outils utilisés

  • VirtualBox
  • Éditeurs de texte : gedit, emacs, kate, vim
  • Outils de synchronisation : Mercurial