Projet système PC : 2010 - Damien Dejean et Gaetan Morin

De Ensiwiki
Révision de 15 juin 2010 à 21:57 par Moring (discussion | contributions) (Gestionnaire de fenêtres : typo)

Aller à : navigation, rechercher

Cette page présente brièvement le système d'exploitation XUNIL, réalisé par Damien Dejean et Gaëtan Morin dans le cadre du projet système sur PC.

Présentation:

Le projet de spécialité systèmes consiste à programmer un petit système d'exploitation. Un cahier des charges, fourni, nous donnait les fonctionnalités minimales à implémenter :

Gestion du matériel 
  • Affichage à l'écran
  • Lecture du clavier
Gestion des processus 
  • Création, lancement, arrêt de l'exécution des programmes
  • Ordonnancement (qui a le droit de s'exécuter et pour combien de temps)
Communication entre processus à l'aide de files de messages
  • Création/suppression
  • Déposer/retirer un message
Implémentation d'un shell
  • Commandes pour obtenir l'état du système (ps, pinfo)
  • Gestion des processus (lancement d'une application au premier ou en arrière plan, kill, ...)

Pour avoir plus de détails nous vous invitons à visiter la page officielle du projet sur laquelle le cahier des charges minimal est explicité.

A ce cahier des charges nous avons ajouté un ensemble de fonctionnalités:

  • Un pilote graphique plus avancé: VESA. C'est un standard implémenté dans toutes les cartes qui permet d'avoir une plus grande résolution que le mode texte de base et permet de dessiner des pixels de 256 à 16 millions de couleurs.
  • Un drivers de souris PS2.
  • Un drivers pour le haut parleur système.
  • Un gestionnaire de fenêtres: un programme qui permet à chaque processus d'avoir un endroit de l'écran, dans lequel dessiner des pixels ou présenter une interface, qui soit différent du terminal dans lequel il a été lancé. Ce programme s'appuie bien entendu sur le pilote VESA.

Illustration de nos extensions

VESA: le pilote graphique polyvalent

Comme première extension du projet, nous souhaitions réaliser un drivers pour la carte graphique. Nous avions alors le choix d'implémenter un drivers pour une carte spécifique (celle de la VirtualBox ou encore des machines de la salle) ou d'implémenter un drivers standard. Nous avons choisi cette seconde option et avons implémenté le standard VESA. Ce standard est une interface disponible sur un grand nombre de cartes graphiques et qui permet d'exploiter une grande résolution (si elle est supportée). Pour les connaisseurs, c'est ce qui permet à GRUB 2 d'afficher un menu ayant une résolution de plus de 80x25 caractères.

Notre noyau en mode vga classique.


La première difficulté à surmonter a été la configuration du mode VESA. Un mode de compatibilité du processeur (le mode réel) avec les anciennes générations qui est complètement différent du mode courant (le mode protégé). De plus il a fallu minimiser ces étapes de configuration car un passage en mode réel est quelque chose de coûteux, et tout ce qui est graphique ne supporte pas les délais (cf. module IUG en première année).

Dans un second temps il a fallu réadapter le sous-couches de la fonction printf pour pouvoir afficher du texte lorsque l'on est en mode VESA. Contrairement au mode VGA classique, il n'est pas possible d'afficher du texte directement à l'écran, il faut utiliser une police sous forme d'images. Nous sommes alors obligés de "dessiner" chacun des caractères.

Enfin, nous avons cherché à utiliser les modes les plus performants de VESA, de manière a pouvoir implémenter d'autres fonctionnalités par dessus ce drivers comme nous le verrons ensuite (le pilote utilise une grande plage de mémoire linéaire au lieu de devoir découper l'écran en petites zones de mémoires ce qui est plus rapide).

Notre noyau en mode VESA 1024x768x24.

Traitement des exceptions

L'environnement de développement que nous fourni l'école comprend un écran de débuggage qui permet de voir lorsque que le programme fait des fautes de pages, ou d'autres exceptions. Lors du passage en VESA cet écran ne s'affiche plus. Nous avons donc traité ces exceptions de manière à les rendre visibles en mode graphique, et à tuer à arrêter le programme fautif.

Pilote souris et haut parleurs

Après avoir écrit une partie du pilote VESA nous nous sommes dit qu'avoir une souris et éventuellement le haut parleur pourrait-être intéressant, nous avons donc implémenté un pilote pour la souris et le haut parleur système de manière à augmenter les possibilités d'implémentation.

Gestionnaire de fenêtres

A l'aide des différents pilotes que nous avons écrit, nous avons implémenté un gestionnaire de fenêtres. Il présente une fenêtre pour le terminal et les différentes fenêtres des applications. Ces fenêtres possède une barre avec un bouton quitter, et sont déplaçables à l'aide de la souris. Lorsque le système démarre vous pouvez lancer le gestionnaire puis le quitter ensuite en fermant le terminal.

Quelques fenêtres.

Le gestionnaire supporte également la superposition et la transparence des fenêtres, ce qui permet d'obtenir un contexte graphique agréable. Les actions de la souris et les applications sont coordonnées par un gestionnaire évènements qui se charge de bloquer les applications en attente de la souris et de leur distribuer les évènements de la dite souris lorsqu'elles sont concernées. Finalement, le gestionnaire de fenêtre propose une API minimale permettant d'utiliser ces fonctionnalités facilement dans de petites applications.

Applications

Le gestionnaire étant terminé nous avons réalisé quelques applications pour montrer l'interaction entre ces applications, le gestionnaire de fenêtres et le gestionnaire d'évènements (souris).

Affichage d'images 

pictures est une petite application qui permet d'afficher les quelques images contenus dans l'espace utilisateur à l'écran. Une difficulté rencontrée a d'ailleurs été d'arriver à faire tenir les images dans le noyau compte tenu du peu de place disponible.

Dessin

L'application canvas permet de dessiner des lignes de différentes couleurs dans la fenêtre.

Le gestionnaire et quelques applis.

Apports et difficultés

Le projet système nous a permis d'explorer en profondeur certains aspects de la programmation d'une machine et nous a ainsi apporté beaucoup. Voici quelques uns de ces apports

  • La rigueur et la conformité par rapport à un cahier des charges.
  • Lecture et compréhension d'une documentation.
  • Apprentissage des difficultés de la mise en application.

Nous avons également été confronté à certaines difficultés inhérente à la programmation de bas niveau:

  • Garder un code propre et modulaire.
  • Débuggage dans un environnement sans barrières (les "segmentations fault" peuvent être silencieuses par exemple).
  • Savoir prendre en compte tous les effets de bords de toutes les parties du noyau: parfois un bug survient dans votre terminal parce que le drivers graphique fait une corruption de mémoire par exemple.

De plus, l'obtention d'un affichage fluide dans le gestionnaire de fenêtre impose une réflexion sur la performance et les accès concurrents :

  • Dessiner dans des buffers séparés avant affichage.
  • Ne rafraichir l'écran que quand c'est nécessaire, et avec un intervalle de temps minimum entre chaque rafraichissement.
  • Protection du processus de rafraichissement et des structures du gestionnaire de fenêtre par des verrous (mutex).

Le binaire du noyau

A essayer sur VirtualBox (machines puissantes) ou sur machines réelles pour de meilleurs performances (cf. tutoriel du projet). Media:Kernel.bin.gz

Références

Documentations et sources empruntées

  • Documentation intel: [1]
  • OSDev.org
    • Pagination: [2]
    • Appels au BIOS: [3]
    • Driver souris PS2: [4]
    • Driver haut parleur système: [5]
  • Documentation VESA: [6]
  • Les structures de VESA ont été partiellement empruntées au noyau Linux (voir arch/x86/boot/vesa.h dans les sources du noyau)
  • Passage en mode réel: code emprunté à Simon Nieuviarts.
  • Tables de hashage du shell (implémentation performante inspirée de CPython2.6): [7]

Crédits images

Le gestionnaire de fenêtre et ses applications utilisent des images provenant de diverses sources :

  • Le pointeur de souris est issu du thème Bluecurve de Red Hat / Fedora Linux : [8]
  • Les images de l'application pictures proviennent des fonts d'écran de Ubuntu : [9]
  • Les commandes tree et ladybug utilisent des images libres de droits disponibles ici : [10]