Projet système PC : 2010 - Damien Dejean et Gaetan Morin : Différence entre versions

De Ensiwiki
Aller à : navigation, rechercher
(Essayer le système)
 
(7 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
 
[[Catégorie:Projets de spécialité]]
 
[[Catégorie:Projets de spécialité]]
 +
Cette page présente brièvement le système d'exploitation XUNIL. Ce système a été réalisé par Damien Dejean et Gaëtan Morin dans le cadre du projet système sur PC 2010, encadré par [mailto:sebastien.viardot@grenoble-inp.fr Sébastien Viardot].
  
 
== Présentation: ==
 
== Présentation: ==
Ligne 52 : Ligne 53 :
 
[[Image:dejeand-moring-wm.png|300px|thumb|left|Quelques fenêtres.]]
 
[[Image:dejeand-moring-wm.png|300px|thumb|left|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.
+
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 ===
 
=== 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).  
 
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 :
 
;Affichage d'images :
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.
+
''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:
 
;Dessin:
Cette petite application permet de dessiner des lignes de différentes couleurs dans la fenêtre.
+
L'application ''canvas'' permet de dessiner des lignes de différentes couleurs dans la fenêtre.
  
 
[[Image:dejeand-moring-applis.png|300px|thumb|right|Le gestionnaire et quelques applis.]]
 
[[Image:dejeand-moring-applis.png|300px|thumb|right|Le gestionnaire et quelques applis.]]
Ligne 73 : Ligne 74 :
 
*Débuggage dans un environnement sans barrières (les "segmentations fault" peuvent être silencieuses par exemple).
 
*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.
 
*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 ==
 
== Le binaire du noyau ==
A essayer sur VirtualBox (machines puissantes) ou sur machines réelles pour de meilleurs performances (cf. tutoriel du projet).
+
A essayer sur VirtualBox (machines puissantes) ou sur machines réelles pour de meilleurs performances (cf. [[Projet système : environnement|tutoriel du projet]]).
 
[[Media:Kernel.bin.gz]]
 
[[Media:Kernel.bin.gz]]
  
== Documentations et sources empruntées ==
+
== Essayer le système ==
 +
 
 +
=== QEmu ==
 +
 
 +
* Installer QEmu
 +
 
 +
sudo apt-get install qemu qemu-kvm qemu-system
 +
 
 +
* Lancer le système
 +
 
 +
qemu-system-i386 -m 256 -kernel kernel.bin
 +
 
 +
(ou qemu, ou qemu-kvm)
 +
 
 +
=== Sur clé USB ===
 +
 
 +
* Installer le système sur une clé USB par exemple : [[Projet système : environnement|tutoriel du projet]]. Le binaire ci-dessus doit être décompressé (gunzip) et doit s'appeler « kernel.bin »
 +
* Booter sur la clé (F12 pendant le boot pour booter sur de l'USB sur une machine Dell)
 +
* Choisir « kernel.bin »
 +
 
 +
=== La suite dans tous les cas ===
 +
 
 +
* Un écran bleu s'affiche, ce n'est pas une erreur : appuyer sur 'i' pour continuer.
 +
* Lancer la commande « help » pour voir les commandes disponibles.
 +
* La commande « startwm » permet de passer en mode graphique.
 +
* Une fois en mode graphique, les commandes « ladybug », « canvas », « tree » et « pictures » montrent des jolies choses. À lancer avec un « & » pour garder la main dans le shell.
 +
 
 +
== Références ==
 +
 
 +
=== Documentations et sources empruntées ===
 
* Documentation intel: [http://www.intel.com/products/processor/manuals/]
 
* Documentation intel: [http://www.intel.com/products/processor/manuals/]
 
* OSDev.org
 
* OSDev.org
Ligne 89 : Ligne 124 :
 
* Passage en mode réel: code emprunté à Simon Nieuviarts.
 
* Passage en mode réel: code emprunté à Simon Nieuviarts.
 
* Tables de hashage du shell (implémentation performante inspirée de CPython2.6): [http://svn.python.org/view/python/trunk/Objects/dictobject.c]
 
* Tables de hashage du shell (implémentation performante inspirée de CPython2.6): [http://svn.python.org/view/python/trunk/Objects/dictobject.c]
 +
 +
=== 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 : [https://fedorahosted.org/bluecurve/]
 +
* Les images de l'application ''pictures'' proviennent des fonts d'écran de Ubuntu : [http://packages.ubuntu.com/lucid/all/ubuntu-wallpapers/download]
 +
* Les commandes ''tree'' et ''ladybug'' utilisent des images libres de droits disponibles ici : [http://www.lostgarden.com/2007/05/dancs-miraculously-flexible-game.html]

Version actuelle en date du 29 avril 2015 à 16:48

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

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

Essayer le système

= QEmu

  • Installer QEmu
sudo apt-get install qemu qemu-kvm qemu-system
  • Lancer le système
qemu-system-i386 -m 256 -kernel kernel.bin

(ou qemu, ou qemu-kvm)

Sur clé USB

  • Installer le système sur une clé USB par exemple : tutoriel du projet. Le binaire ci-dessus doit être décompressé (gunzip) et doit s'appeler « kernel.bin »
  • Booter sur la clé (F12 pendant le boot pour booter sur de l'USB sur une machine Dell)
  • Choisir « kernel.bin »

La suite dans tous les cas

  • Un écran bleu s'affiche, ce n'est pas une erreur : appuyer sur 'i' pour continuer.
  • Lancer la commande « help » pour voir les commandes disponibles.
  • La commande « startwm » permet de passer en mode graphique.
  • Une fois en mode graphique, les commandes « ladybug », « canvas », « tree » et « pictures » montrent des jolies choses. À lancer avec un « & » pour garder la main dans le shell.

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]