Projet système PC : 2011 - Valentin Cheillon, Guillaume Touron, Bruno Wintenberger

De Ensiwiki
Aller à : navigation, rechercher


BogOS
BogOS.jpg


L'équipe

Nous sommes trois étudiants, tous en filière ISI:

Nous avons été encadrés pas Sébastien Viardot.

Spécifications minimales

Affichage de texte

L'affichage en noir et blanc c'est bien, les couleurs c'est mieux. Nous avons donc mis en place un système basé sur les printfs inspiré du driver ANSI (Exemple).

Détail des commandes :

Sequence Description

\033[cXX

Change la couleur du texte avec XX le code couleur décrit ci dessous

\033[fXX

Change la couleur du fond avec XX le code couleur décrit ci dessous

\033[pXX;YY

Positionne le curseur au coordonnées x,y

\033[AXX

Déplace le curseur de x lignes vers le haut

\033[BXX

Déplace le curseur de x lignes vers le bas

\033[CXX

Déplace le curseur de x colonnes vers la droite

\033[DXX

Déplace le curseur de x colonnes vers la gauche

\033[EXX

Efface et déplace le curseur de x colonnes vers la gauche

\033[s

Enregistre la position du curseur

\033[u

Place le curseur à la position enregistrée

L'interprète de commande

Afin d'obtenir un shell plus interactif, nous avons trouvé intéressant de pouvoir utiliser plus que les caractères affichable de la table ASCII. Pour faciliter l'édition des commandes nous avons offert les possiblités suivantes :

  • Suppression de caractères (avant le curseur avec la touche backspace, sur le curseur avec la touche suppr)
  • Déplacement dans la ligne en cours d'édition (touche gauche, droite, carriage return et end)
  • Gestion simpliste de l'historique des commandes (touche haut et bas)

Extensions

BGVirtual Memory

Le bogOS permet de mettre en place un mécanisme de mémoire virtuelle implémente matériellement par le mécanisme de pagination offert par les processeurs Intel. La mémoire virtuelle est une notion très importante dans les systèmes d'exploitation modernes et son implémentation est très intéressante d'un point de vue système car elle mêle un côté bas niveau (activation et modification des structures de pagination pour les processeurs Intel en assembleur) avec un coté plus haut niveau qui consiste à définir la politique de découpage mémoire, la gestion de l'allocation, le partage de ressources...

Avantages

  • les processus sont isolés et ne peuvent corrompre la mémoire d'un autre processus, cela permet donc au programmeur une abstraction supplémentaire qui aide à l'écriture des programmes.
  • les processus peuvent être chargés et linkés à une adresse virtuelle. De ce fait, les processus lourds sont compilés dans un fichier à part indépendamment du kernel et la mémoire virtuelle donne l'illusion au processus de s'executer à l'adresse définie au linking.
  • Le mécanisme est parfaitement compatible avec les processus légers et on peut méler processus lourds et processus légers tout comme sur linux!
  • cela permet d'allouer de la mémoire à la demande : quand un processus demande une zone mémoire dans le tas, l'allocation mémoire ne se fait que quand le processus utilise réellement la mémoire.
  • cela permet le partage de code tout en séparant les espaces virtuels, cela évite donc la recopie. Par exemple le code du noyau qui est commun à tout les processus est partagé et non dupliqué.
schéma correspondance adresse virtuelle - adresse physique

Si la gestion du disque avait été implémentée, nous aurions pu utiliser virtuellement plus de ram que nous n'en avions physiquement en écrivant des pages sur le disque (comme sur le schéma tiré de Wikipedia)

Etapes pour la réalisation de la pagination

  • définir son format de fichier allant contenir les binaires des processus lourds
  • pour ce format, coder un programme qui prend en argument les programmes et les transforme pour les mettre dans un unique fichier dans notre format personnel.
  • De manière symétrique, il faut coder un chargeur permettant de lire notre format de fichier pour pouvoir les executer.
  • Il faut modifier les scripts .lds du linker pour spécifier l'adresse virtuelle à laquelle charger les programmes (modifier user.lds) et aussi pour embarquer notre fichier special dans le binaire du kernel (modifier kernel.lds).
  • Definir deux nouvelles cartes mémoires (c'est à dire planifier le découpage des zones mémoires) : une carte virtuelle et une carte physique.
  • Pour l'allocation de pages physiques, définir un allocateur basé sur le découpage physique (attention, dans notre cas nous avons deux allocateurs physiques : un pour les pages d'usage général et l'autre pour les pages à usage interne dans les structures de pagination. Il est nécessaire de faire la distinction car les structures de pagination étant elles mêmes dans la mémoire, elles subiront la traduction d'adresse virtuelle vers adresse physique comme n'importe quelle adresse mémoire. Il faudra alors trouver un moyen de gérer cela, je ne spoil pas tout quand même sinon où est le plaisir de paginer !).
  • Pour l'allocation virtuelle, une modification de l'allocateur mémoire est nécessaire en mettant en place l'appel système sbrk pour augmenter la taille du tas d'un processus lourd
  • ajouter un champs à la structure des processus pour gérer leur espace virtuel
  • définir une fonction pour pouvoir mapper une adresse virtuelle physiquement (c'est à dire gérer les structures mémoires nécessaires à sa pagination, cf doc Intel)
  • définir toutes les fonctions liées à la libération de ressources ( aussi bien physiques que virtuelles!).
  • définir une fonction pour changer d'espace virtuel (changer cr3 et tss.cr3)
  • créer l'appel système startProcessus (char *nom,int prio) pour lancer un processus lourd!

Chargeur elf

La gestion des processus lourds oblige à définir un format de fichier prédéfini, le format d’exécutable classique est le format ELF. Nous avons intégré un chargeur ELF en provenance de http://a.michelizza.free.fr/Pepin/.

  • La gestion de ce format permet de linker un programme en donnant au linker un point d'entrée et ce dernier sera utilisé par notre chargeur.
  • Ce format permet aussi d'allouer à des endroits différents les différentes parties du binaire : par exemple le code peut être en 0x4000000 et les données en 0x8000000. Ceci est tout à fait standardisé et peut être configuré avec votre linker traditionnel.
format elf

BGWindow Manager

Driver Souris/PS2

Avant même d'afficher quoi que ce soit, nous avons commencer par écrire un driver de souris PS2 (Gestion des mouvements, de la roulette, des 3 boutons). Pour ceux-qui souhaitent tester il n'y a pas de problèmes sur machine réelle. En revanche pour ne pas perdre une heure sur VirtualBox, je vous signale qu'il vous faut décocher la case Activer un périphérique de pointage absolu dans Configuration/Système/Carte Mère.

Driver VESA

Nous pouvons déja faire de l'affichage mais la configuration actuelle ne gère que l'affichage de texte 50x25. Il nous faut dans un premier temps passer à une résolution plus grande où nous pouvons décider de la couleur de chaque pixel directement. Pour faire ce changement de mode d'affichage nous avons décidé d'utiliser le standard VESA et plus particulièrement VBE (VESA Bios Extension) qui permet de modifier le mode d'affichage de la carte Vidéo. VESA est un standard présent sur la majorité des cartes vidéos en revanche les modes disponibles diffèrent d'une carte à l'autre. Toutefois nous n'avons pas eu de problème lors de nos tests pour des affichages 800x600 16,7 Millions de couleurs ou 1024x768 16,7 Millions de couleurs.

Nous nous sommes appuyé sur la liste des fonctions associées à l'interruption BIOS 10h pour les appels BIOS, et sur les sources du noyau Linux contenus dans le dossier arch/x86/boot/ pour en vérifier notre compréhension.


Mode classique
Mode 1024x768

Primitives de Dessin

Loin des dessins de Polygônes et algorithme de Bresenham vu en IUG en première année, nous dessinons des rectangles uniquement. Dans un second temps nous implémentons un convertisseur BMP/tableau d'entier en C et une primitive qui permet de "coller" ces surfaces. De cette façon nous pouvons maintenant afficher du texte et des images.

Gestionnaire de fenêtres

On dessine la souris et les fenêtres, dans le temps imparti le changement de fenêtre active et le déplacement de fenêtre ont été implémentés. Comme un beau dessin vaut mieux qu'un long discours, ci-dessous un screenshot du gestionnaire de fenêtre du BogOS en action :

Windows Manager du BogOS

BGNetwork Manager

Le BogOS incorpore une gestion minimale de la carte réseau Intel 8254EM. Une micro-pile réseau a été implémentée afin de permettre au BogOS d'être visible sur le réseau en répondant aux requêtes ARP et ICMP (ping).

Pilote Intel 8254X

Avant de développer un pilote pour la carte, il a fallu d'abord en créer pour le bus PCI de la machine. Le but du pilote PCI est d'énumérer tous les périphériques connectés au bus afin de détecter la carte réseau et de récupérer les informations nécessaires à sa gestion (adresse du mapping, IRQ...) dans le PCI configuration space.

Fig.1: Initialisation PCI et 8254X

Une fois ces informations récupérées, la partie restante consistait à configurer la carte réseau conformément aux indications du manuel de la carte. Ce manuel étant très conséquent, l'exploration des sources du noyau Minix3 pour ce driver a été très utile. Au démarrage, BogOS initialise les registres de la carte, mappe la mémoire de la carte dans l'espace noyau et installe les traitants d'interruption. La carte a été configurée de façon à interrompre un programme utilisateur lors de la réception d'un paquet, ensuite celui-ci est traité selon sa nature.

Documentation officielle

Micro-pile réseau

ARP

Afin de pouvoir utiliser la carte, il est nécessaire d'implémenter un début de pile réseau. La première couche à implémenter correspond à la couche 2 du modèle OSI (couche liaison), où on retrouve le protocole ARP. Celui-ci permet à l'OS d'être visible sur le réseau en répondant aux requêtes ARP qui servent à établir les correspondances entre adresse IP et adresse MAC.

ICMP

Afin de rendre le BogOS encore plus visible sur le réseau, nous avons fait le choix d'implémenter la base du protocole ICMP afin qu'il puisse répondre aux PINGs. Comme le protocole ICMP (couche 4) travaille au dessus du protocole IP (couche 3), cela nécessite également l'implémentation d'une petite pile IP suffisante pour le fonctionnement des PINGs ICMP (figure 2).

Fig.2: Encapsulation des couches

InstantBogOS

Pour illustrer une utilisation côté utilisateur de la carte réseau, nous avons développé une petite application permettant à deux instances de BogOS de communiquer à travers le réseau. Le protocole de communication utilisé est une couche au dessus de l'Ethernet et permet de s'affranchir d'une gestion trop poussée du protocole IP.

Pour permette la programmation réseau côté utilisateur, deux primitives sont mises à disposition par la pile réseau:

Appel système Description

send_bogos_msg(unsigned char *msg)

Envoi d'un message

recv_bogos_msg(unsigned char *msg)

Recoit un message sur le réseau

Fig.3: InstantBogOS en action

Bilan du BGNetwork Manager

Cette extension était l'occasion de mêler réseau et système. La principale difficulté était le manque de documentation concernant le développement de pilote pour cette famille de carte. L'autre difficulté était la mise en place d'un environnement de test, il nous a fallu chercher comment configurer un réseau virtuel sous VirtualBox sans interférer avec le mécanisme de boot par PXE.

Outils

  • Mercurial : Gestionnaire de versions
  • Vim : Editeur de texte
  • Netbeans : Environnement de développement intégré (EDI)
  • gdb : Débugger
  • Virtual-Box : Logiciel de Virtualisation
  • [http;//www.apple.com/ Mac Book Pro] : Une bonne machine

Ressources

Binaires du noyau

Plusieurs version du noyau sont disponibles:

  • BogOS avec le Windows Manager

Fichier:WMkernel.bin.zip

  • BogOS avec le Network Manager

Client 1: Fichier:Kernelv1.tgz

Client 2: Fichier:Kernelv2.tgz

Il faudra configurer la première machine avec l'adresse MAC 08:00:27:AA:AA:AA et la seconde avec 08:00:27:BB:BB:BB et créer un réseau virtuel (réseau "interne") entre les machines. L'option "réseau interne" devra être modifié à la volée car le mode NAT est requis pour booter la machine avec PXE.

  • BogOS avec la mémoire virtuelle

Fichier:VMkernel.bin.zip