Projet système PC : 2011 - Mohamed Belasri, Mohamed Amine Moutachakkir, Mohamed Zaim Wadghiri

De Ensiwiki
Aller à : navigation, rechercher


OJOS
Ojos bl min.png

Développeurs Mohamed Belasri,
Mohamed Amine Moutachakkir,
Mohamed Zaim Wadghiri


Présentation du projet

Le projet système est un projet de spécialité proposé à la fin de la deuxième année à l'Ensimag. Le but est de concevoir un système d'exploitation qui respecte au début un cahier de charge minimaliste, et qui après, pourra avoir d'autres extensions le rendant plus ergonomique.

On peut faire une analogie entre un système d'exploitation et un arbitre, qui doit répartir les ressources entre différentes personnes, pour que tout le système fonctionne en parfaite harmonie. Un OS (Operating System) a alors un rôle d'allocation de ressources (mémoire, processeurs, ...) sur les différents périphériques (clavier, souris, moniteur, imprimante ...).

Vu la complexité de la conception d'un OS, l'équipe enseignante nous a fourni un cahier des charges minimaliste à remplir. Une fois ceci accompli, nous pourrions alors ajouter nos propres extensions.

Présentation de l'équipe

Notre équipe est constituée de :

Notre enseignant tuteur est : Simon NIEUVIARTS

Cahier des charges minimaliste

Affichage en mode texte, Timer et Clavier

Le projet Système peut être considéré comme une suite logique du cours de PSE (Pratique du système) qu'on a eu en premier semestre. En effet, on avait déjà réalisé à cette étape des primitives permettant d'imprimer des caractères sur l'écran, la gestion du PIT (Programmable Interval Timer) ainsi qu'un pilote de clavier minimal permettant de saisir directement sur l'écran en mode texte.

Gestion de processus

La première étape du projet était de réfléchir à l'implémentation de la notion de processus dans notre OS. Ceci a passé alors par l'allocation de la pile et puis par le changement de contexte qui représente la partie primordiale de cette étape. En premier temps, on avait deux processus s'échangeant explicitement la main. Ensuite, on a implémenté un ordonnanceur préemptif qui joue un rôle d'arbitre entre les différents processus et nous permet de réaliser du multitâche (i.e plusieurs processus s'exécutant simultanément). L'étape suivante consistait quant à elle, d'ajouter une bibliothèque permettant la synchronisation des différents processus à l'aide de sémaphores.

D'autre part, notre OS permet de gérer aussi la filiation des processus. Dans ce sens qu'on mémorise la hiérarchie de création des processus. De plus, on gère la terminaison des processus par différentes méthodes. En effet, un processus peut terminé soit de façon normale par un exit/return ou bien grâce à la commande kill qui l'interrompt et le libère sur le champ.

Du mode noyau vers le mode utilisateur

Le mode noyau n'offre pas de limites à l'utilisateur du système. Celui-ci peut par exemple accéder à n'importe quelle adresse dans la mémoire .. ce qui n'est pas toujours désirable. En effet, un utilisateur pourra modifier des données critiques du système soit de façon mal intentionnée ou bien par accident. Le mode utilisateur permet alors de protéger le système et de mette des restrictions sur les accès de l'utilisateur. Par contre, l'utilisateur peut bien demander des informations système dont il a besoin grâce à des appels système. Ce dernier déclenche une interruption (49 dans notre cas) pour passer au mode kernel et effectuer les opérations privilégiées qui ont été demandées par l'utilisateur.

Interprète de commandes

Une fois en mode user, nous avons réalisé un pilote de console pour implémenter un interprète de commandes à travers lequel l'utilisateur pourra communiquer avec le système.

Commande Signification

echo

  • Active/Désactive l'affichage de la saisie à l'écran.
  • Usage: echo <paramètre>
  • parametre: on  :: active l'écho, off :: désactive l'écho

exit / reboot

  • Renvoie le signal d'extinction et éteint le système.
  • Usage: exit ou reboot

ps

  • Affiche les différents informations (pid, père, prio, état, ...) de tous les processus lancés.
  • Usage: ps

kill

  • Met fin à un processus.
  • Usage: kill <parametre>
  • parametre est le pid du processus à tuer

sinfo

  • Affiche les informations à propos de tous les sémaphors utilisés dans le système
  • Usage: sinfo

sleep

  • Endormissement du shell pour une durée donnée
  • Usage: sleep <paramètre>
  • paramètre: durée en secondes de l'endormissement

clear

  • Efface l'écran
  • Usage: clear

test_proc

  • Lance la base de tests de l'OS
  • Usage: test_proc
OJOS en mode texte, exécutant le shell: pointeur de souris en vert, Date en haut

Extensions réalisées

Une fois le cahier des charges accompli, nous avons alors penser à ajouter des extensions pour rendre notre système plus agréable à utiliser.

Pilote de souris PS/2

Nous avons choisi tout d'abord d'implémenter un pilote de souris PS/2. Nous avons alors expérimenté le résultat en mode texte où on peut voir l'affichage du pointeur de souris en vert. Ceci est réalisé grâce à un traitant qui permet de récupérer le déplacement de la souris depuis le dernier événement. On transmet alors ces valeurs avec des facteurs multiplicateurs corrects pour pouvoir naviguer dans la fenêtre. Nous n'avons pas eu assez de temps pour afficher la souris même en mode graphique.

Pilote de carte graphique VESA

OJOS en mode graphique et gestionnaire de fenêtres

Cette extension nous a permis de passer au mode graphique qui est beaucoup plus agréable. On a communiqué avec VESA grâce à une bibliothèque d'appels BIOS qui permet de passer en mode réel implémentée par note tuteur Simon Nieuviarts. Le choix de VESA se justifie surtout par sa standardisation des résolutions, ce qui garantie une plus grande portabilité de notre OS. En ce qui nous concerne, on a utilisé le mode 0x118 permettant d'avoir une résolution 1024x768 avec une palette de couleurs sur 24 bits!

Pour permettre une meilleure performance à notre interface, nous avons choisi de faire un double buffer qu'on remplit avant de rafraîchir l'écran à chaque fois.


De plus, il est à noter qu'on a écrit notre propre police pour permettre l'affichage de texte sur l'écran. On s'est alors largement inspiré de la police crisp.

Window Manager

Shell en mode graphique

Une fois qu'on a passé au mode graphique, on a alors implémenté un gestionnaire de fenêtre. On maintient alors une file des différentes fenêtre et un pointeur vers la fenêtre courante pour pouvoir gérer la priorité d'affichage ainsi que leur déplacement. Ceci fait, on a alors pu avoir un nouveau shell dans le mode graphique beaucoup plus agréable que celui du mode texte !

Pour pouvoir afficher des images bitmap, on a utilisé un petit programme en java qui convertit une image BMP en une matrice de pixels. On copie alors au double buffer (ou bien du buffer de la fenêtre) cette matrice, qui ensuite, est copiée en mémoire graphique (commençant à l'adresse 0xA0000).


Pilote de carte son SoundBlaster 16

On a réalisé un pilote pour une carte son SoundBlaster 16. C'est le successeur du SoundBlaster Pro et permet de manipuler des échantillons audio codés sur 16 bits. Contrairement au cartes intégrées à la carte-mère (comme la AC'97 d'intel), la programmation d'un pilote pour une carte SoundBlaster 16 nécessite de controler à la fois le DMA (Direct Memory Access), qui va se charger d'envoyer les données du fichier son vers la carte, et le DSP (Digital Signal Processor) qui est un processeur intégré à la carte et spécialisé dans le traitement des signaux. On peut faire fonctionner la carte SoundBlaster 16 sous trois modes :

  • Direct Mode: C'est le mode le plus facile, où le processeur se charge lui même d'envoyer les données sonores à la carte.
  • Single Cycle Mode: On programme le DMA pour qu'il envoie un nombre déterminé d'octets à la carte son.
  • Auto Init Mode: Le DMA envoie les données du fichier son jusqu'à être interrompu par le processeur.

Les deux derniers modes ont l'avantage de ne pas toujours interrompre le processeur donc sont plus performants. On a réussit à utiliser le mode Single Cycle, et le passage au mode Auto Init devient alors plus facile mais on a pas eu le temps pour le faire. Au final, on arrivait à lire des fichiers audio de type WAV avec un codage de 8 bits, et on ajouter un musique lors du démarage de notre système.

Affichage de la date: Real Time Clock (RTC)

Comme on l'avait déjà précisé, on avait déjà implémenté en PSE la gestion du timer. Cependant, il est clair que l'affichage de la date avec l'heure en temps réel est plus intéressant ! On a alors récupéré les différentes valeurs (date et heure) par des appels BIOS sur l'interruption 0x1A, et ainsi affiché la date en temps réel en haut de l'écran (en mode texte ainsi qu'en mode graphique).

Bilan

Apports du projet

  • Mise en oeuvre des connaissances en SEPC, PSE et CSE.
  • Travail en équipe.
  • Réalisation d'une étude bibliographique conséquente (surtout en anglais !).
  • La joie de créer son noyau de système d'exploitation !

Difficultés rencontrées

  • Parallélisation du travail au début du projet. En effet, avant de nous lancer dans le projet chacun de son coté, on était obligé de commencer ensemble pour bien se mettre dans le climat du projet et pour être sûr que tous les membres aient compris ce qu'il faut faire dans ce projet.
  • Le débogage de certaines parties nous a pris beaucoup de temps (notamment, le passage vers le mode user).
  • Difficultés de trouver des documentations assez claires pour les extensions.

Outils Utilisés

  • VirtualBox: outil de virtualisation
  • Mercurial: gestionnaire de versions
  • Emacs, gedit: éditeur de code
  • Planner: éditeur de plannings
  • ddd: débogueur

Références

  • OsDev un Wiki et une grande communauté autour de la création d'OS
  • Interruption 0x1A un site expliquant les différentes fonctions qu'on passe à l'appel BIOS 0x1A
  • Monstersoft Un tutoriel sur le mode réel et l'utilisation de VESA
  • OsDever Une petite présentation sur le système de fenêtrage
  • Inversereality : Sound Blaster Tutoriel sur les différents modes de Sound Blaster 16

Image du noyau

Télécharger ojos: Média:Ojos.tar.gz