Projet système PC : 2013 - Quentin BOURGEOIS, Phuoc Steven NGUYEN et Yann SOUBEYRAND

De Ensiwiki
Aller à : navigation, rechercher


Cette page présente le système d'exploitation de Quentin Bourgeois, Phuoc Steven Nguyen et Yann Soubeyrand, nommé pysqOS pour les intimes.

Présentation

Présentation du projet

Le projet système est un projet de spécialité, projet que les élèves de l'Ensimag réalisent en fin de seconde année. Au cours de ce projet nous avons réalisé un système d'exploitation pour architecture Intel x86. Notre but était de faire un parallèle avec nos différents cours SEPC, CSE, Architecture Avancée, Réseau mais aussi de confronter nos idées/réalisations avec les systèmes déjà existant afin de mieux comprendre leur fonctionnement (Linux, Minix, *BSD), et non de réinventer la roue...

Présentation de l'équipe

Le trinôme est constitué d'éleves de la fillière ISI :

Réalisation

Le cahier des charges est découpé en 7 phases auquel nous avons ajouté quelques extensions...

Gestion de la console

Le principe était de permettre un affichage à l'écran en écrivant directement dans la mémoire vidéo. Ceci permet en autre d'afficher des caractères sur notre console. Cette étape a été principalement extraite de notre code de PSE.

Gestion des processus (un scheduler qui cri famine)

Dans cette partie nous avons mis en place tous l’environnement lié au processus. Le but principale était de pouvoir les créer de façon dynamique, cette partie a aussi était tirée de notre projet PSE. Nous avons en plus rajouté la filiation de processus ainsi que la gestion des états.

Nous avons ensuite rattaché notre système à l'horloge mais aussi mis en place la gestion des interruptions.

Enfin, nous avons implémenté un scheduler respectant le cahier des charges. Nous avons néanmoins mis en évidence une famine potentiel si un programme de priorité supérieur aux autres ne rend pas la main.

C'est fortement dommage car dans le cadre du projet de Pratique du Système, nous avons été amenés à réfléchir sur un ordonnanceur utilisant un système de quantums pour partager le temps processeur entre les différents processus.

IPC

Comme il était difficile en début de projet de paralléliser les tâches, nous avons implanté les files de messages qui étaient obligatoires mais aussi les sémaphores qui ne l'étaient pas.

Ceci nous permettait de pouvoir éventuellement utiliser des mutex dans une optique de portage de notre système vers la prise en charge de multi-processeur.

Pour l'implémentation des files de messages, nous choisi d'implanter un tampon circulaire doublement indexé (index de lecteur et index d'écriture). L'ensemble de nos files sont stockées dans une table de hashage performante empruntée à Mr. Damien Dejean.

Mémoire virtuelle et isolation

Ici nous avons implanté le mécanisme de mémoire virtuelle. Ainsi il est possible pour un programme de croire qu'il dispose de la totalité de l'espace mémoire adressable. Ensuite nous avons séparé l'espace kernel de l'espace utilisateur en donnant pour chaque processus une pile utilisable dans les deux modes et en gérant les différents niveaux de privilèges du processeur Intel.

Syscall

Suite à notre séparation kernel / user nous avons pu créer des processus utilisateurs. Pour leurs permettre d'utiliser les fonctions que nous avions implémentées dans notre kernel nous avons enveloppé chaqu'une d'elle dans un wrapper disponible depuis l'espace utilisateur. La générations de la tables des syscalls a été faite automatiquement grâce à un script Perl, le but étant d'automatiser l'ajout de nouveaux syscall.

Dans le but de gérer les erreurs et de ne pas mettre notre kernel dans des états non attendu, nous avons protégé nos fonctions système par des asserts ainsi qu'un vérification des paramètres utilisateurs dans les wrappers pour renvoyer un code d'erreur en cas d'échec prévisible coté kernel.

Il y a notamment une vérification sur les pointeurs que l'utilisateur envoie au kernel à travers les syscall afin d'éviter de faire faire au kernel des écritures non permises.

Pilote d'écran / clavier

Nous avons ici rendu interractif notre système d'exploitation en ajoutant les pilotes pour la gestion de l'écran et du clavier.

Shell

Enfin nous avons créé un interpréteur de commandes simple permettant de rendre utilisable notre système par tout le monde, car on aime tout le monde.

L'explication des commandes disponibles se trouve plus bas.

Tests

Nous avons passé l'ensemble des 20 tests de base fournis avec notre système. De plus nous avons écrit nos propres tests nous permettant de tester au fur et à mesure de notre évolution nos modules, principalement dans l'espace kernel.

Nous en avons aussi profité pour rajouter nos propres tests dans les programmes utilisateurs disponibles.

Extension

Bitmap

Nous avons mis en place un système flexible d'allocation d'identifiants entiers. Nous voulions faire une allocation des IDs toujours croissante avant de recycler les IDs libérés une fois l'identifiant maximal atteint. Nous avons implanté un module "bitmap" fortement inspiré de l'algorithme utilisé dans Linux. Cette astuce permet avec 1 bit par ID de calculer rapidement un nouvelle ID disponible.

Ainsi, l'allocation des PID, FID et d'autre on pu utiliser ce module.

Sémaphore

Comme indiqué dans la partie IPC nous avons implanté les sémaphores pour disposer d'un système de mutex mais aussi pour optimiser la répartition du travail.

Isolation kernel/user

Afin de rajouter une couche d'isolation nous avons implanté les fonctions copy_to_user, copy_from_user, srtlen_kernel, et access_ok. Ainsi chaque module utilise et traite les données dans des buffers situés dans l'espace mémoire dont il dépende. Le but était de se prémunir d'accès à des pages non allouées ou avec des droits non cohérents avec l'utilisation que nous voulions en faire.

PCI

Dans cette extension nous avons souhaité nous pencher un peu plus du coté du matériel. Le but était alors de détecter, enregistrer et gérer l'ensemble des périphériques connectés au bus PCI d'un ordinateur. Notre implémentation fournit une petite API utilisable pour un programmeur pour gérer ses pilotes.

Nous avons alors implanté la fonction lspci qui permet de lister l'ensemble du matériel PCI détecte. Cette fonction peut être appelée via la commande lspci du shell.

RTL 8139

Afin de faire un parallèle avec les cours de réseaux nous avons voulu implanter une API pour la gestion des interfaces réseaux ainsi que le driver d'une puce assez populaire la RTL 8139.

Pour la partie réseau nous avons implanté la gestion, l'enregistrement des interfaces réseaux, mais nous n'avons pas eu le temps d’intégrer la gestion des couches réseaux (TCP/IP stack).

Pour la carte RTL 8139 nous avons gérer la détection, l'initialisation ainsi que la gestion des interruptions. Néanmoins par manque de temps et de documentation nous n'avons pas pu finir le driver, il n'est pour l'instant pas garanti que la réception de message fonctionne. Néanmoins pour les buffers (émissions/réceptions), nous pensions à terme réutiliser les files de message que nous avons implantées.

Commandes

Voici la liste des commandes utilisable dans notre OS directement depuis le shell.

Command Abstract
lspci Liste l'ensemble des périphériques PCI détectés sur le PCI-BUS.
ifconfig Liste les interfaces réseaux détectées ainsi que leurs

configurations MAC.

clear Efface le contenu de l'écran.
echo Active/désactive l'écho des touches frappées au clavier.
uname Donne des informations sur le système.
exit Quitte la console. Le système est prêt à être éteint.
sinfo Affiche des informations sur les sémaphores du système. Donne

l'identifiant de la sémaphore, son compteur et la liste des pids des processus qui sont bloqués dessus.

ls Affiche la liste des programmes disponibles.
ps Liste les processus en donnant leur pid, leur nom et leur état.
start <nom_programme> Lance un programme.

Programmes intéressants

Ces programmes sont intéressants à essayer pour tester les différents modules :

  • demo_sem : un programme interactif pour tester l'utilisation des sémaphores,
  • demo_shm : un programme pour essayer les mémoires partagées.

Difficultés

Diffilcultés techniques

Des fois en programmation on fait des erreurs bêtes et on bloque longtemps...

Difficultés organisationnel

Mettre les partiels au milieu du projet de spé c'est pas fair ! De plus il est difficile de faire ce projet à trois, car le début du projet et non parrallélisable nous avons donc mis en place du "programming-pair" pour palier au mieux cela.

Apport

Comme dit, on a enfin pu mettre en pratique tout un tas de notions très théorique vu cette année dans les cours systèmes/hardware. Mais aussi décourverte de nouveaux aspect relatif au OS par la pratique, comme par exemple la TSS, la segmentation, ....

Try-me

Pour essayer notre kernel nous vous fournissons le binaire de celui ci Média:Psys_psyqos_kernel.tar.gz, have a lot fun !

Référence

Comme presque tous le monde nous avons trouver beaucoup d'information sur OS Dev

Des sites détaillant l'implémentation de petit kernel comme par exemple Tuto OS, James Molloy

Nous avons aussi chercher beaucoup d'information dans les dépots git des différents kernel de compet' princpalement git Linux et git Minix3 ainsi que les kernels des LSE STOS SIX.

Certain livre Operating System, Operating System Design and Implementation et aussi "Le noyau linux" - ISBN : 2-84177-243-8

Enfin et bien sur nos super cours de l'imag !